summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2017-01-26 23:23:40 +0100
committerAndreas Rumpf <rumpf_a@web.de>2017-01-26 23:23:40 +0100
commit0b93db5a7cf85ae9b736538de7c2c880203a34a9 (patch)
tree934db1ea36078e1a12dba3ba9ef8f14fc1f33207
parentca0b16fd337d15abd2ea873a06dbca85777d886e (diff)
downloadNim-0b93db5a7cf85ae9b736538de7c2c880203a34a9.tar.gz
fixes nimsuggest issue #44
-rw-r--r--compiler/suggest.nim8
-rw-r--r--tools/nimsuggest/tests/tno_deref.nim14
2 files changed, 19 insertions, 3 deletions
diff --git a/compiler/suggest.nim b/compiler/suggest.nim
index 958dfe50e..f3c03d680 100644
--- a/compiler/suggest.nim
+++ b/compiler/suggest.nim
@@ -268,6 +268,7 @@ proc suggestFieldAccess(c: PContext, n: PNode, outputs: var int) =
       t = t.sons[0]
     suggestOperations(c, n, typ, outputs)
   else:
+    let orig = skipTypes(typ, {tyGenericInst, tyAlias})
     typ = skipTypes(typ, {tyGenericInst, tyVar, tyPtr, tyRef, tyAlias})
     if typ.kind == tyObject:
       var t = typ
@@ -275,11 +276,10 @@ proc suggestFieldAccess(c: PContext, n: PNode, outputs: var int) =
         suggestObject(c, t.n, outputs)
         if t.sons[0] == nil: break
         t = skipTypes(t.sons[0], skipPtrs)
-      suggestOperations(c, n, typ, outputs)
     elif typ.kind == tyTuple and typ.n != nil:
       suggestSymList(c, typ.n, outputs)
-      suggestOperations(c, n, typ, outputs)
-    else:
+    suggestOperations(c, n, orig, outputs)
+    if typ != orig:
       suggestOperations(c, n, typ, outputs)
 
 type
@@ -331,6 +331,8 @@ when defined(nimsuggest):
     info.fileIndex + info.line.int64 shl 32 + info.col.int64 shl 48
 
   proc addNoDup(s: PSym; info: TLineInfo) =
+    # ensure nothing gets too slow:
+    if s.allUsages.len > 500: return
     let infoAsInt = info.infoToInt
     for infoB in s.allUsages:
       if infoB.infoToInt == infoAsInt: return
diff --git a/tools/nimsuggest/tests/tno_deref.nim b/tools/nimsuggest/tests/tno_deref.nim
new file mode 100644
index 000000000..0f8ba3bd8
--- /dev/null
+++ b/tools/nimsuggest/tests/tno_deref.nim
@@ -0,0 +1,14 @@
+
+var x: ptr int
+
+proc foo(y: ptr int) =
+    discard
+
+x.#[!]#
+
+discard """
+$nimsuggest --tester $file
+>sug $1
+sug;;skProc;;tno_deref.foo;;proc (y: ptr int)*;;$file;;4;;5;;"";;100
+*
+"""