nimpretty: render r-strings properly, fixes #9236

This commit is contained in:
Andreas Rumpf 2018-10-16 13:33:01 +02:00
commit 89ba0f8592
4 changed files with 19 additions and 11 deletions

View file

@ -740,11 +740,17 @@ proc handleCRLF(L: var TLexer, pos: int): int =
result = nimlexbase.handleLF(L, pos) result = nimlexbase.handleLF(L, pos)
else: result = pos else: result = pos
proc getString(L: var TLexer, tok: var TToken, rawMode: bool) = type
StringMode = enum
normal,
raw,
generalized
proc getString(L: var TLexer, tok: var TToken, mode: StringMode) =
var pos = L.bufpos var pos = L.bufpos
var buf = L.buf # put `buf` in a register var buf = L.buf # put `buf` in a register
var line = L.lineNumber # save linenumber for better error message var line = L.lineNumber # save linenumber for better error message
tokenBegin(tok, pos) tokenBegin(tok, pos - ord(mode == raw))
inc pos # skip " inc pos # skip "
if buf[pos] == '\"' and buf[pos+1] == '\"': if buf[pos] == '\"' and buf[pos+1] == '\"':
tok.tokType = tkTripleStrLit # long string literal: tok.tokType = tkTripleStrLit # long string literal:
@ -784,12 +790,12 @@ proc getString(L: var TLexer, tok: var TToken, rawMode: bool) =
inc(pos) inc(pos)
else: else:
# ordinary string literal # ordinary string literal
if rawMode: tok.tokType = tkRStrLit if mode != normal: tok.tokType = tkRStrLit
else: tok.tokType = tkStrLit else: tok.tokType = tkStrLit
while true: while true:
var c = buf[pos] var c = buf[pos]
if c == '\"': if c == '\"':
if rawMode and buf[pos+1] == '\"': if mode != normal and buf[pos+1] == '\"':
inc(pos, 2) inc(pos, 2)
add(tok.literal, '"') add(tok.literal, '"')
else: else:
@ -800,7 +806,7 @@ proc getString(L: var TLexer, tok: var TToken, rawMode: bool) =
tokenEndIgnore(tok, pos) tokenEndIgnore(tok, pos)
lexMessage(L, errGenerated, "closing \" expected") lexMessage(L, errGenerated, "closing \" expected")
break break
elif (c == '\\') and not rawMode: elif (c == '\\') and mode == normal:
L.bufpos = pos L.bufpos = pos
getEscapedChar(L, tok) getEscapedChar(L, tok)
pos = L.bufpos pos = L.bufpos
@ -1168,7 +1174,7 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) =
of 'r', 'R': of 'r', 'R':
if L.buf[L.bufpos + 1] == '\"': if L.buf[L.bufpos + 1] == '\"':
inc(L.bufpos) inc(L.bufpos)
getString(L, tok, true) getString(L, tok, raw)
else: else:
getSymbol(L, tok) getSymbol(L, tok)
of '(': of '(':
@ -1246,9 +1252,9 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) =
lexMessage(L, errGenerated, "invalid token: " & c & " (\\" & $(ord(c)) & ')') lexMessage(L, errGenerated, "invalid token: " & c & " (\\" & $(ord(c)) & ')')
of '\"': of '\"':
# check for generalized raw string literal: # check for generalized raw string literal:
var rawMode = L.bufpos > 0 and L.buf[L.bufpos-1] in SymChars let mode = if L.bufpos > 0 and L.buf[L.bufpos-1] in SymChars: generalized else: normal
getString(L, tok, rawMode) getString(L, tok, mode)
if rawMode: if mode == generalized:
# tkRStrLit -> tkGStrLit # tkRStrLit -> tkGStrLit
# tkTripleStrLit -> tkGTripleStrLit # tkTripleStrLit -> tkGTripleStrLit
inc(tok.tokType, 2) inc(tok.tokType, 2)

View file

@ -853,12 +853,10 @@ proc loadNode*(g: ModuleGraph; module: PSym): PNode =
result = newNodeI(nkStmtList, module.info) result = newNodeI(nkStmtList, module.info)
for row in db.rows(sql"select data from toplevelstmts where module = ? order by position asc", for row in db.rows(sql"select data from toplevelstmts where module = ? order by position asc",
abs module.id): abs module.id):
var b = BlobReader(pos: 0) var b = BlobReader(pos: 0)
# ensure we can read without index checks: # ensure we can read without index checks:
b.s = row[0] & '\0' b.s = row[0] & '\0'
result.add decodeNode(g, b, module.info) result.add decodeNode(g, b, module.info)
db.exec(sql"insert into controlblock(idgen) values (?)", gFrontEndId) db.exec(sql"insert into controlblock(idgen) values (?)", gFrontEndId)
replay(g, module, result) replay(g, module, result)

View file

@ -314,3 +314,5 @@ proc f() =
if c == '\\': if c == '\\':
# escape char # escape char
str &= c str &= c
const test = r"C:\Users\-\Desktop\test.txt"

View file

@ -323,3 +323,5 @@ proc f() =
if c == '\\': if c == '\\':
# escape char # escape char
str &= c str &= c
const test = r"C:\Users\-\Desktop\test.txt"