diff options
author | Ivan Yonchovski <yyoncho@users.noreply.github.com> | 2022-04-29 12:16:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-29 11:16:07 +0200 |
commit | e4a2c2d474f725b01acfa3a6169686f5e16f2ce9 (patch) | |
tree | b3afc59301ba5da1052ed8093543be581b5517fe | |
parent | 8bfc396a4dfa722239818f399a119452a53fe07f (diff) | |
download | Nim-e4a2c2d474f725b01acfa3a6169686f5e16f2ce9.tar.gz |
Make sure that field usage preserves the original line info (#19751)
Currently `struct.field` will generate a node with `info` that points to the symbol definition instead of having the actual node location.
-rw-r--r-- | compiler/semexprs.nim | 2 | ||||
-rw-r--r-- | nimsuggest/tests/tuse_structure.nim | 15 |
2 files changed, 17 insertions, 0 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 702b47929..b8742ff65 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1436,8 +1436,10 @@ proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = # is the access to a public field or in the same module or in a friend? markUsed(c, n[1].info, f) onUse(n[1].info, f) + let info = n[1].info n[0] = makeDeref(n[0]) n[1] = newSymNode(f) # we now have the correct field + n[1].info = info # preserve the original info n.typ = f.typ if check == nil: result = n diff --git a/nimsuggest/tests/tuse_structure.nim b/nimsuggest/tests/tuse_structure.nim new file mode 100644 index 000000000..f65ab9060 --- /dev/null +++ b/nimsuggest/tests/tuse_structure.nim @@ -0,0 +1,15 @@ +# tests for use and structures + +type + Foo* = ref object of RootObj + bar*: string + +proc test(f: Foo) = + echo f.#[!]#bar + +discard """ +$nimsuggest --tester $file +>use $1 +def skField tuse_structure.Foo.bar string $file 5 4 "" 100 +use skField tuse_structure.Foo.bar string $file 8 9 "" 100 +""" |