summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAdam Strzelecki <ono@java.pl>2015-04-16 00:36:42 +0200
committerAdam Strzelecki <ono@java.pl>2015-04-21 11:32:13 +0200
commit07b13251d173226cd29290935297bc9efee023b8 (patch)
tree4f88917ab6794bc4e8be0b0be51837c4b8e0038c /compiler
parent69ed78b30f1627897b2e650afb9dfb5bd867b2d3 (diff)
downloadNim-07b13251d173226cd29290935297bc9efee023b8.tar.gz
Parser: Fix location (line, col) for diagnostics
Previously parser was using lexMessage which was taking location from current
buffer position which was pointing after recently consumed token. But since
parser shows diagnostics about that token it should point to the location where
token starts.

This makes diagnostics like: `test.nim(2, 2) Error: ':' expected` point
properly at the beginning of the wrong token.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/lexer.nim4
-rw-r--r--compiler/parser.nim6
2 files changed, 7 insertions, 3 deletions
diff --git a/compiler/lexer.nim b/compiler/lexer.nim
index 694d6f4d7..a2db5ac30 100644
--- a/compiler/lexer.nim
+++ b/compiler/lexer.nim
@@ -221,6 +221,10 @@ proc dispMessage(L: TLexer; info: TLineInfo; msg: TMsgKind; arg: string) =
 proc lexMessage*(L: TLexer, msg: TMsgKind, arg = "") =
   L.dispMessage(getLineInfo(L), msg, arg)
 
+proc lexMessageTok*(L: TLexer, msg: TMsgKind, tok: TToken, arg = "") =
+  var info = newLineInfo(L.fileIdx, tok.line, tok.col)
+  L.dispMessage(info, msg, arg)
+
 proc lexMessagePos(L: var TLexer, msg: TMsgKind, pos: int, arg = "") =
   var info = newLineInfo(L.fileIdx, L.lineNumber, pos - L.lineStart)
   L.dispMessage(info, msg, arg)
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 7da2f0d22..4516f3603 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -91,7 +91,7 @@ proc closeParser(p: var TParser) =
 
 proc parMessage(p: TParser, msg: TMsgKind, arg = "") =
   ## Produce and emit the parser message `arg` to output.
-  lexMessage(p.lex, msg, arg)
+  lexMessageTok(p.lex, msg, p.tok, arg)
 
 proc parMessage(p: TParser, msg: TMsgKind, tok: TToken) =
   ## Produce and emit a parser message to output about the token `tok`
@@ -154,7 +154,7 @@ proc eat(p: var TParser, tokType: TTokType) =
   if p.tok.tokType == tokType:
     getTok(p)
   else:
-    lexMessage(p.lex, errTokenExpected, TokTypeToStr[tokType])
+    lexMessageTok(p.lex, errTokenExpected, p.tok, TokTypeToStr[tokType])
 
 proc parLineInfo(p: TParser): TLineInfo =
   ## Retrieve the line information associated with the parser's current state.
@@ -1636,7 +1636,7 @@ proc parseEnum(p: var TParser): PNode =
         p.tok.tokType == tkEof:
       break
   if result.len <= 1:
-    lexMessage(p.lex, errIdentifierExpected, prettyTok(p.tok))
+    lexMessageTok(p.lex, errIdentifierExpected, p.tok, prettyTok(p.tok))
 
 proc parseObjectPart(p: var TParser): PNode
 proc parseObjectWhen(p: var TParser): PNode =