Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes nim-lang/nimsuggest#103 con dot exprs #16657

Merged
merged 1 commit into from
Jan 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/suggest.nim
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ proc suggestObject(c: PContext, n, f: PNode; info: TLineInfo, outputs: var Sugge
proc nameFits(c: PContext, s: PSym, n: PNode): bool =
var op = if n.kind in nkCallKinds: n[0] else: n
if op.kind in {nkOpenSymChoice, nkClosedSymChoice}: op = op[0]
if op.kind == nkDotExpr: op = op[1]
var opr: PIdent
case op.kind
of nkSym: opr = op.sym.name
Expand Down
34 changes: 32 additions & 2 deletions nimsuggest/tests/tcon1.nim
Original file line number Diff line number Diff line change
@@ -1,13 +1,43 @@
## Test Invocation `con`text in various situations

## various of this proc are used as the basis for these tests
proc test(s: string; a: int) = discard

## This overload should be used to ensure the lower airity `test` doesn't match
proc test(s: string; a: string, b: int) = discard

## similar signature but different name to ensure `con` doesn't get greedy
proc testB(a, b: string) = discard

# with a param already specified
test("hello here", #[!]#)

# as first param
testB(#[!]#

# dot expressions
"from behind".test(#[!]#

# two params matched, so disqualify the lower airity `test`
# TODO: this doesn't work, because dot exprs, overloads, etc aren't currently
# handled by suggest.suggestCall. sigmatch.partialMatch by way of
# sigmatch.matchesAux. Doesn't use the operand before the dot as part of
# the formal parameters. Changing this is tricky because it's used by
# the proper compilation sem pass and that's a big change all in one go.
"and again".test("more", #[!]#


discard """
$nimsuggest --tester $file
>con $1
con;;skProc;;tcon1.test;;proc (s: string, a: int);;$file;;1;;5;;"";;100
con;;skProc;;tcon1.test;;proc (s: string, a: int);;$file;;4;;5;;"";;100
con;;skProc;;tcon1.test;;proc (s: string, a: string, b: int);;$file;;7;;5;;"";;100
>con $2
con;;skProc;;tcon1.testB;;proc (a: string, b: string);;$file;;2;;5;;"";;100
con;;skProc;;tcon1.testB;;proc (a: string, b: string);;$file;;10;;5;;"";;100
>con $3
con;;skProc;;tcon1.test;;proc (s: string, a: string, b: int);;$file;;7;;5;;"";;100
con;;skProc;;tcon1.test;;proc (s: string, a: int);;$file;;4;;5;;"";;100
>con $4
con;;skProc;;tcon1.test;;proc (s: string, a: int);;$file;;4;;5;;"";;100
con;;skProc;;tcon1.test;;proc (s: string, a: string, b: int);;$file;;7;;5;;"";;100
"""