diff options
author | Adam Strzelecki <ono@java.pl> | 2015-04-16 00:36:42 +0200 |
---|---|---|
committer | Adam Strzelecki <ono@java.pl> | 2015-04-21 11:32:13 +0200 |
commit | 07b13251d173226cd29290935297bc9efee023b8 (patch) | |
tree | 4f88917ab6794bc4e8be0b0be51837c4b8e0038c /compiler | |
parent | 69ed78b30f1627897b2e650afb9dfb5bd867b2d3 (diff) | |
download | Nim-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.nim | 4 | ||||
-rw-r--r-- | compiler/parser.nim | 6 |
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 = |