diff options
author | metagn <metagngn@gmail.com> | 2024-09-09 10:50:45 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-09 09:50:45 +0200 |
commit | f223f016f35af0e32252560ad650c04a81a102ee (patch) | |
tree | 67bca40e1688301aeb3bae1e22555b5fffba78ff /compiler | |
parent | 7de4ace94908f515a98fbe6f3a4a022b6fa9e3f8 (diff) | |
download | Nim-f223f016f35af0e32252560ad650c04a81a102ee.tar.gz |
show symchoices as ambiguous in overload type mismatches (#24077)
fixes #23397 All ambiguous symbols generate symchoices for call arguments since #23123. So, if a type mismatch receives a symchoice node for an argument, we now treat it as an ambiguous identifier and list the ambiguous symbols in the error message.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/lookups.nim | 28 | ||||
-rw-r--r-- | compiler/semcall.nim | 8 |
2 files changed, 27 insertions, 9 deletions
diff --git a/compiler/lookups.nim b/compiler/lookups.nim index 0e576d765..2a48f6349 100644 --- a/compiler/lookups.nim +++ b/compiler/lookups.nim @@ -563,23 +563,33 @@ proc errorUseQualifier*(c: PContext; info: TLineInfo; s: PSym) = var amb: bool = false discard errorUseQualifier(c, info, s, amb) -proc errorUseQualifier*(c: PContext; info: TLineInfo; candidates: seq[PSym]; prefix = "use one of") = - var err = "ambiguous identifier: '" & candidates[0].name.s & "'" +proc ambiguousIdentifierMsg*(candidates: seq[PSym], prefix = "use one of", indent = 0): string = + result = "" + for i in 0 ..< indent: + result.add(' ') + result.add "ambiguous identifier: '" & candidates[0].name.s & "'" var i = 0 for candidate in candidates: - if i == 0: err.add " -- $1 the following:\n" % prefix - else: err.add "\n" - err.add " " & candidate.owner.name.s & "." & candidate.name.s - err.add ": " & typeToString(candidate.typ) + if i == 0: result.add " -- $1 the following:\n" % prefix + else: result.add "\n" + for i in 0 ..< indent: + result.add(' ') + result.add " " & candidate.owner.name.s & "." & candidate.name.s + result.add ": " & typeToString(candidate.typ) inc i - localError(c.config, info, errGenerated, err) -proc errorUseQualifier*(c: PContext; info:TLineInfo; choices: PNode) = +proc errorUseQualifier*(c: PContext; info: TLineInfo; candidates: seq[PSym]) = + localError(c.config, info, errGenerated, ambiguousIdentifierMsg(candidates)) + +proc ambiguousIdentifierMsg*(choices: PNode, indent = 0): string = var candidates = newSeq[PSym](choices.len) let prefix = if choices[0].typ.kind != tyProc: "use one of" else: "you need a helper proc to disambiguate" for i, n in choices: candidates[i] = n.sym - errorUseQualifier(c, info, candidates, prefix) + result = ambiguousIdentifierMsg(candidates, prefix, indent) + +proc errorUseQualifier*(c: PContext; info:TLineInfo; choices: PNode) = + localError(c.config, info, errGenerated, ambiguousIdentifierMsg(choices)) proc errorUndeclaredIdentifier*(c: PContext; info: TLineInfo; name: string, extra = "") = var err: string diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 06dd09b69..b81bc2a63 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -285,6 +285,8 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors): candidates.add "\n" of kTypeMismatch: doAssert nArg != nil + if nArg.kind in nkSymChoices: + candidates.add ambiguousIdentifierMsg(nArg, indent = 2) let wanted = err.firstMismatch.formal.typ doAssert err.firstMismatch.formal != nil doAssert wanted != nil @@ -317,6 +319,9 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors): candidates.add renderTree(arg) candidates.add "' of type: " candidates.addTypeDeclVerboseMaybe(c.config, got) + if nArg.kind in nkSymChoices: + candidates.add "\n" + candidates.add ambiguousIdentifierMsg(nArg, indent = 2) if got != nil and got.kind == tyProc and wanted.kind == tyProc: # These are proc mismatches so, # add the extra explict detail of the mismatch @@ -370,6 +375,9 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors): candidates.add "' is of type: " let got = arg.typ candidates.addTypeDeclVerboseMaybe(c.config, got) + if arg.kind in nkSymChoices: + candidates.add "\n" + candidates.add ambiguousIdentifierMsg(arg, indent = 2) doAssert wanted != nil if got != nil: if got.kind == tyProc and wanted.kind == tyProc: |