compiler/suggest: add variable support to con (#12569)

This allows for the type of a variable to be retrieved.
This commit is contained in:
alaviss
2019-11-04 17:29:26 +00:00
committed by Andreas Rumpf
parent ae32d637f7
commit 558ecd1ca6
2 changed files with 21 additions and 1 deletions

View File

@@ -293,7 +293,7 @@ proc suggestObject(c: PContext, n, f: PNode; info: TLineInfo, outputs: var Sugge
else: discard
proc nameFits(c: PContext, s: PSym, n: PNode): bool =
var op = n.sons[0]
var op = if n.kind in nkCallKinds: n.sons[0] else: n
if op.kind in {nkOpenSymChoice, nkClosedSymChoice}: op = op.sons[0]
var opr: PIdent
case op.kind
@@ -317,6 +317,10 @@ proc suggestCall(c: PContext, n, nOrig: PNode, outputs: var Suggestions) =
wholeSymTab(filterSym(it, nil, pm) and nameFits(c, it, n) and argsFit(c, it, n, nOrig),
ideCon)
proc suggestVar(c: PContext, n: PNode, outputs: var Suggestions) =
let info = n.info
wholeSymTab(nameFits(c, it, n), ideCon)
proc typeFits(c: PContext, s: PSym, firstArg: PType): bool {.inline.} =
if s.typ != nil and len(s.typ) > 1 and s.typ.sons[1] != nil:
# special rule: if system and some weird generic match via 'tyUntyped'
@@ -601,6 +605,10 @@ proc suggestExprNoCheck*(c: PContext, n: PNode) =
if x.kind == nkEmpty or x.typ == nil: break
addSon(a, x)
suggestCall(c, a, n, outputs)
elif n.kind in nkIdentKinds:
var x = safeSemExpr(c, n)
if x.kind == nkEmpty or x.typ == nil: x = n
suggestVar(c, x, outputs)
dec(c.compilesContextId)
if outputs.len > 0 and c.config.ideCmd in {ideSug, ideCon, ideDef}:

View File

@@ -0,0 +1,12 @@
let foo = "string"
var bar = "string"
bar#[!]#.add foo
bar.add foo#[!]#
discard """
$nimsuggest --tester $file
>con $1
con;;skVar;;tcon_variable.bar;;string;;$file;;2;;4;;"";;100
>con $2
con;;skLet;;tcon_variable.foo;;string;;$file;;1;;4;;"";;100
"""