From 5ffd507014723fac0a9f58ed7a2eef896068ea5f Mon Sep 17 00:00:00 2001 From: Jake Leahy Date: Mon, 10 Jul 2023 16:34:10 +1000 Subject: [PATCH] Fix nimsuggest not showing suggestions for imported tuples (#22241) * Add tests Also test if exported all tuple fields works. This seems like a hacky solution so will try and dive further to find a better solution * Always suggest tuple fields if it passes the filter If the tuple we are accessing is in scope then all the fields will also be in scope * Update tests so line numbers are correct (cherry picked from commit 1b132ddaa2734fc43a9c172407fc968cfeec4a24) --- compiler/suggest.nim | 10 +++++++++- nimsuggest/tests/module_20265.nim | 6 ++++++ nimsuggest/tests/t20265_1.nim | 8 ++++++++ nimsuggest/tests/t20265_2.nim | 8 ++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 nimsuggest/tests/module_20265.nim create mode 100644 nimsuggest/tests/t20265_1.nim create mode 100644 nimsuggest/tests/t20265_2.nim diff --git a/compiler/suggest.nim b/compiler/suggest.nim index 4989d50565..0db48b74f5 100644 --- a/compiler/suggest.nim +++ b/compiler/suggest.nim @@ -439,7 +439,15 @@ proc suggestFieldAccess(c: PContext, n, field: PNode, outputs: var Suggestions) if t[0] == nil: break t = skipTypes(t[0], skipPtrs) elif typ.kind == tyTuple and typ.n != nil: - suggestSymList(c, typ.n, field, n.info, outputs) + # All tuple fields are in scope + # So go through each field and add it to the suggestions (If it passes the filter) + for node in typ.n: + if node.kind == nkSym: + let s = node.sym + var pm: PrefixMatch + if filterSym(s, field, pm): + outputs.add(symToSuggest(c.graph, s, isLocal=true, ideSug, n.info, + s.getQuality, pm, c.inTypeContext > 0, 0)) suggestOperations(c, n, field, orig, outputs) if typ != orig: diff --git a/nimsuggest/tests/module_20265.nim b/nimsuggest/tests/module_20265.nim new file mode 100644 index 0000000000..24b7d10c93 --- /dev/null +++ b/nimsuggest/tests/module_20265.nim @@ -0,0 +1,6 @@ +type A* = tuple + a: int + b: int + +var x*: A = (a: 2, b: 10) +var y* = (a: 2, b: 10) diff --git a/nimsuggest/tests/t20265_1.nim b/nimsuggest/tests/t20265_1.nim new file mode 100644 index 0000000000..553b3d5451 --- /dev/null +++ b/nimsuggest/tests/t20265_1.nim @@ -0,0 +1,8 @@ +discard """ +$nimsuggest --tester $file +>sug $1 +sug;;skField;;a;;int;;*module_20265.nim;;6;;10;;"";;100;;None +sug;;skField;;b;;int;;*module_20265.nim;;6;;16;;"";;100;;None +""" +import module_20265 +y.#[!]# diff --git a/nimsuggest/tests/t20265_2.nim b/nimsuggest/tests/t20265_2.nim new file mode 100644 index 0000000000..33edf2d9ad --- /dev/null +++ b/nimsuggest/tests/t20265_2.nim @@ -0,0 +1,8 @@ +discard """ +$nimsuggest --tester $file +>sug $1 +sug;;skField;;a;;int;;*module_20265.nim;;2;;2;;"";;100;;None +sug;;skField;;b;;int;;*module_20265.nim;;3;;2;;"";;100;;None +""" +import module_20265 +x.#[!]#