nimpretty: render r-strings properly, fixes #9236
This commit is contained in:
parent
749dbce4c6
commit
89ba0f8592
4 changed files with 19 additions and 11 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue