improve --declaredLocs to help disambiguate types (generics, aliases etc) (#18389)
* improve --declaredlocs to help disambiguate types (generics, aliases etc) * avoid a cyclic deps * fix test after rebase
This commit is contained in:
parent
5a42f4a53e
commit
836b061ae3
8 changed files with 112 additions and 14 deletions
|
|
@ -395,7 +395,7 @@
|
||||||
|
|
||||||
## Compiler changes
|
## Compiler changes
|
||||||
|
|
||||||
- Added `--declaredlocs` to show symbol declaration location in messages.
|
- Added `--declaredLocs` to show symbol declaration location in messages.
|
||||||
|
|
||||||
- You can now enable/disable VM tracing in user code via `vmutils.vmTrace`.
|
- You can now enable/disable VM tracing in user code via `vmutils.vmTrace`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ proc addDeclaredLoc*(result: var string, conf: ConfigRef; typ: PType) =
|
||||||
# xxx figure out how to resolve `tyGenericParam`, e.g. for
|
# xxx figure out how to resolve `tyGenericParam`, e.g. for
|
||||||
# proc fn[T](a: T, b: T) = discard
|
# proc fn[T](a: T, b: T) = discard
|
||||||
# fn(1.1, "a")
|
# fn(1.1, "a")
|
||||||
let typ = typ.skipTypes(abstractInst + {tyStatic, tyUserTypeClassInst} - {tyRange})
|
let typ = typ.skipTypes(abstractInst + {tyStatic, tySequence, tyArray, tySet, tyUserTypeClassInst, tyVar, tyRef, tyPtr} - {tyRange})
|
||||||
result.add " [$1" % typ.kind.toHumanStr
|
result.add " [$1" % typ.kind.toHumanStr
|
||||||
if typ.sym != nil:
|
if typ.sym != nil:
|
||||||
result.add " declared in " & toFileLineCol(conf, typ.sym.info)
|
result.add " declared in " & toFileLineCol(conf, typ.sym.info)
|
||||||
|
|
|
||||||
|
|
@ -231,11 +231,10 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):
|
||||||
of kMissingParam: candidates.add("\n missing parameter: " & nameParam)
|
of kMissingParam: candidates.add("\n missing parameter: " & nameParam)
|
||||||
of kTypeMismatch, kVarNeeded:
|
of kTypeMismatch, kVarNeeded:
|
||||||
doAssert nArg != nil
|
doAssert nArg != nil
|
||||||
var wanted = err.firstMismatch.formal.typ
|
let wanted = err.firstMismatch.formal.typ
|
||||||
doAssert err.firstMismatch.formal != nil
|
doAssert err.firstMismatch.formal != nil
|
||||||
candidates.add("\n required type for " & nameParam & ": ")
|
candidates.add("\n required type for " & nameParam & ": ")
|
||||||
candidates.add typeToString(wanted)
|
candidates.addTypeDeclVerboseMaybe(c.config, wanted)
|
||||||
candidates.addDeclaredLocMaybe(c.config, wanted)
|
|
||||||
candidates.add "\n but expression '"
|
candidates.add "\n but expression '"
|
||||||
if err.firstMismatch.kind == kVarNeeded:
|
if err.firstMismatch.kind == kVarNeeded:
|
||||||
candidates.add renderNotLValue(nArg)
|
candidates.add renderNotLValue(nArg)
|
||||||
|
|
@ -243,9 +242,8 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):
|
||||||
else:
|
else:
|
||||||
candidates.add renderTree(nArg)
|
candidates.add renderTree(nArg)
|
||||||
candidates.add "' is of type: "
|
candidates.add "' is of type: "
|
||||||
var got = nArg.typ
|
let got = nArg.typ
|
||||||
candidates.add typeToString(got)
|
candidates.addTypeDeclVerboseMaybe(c.config, got)
|
||||||
candidates.addDeclaredLocMaybe(c.config, got)
|
|
||||||
doAssert wanted != nil
|
doAssert wanted != nil
|
||||||
if got != nil:
|
if got != nil:
|
||||||
if got.kind == tyProc and wanted.kind == tyProc:
|
if got.kind == tyProc and wanted.kind == tyProc:
|
||||||
|
|
@ -274,7 +272,7 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):
|
||||||
|
|
||||||
const
|
const
|
||||||
errTypeMismatch = "type mismatch: got <"
|
errTypeMismatch = "type mismatch: got <"
|
||||||
errButExpected = "but expected one of: "
|
errButExpected = "but expected one of:"
|
||||||
errUndeclaredField = "undeclared field: '$1'"
|
errUndeclaredField = "undeclared field: '$1'"
|
||||||
errUndeclaredRoutine = "attempting to call undeclared routine: '$1'"
|
errUndeclaredRoutine = "attempting to call undeclared routine: '$1'"
|
||||||
errBadRoutine = "attempting to call routine: '$1'$2"
|
errBadRoutine = "attempting to call routine: '$1'$2"
|
||||||
|
|
|
||||||
|
|
@ -988,7 +988,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags): PNode =
|
||||||
break
|
break
|
||||||
if not hasErrorType:
|
if not hasErrorType:
|
||||||
let typ = n[0].typ
|
let typ = n[0].typ
|
||||||
msg.add(">\nbut expected one of: \n" &
|
msg.add(">\nbut expected one of:\n" &
|
||||||
typeToString(typ))
|
typeToString(typ))
|
||||||
# prefer notin preferToResolveSymbols
|
# prefer notin preferToResolveSymbols
|
||||||
# t.sym != nil
|
# t.sym != nil
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,14 @@ type
|
||||||
pcmDifferentCallConv
|
pcmDifferentCallConv
|
||||||
|
|
||||||
proc typeToString*(typ: PType; prefer: TPreferedDesc = preferName): string
|
proc typeToString*(typ: PType; prefer: TPreferedDesc = preferName): string
|
||||||
|
|
||||||
|
proc addTypeDeclVerboseMaybe*(result: var string, conf: ConfigRef; typ: PType) =
|
||||||
|
if optDeclaredLocs in conf.globalOptions:
|
||||||
|
result.add typeToString(typ, preferMixed)
|
||||||
|
result.addDeclaredLoc(conf, typ)
|
||||||
|
else:
|
||||||
|
result.add typeToString(typ)
|
||||||
|
|
||||||
template `$`*(typ: PType): string = typeToString(typ)
|
template `$`*(typ: PType): string = typeToString(typ)
|
||||||
|
|
||||||
proc base*(t: PType): PType =
|
proc base*(t: PType): PType =
|
||||||
|
|
|
||||||
92
tests/errmsgs/tdeclaredlocs.nim
Normal file
92
tests/errmsgs/tdeclaredlocs.nim
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
discard """
|
||||||
|
action: reject
|
||||||
|
matrix: "--declaredLocs --hints:off"
|
||||||
|
nimoutFull: true
|
||||||
|
nimout: '''
|
||||||
|
tdeclaredlocs.nim(92, 3) Error: type mismatch: got <seq[MyInt2]>
|
||||||
|
but expected one of:
|
||||||
|
proc fn(a: Bam) [proc declared in tdeclaredlocs.nim(86, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: Bam [object declared in tdeclaredlocs.nim(78, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: Goo[MyInt2]) [proc declared in tdeclaredlocs.nim(89, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: Goo[MyInt2{char}] [object declared in tdeclaredlocs.nim(79, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: Goo[cint]) [proc declared in tdeclaredlocs.nim(88, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: Goo[cint{int32}] [object declared in tdeclaredlocs.nim(79, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: array[3, Bar]) [proc declared in tdeclaredlocs.nim(82, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: array[0..2, Bar] [object declared in tdeclaredlocs.nim(74, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: seq[Bar]) [proc declared in tdeclaredlocs.nim(81, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: seq[Bar] [object declared in tdeclaredlocs.nim(74, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: seq[MyInt1]) [proc declared in tdeclaredlocs.nim(80, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: seq[MyInt1{int}] [int declared in tdeclaredlocs.nim(72, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: set[Baz]) [proc declared in tdeclaredlocs.nim(84, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: set[Baz{enum}] [enum declared in tdeclaredlocs.nim(75, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: set[MyInt2]) [proc declared in tdeclaredlocs.nim(83, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: set[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: var SetBaz) [proc declared in tdeclaredlocs.nim(85, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: var SetBaz [enum declared in tdeclaredlocs.nim(75, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
proc fn(a: var ref ptr Bam) [proc declared in tdeclaredlocs.nim(87, 6)]
|
||||||
|
first type mismatch at position: 1
|
||||||
|
required type for a: var ref ptr Bam [object declared in tdeclaredlocs.nim(78, 3)]
|
||||||
|
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
|
||||||
|
|
||||||
|
expression: fn(a)
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
#[
|
||||||
|
see also: tests/errmsgs/tsigmatch.nim
|
||||||
|
]#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# line 70
|
||||||
|
type
|
||||||
|
MyInt1 = int
|
||||||
|
MyInt2 = char
|
||||||
|
Bar = object
|
||||||
|
Baz = enum k0, k1
|
||||||
|
Baz2 = Baz
|
||||||
|
SetBaz = set[Baz2]
|
||||||
|
Bam = ref object
|
||||||
|
Goo[T] = object
|
||||||
|
proc fn(a: seq[MyInt1]) = discard
|
||||||
|
proc fn(a: seq[Bar]) = discard
|
||||||
|
proc fn(a: array[3, Bar]) = discard
|
||||||
|
proc fn(a: set[MyInt2]) = discard
|
||||||
|
proc fn(a: set[Baz]) = discard
|
||||||
|
proc fn(a: var SetBaz) = discard
|
||||||
|
proc fn(a: Bam) = discard
|
||||||
|
proc fn(a: var ref ptr Bam) = discard
|
||||||
|
proc fn(a: Goo[cint]) = discard
|
||||||
|
proc fn(a: Goo[MyInt2]) = discard
|
||||||
|
|
||||||
|
var a: seq[MyInt2]
|
||||||
|
fn(a)
|
||||||
|
|
@ -89,9 +89,9 @@ expression: fun1(default(Mystring), "asdf")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[
|
||||||
|
see also: tests/errmsgs/tdeclaredlocs.nim
|
||||||
|
]#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue