summary refs log tree commit diff stats
diff options
context:
space:
mode:
authoralaviss <alaviss@users.noreply.github.com>2018-12-26 03:08:16 +0700
committerAndreas Rumpf <rumpf_a@web.de>2018-12-25 21:08:16 +0100
commit58d293d6a98b56ed4b309491f09492618c3fa9ec (patch)
treee1cbc7e32ebbd80342056afabd1eda9c35d5f49b
parent5f2b66751ac0a3115e6b4760f067332e80264195 (diff)
downloadNim-58d293d6a98b56ed4b309491f09492618c3fa9ec.tar.gz
fixes nim-lang/nimsuggest#76 (#10093)
* nimsuggest: prevent out-of-bound access

* fixes nim-lang/nimsuggest#76

* undo tester changes
-rw-r--r--compiler/semstmts.nim12
-rw-r--r--nimsuggest/nimsuggest.nim4
-rw-r--r--nimsuggest/tests/ttype_highlight.nim28
3 files changed, 41 insertions, 3 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 4b714e1f3..9016fed2b 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -315,7 +315,17 @@ proc semIdentDef(c: PContext, n: PNode, kind: TSymKind): PSym =
     result = semIdentWithPragma(c, kind, n, {})
     if result.owner.kind == skModule:
       incl(result.flags, sfGlobal)
-  suggestSym(c.config, n.info, result, c.graph.usageSym)
+  let info = case n.kind
+             of nkPostfix:
+               n.sons[1].info
+             of nkPragmaExpr:
+               if n.sons[0].kind == nkPostfix:
+                 n.sons[0].sons[1].info
+               else:
+                 n.sons[0].info
+             else:
+               n.info
+  suggestSym(c.config, info, result, c.graph.usageSym)
 
 proc checkNilable(c: PContext; v: PSym) =
   if {sfGlobal, sfImportC} * v.flags == {sfGlobal} and
diff --git a/nimsuggest/nimsuggest.nim b/nimsuggest/nimsuggest.nim
index c8c6101d7..c24a8bafa 100644
--- a/nimsuggest/nimsuggest.nim
+++ b/nimsuggest/nimsuggest.nim
@@ -99,7 +99,7 @@ type
 proc parseQuoted(cmd: string; outp: var string; start: int): int =
   var i = start
   i += skipWhitespace(cmd, i)
-  if cmd[i] == '"':
+  if i < cmd.len and cmd[i] == '"':
     i += parseUntil(cmd, outp, '"', i+1)+2
   else:
     i += parseUntil(cmd, outp, seps, i)
@@ -428,7 +428,7 @@ proc execCmd(cmd: string; graph: ModuleGraph; cachedMsgs: CachedMsgs) =
   var dirtyfile = ""
   var orig = ""
   i = parseQuoted(cmd, orig, i)
-  if cmd[i] == ';':
+  if i < cmd.len and cmd[i] == ';':
     i = parseQuoted(cmd, dirtyfile, i+1)
   i += skipWhile(cmd, seps, i)
   var line = -1
diff --git a/nimsuggest/tests/ttype_highlight.nim b/nimsuggest/tests/ttype_highlight.nim
new file mode 100644
index 000000000..e4189a015
--- /dev/null
+++ b/nimsuggest/tests/ttype_highlight.nim
@@ -0,0 +1,28 @@
+type
+  TypeA = int
+  TypeB* = int
+  TypeC {.unchecked.} = array[1, int]
+  TypeD[T] = T
+  TypeE* {.unchecked.} = array[0, int]#[!]#
+
+discard """
+disabled:true
+$nimsuggest --tester $file
+>highlight $1
+highlight;;skType;;2;;2;;5
+highlight;;skType;;3;;2;;5
+highlight;;skType;;4;;2;;5
+highlight;;skType;;5;;2;;5
+highlight;;skType;;6;;2;;5
+highlight;;skType;;2;;10;;3
+highlight;;skType;;3;;11;;3
+highlight;;skType;;4;;24;;5
+highlight;;skType;;4;;33;;3
+highlight;;skType;;5;;13;;1
+highlight;;skType;;6;;25;;5
+highlight;;skType;;6;;34;;3
+highlight;;skType;;2;;10;;3
+highlight;;skType;;3;;11;;3
+highlight;;skType;;4;;33;;3
+highlight;;skType;;6;;34;;3
+"""