From ce7a0e3ffb1878ec906c9b46f5952bfbcb53a9b0 Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 18 Jul 2019 11:00:29 +0200 Subject: [PATCH] [refactoring] nimpretty (cherry picked from commit 5b7273b4f8f716c1f5d4f582ebe23f8adbd48b0b) --- compiler/layouter.nim | 44 +++++++++++++++++++++++++++-------------- nimpretty/nimpretty.nim | 4 ++-- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/compiler/layouter.nim b/compiler/layouter.nim index bff7d8a1bd..2bf0552ffa 100644 --- a/compiler/layouter.nim +++ b/compiler/layouter.nim @@ -32,7 +32,7 @@ type ltTab, ltOptionalNewline, ## optional newline introduced by nimpretty ltComment, ltLit, ltKeyword, ltExportMarker, ltIdent, - ltOther, ltOpr, + ltOther, ltOpr, ltSomeParLe, ltSomeParRi, ltBeginSection, ltEndSection Emitter* = object @@ -142,7 +142,7 @@ proc optionalIsGood(em: var Emitter; pos, currentLen: int): bool = result = true elif em.tokens[p+1].len < ourIndent: result = isLongEnough(lineLen, pos, p) - elif em.kinds[pos+1] == ltOther: # note: pos+1, not p+1 + elif em.kinds[pos+1] in {ltOther, ltSomeParLe, ltSomeParRi}: # note: pos+1, not p+1 result = false else: result = isLongEnough(lineLen, pos, p) @@ -153,13 +153,21 @@ proc lenOfNextTokens(em: Emitter; pos: int): int = if em.kinds[pos+i] in {ltCrucialNewline, ltSplittingNewline, ltOptionalNewline}: break inc result, em.tokens[pos+i].len +proc lacksGuidingInd(em: Emitter; pos: int): bool = + result = true + proc closeEmitter*(em: var Emitter) = + template defaultCase() = + content.add em.tokens[i] + inc lineLen, em.tokens[i].len + let outFile = em.config.absOutFile var content = newStringOfCap(16_000) var maxLhs = 0 var lineLen = 0 var lineBegin = 0 + var openPars = 0 var i = 0 while i <= em.tokens.high: when defined(debug): @@ -203,6 +211,9 @@ proc closeEmitter*(em: var Emitter) = content.add "\L" content.add em.tokens[i] lineLen = em.tokens[i].len + if false: # openPars == 0 or lacksGuidingInd(em, i): + content.add repeat(' ', em.indWidth*2) + lineLen += em.indWidth*2 lineBegin = i+1 if i+1 < em.kinds.len and em.kinds[i+1] == ltSpaces: # inhibit extra spaces at the start of a new line @@ -215,9 +226,15 @@ proc closeEmitter*(em: var Emitter) = else: inc lineLen, em.tokens[i].len content.add em.tokens[i] + of ltSomeParLe: + inc openPars + defaultCase() + of ltSomeParRi: + doAssert openPars > 0 + dec openPars + defaultCase() else: - content.add em.tokens[i] - inc lineLen, em.tokens[i].len + defaultCase() inc i if fileExists(outFile) and readFile(outFile.string) == content: @@ -292,7 +309,7 @@ const tkCurlyLe} closedPars = {tkParRi, tkParDotRi, tkBracketRi, tkCurlyDotRi, - tkCurlyRi} + tkCurlyRi, tkBracketDotRi} splitters = openPars + {tkComma, tkSemiColon} # do not add 'tkColon' here! oprSet = {tkOpr, tkDiv, tkMod, tkShl, tkShr, tkIn, tkNotin, tkIs, @@ -416,7 +433,8 @@ proc emitTok*(em: var Emitter; L: TLexer; tok: TToken) = var newlineKind = ltCrucialNewline if em.keepIndents > 0: em.indentLevel = tok.indent - elif (em.lastTok in (splitters + oprSet) and tok.tokType notin closedPars): + elif (em.lastTok in (splitters + oprSet) and + tok.tokType notin (closedPars - {tkBracketDotRi})): # aka: we are in an expression context: let alignment = max(tok.indent - em.indentStack[^1], 0) em.indentLevel = alignment + em.indentStack.high * em.indWidth @@ -471,18 +489,14 @@ proc emitTok*(em: var Emitter; L: TLexer; tok: TToken) = wr(em, TokTypeToStr[tok.tokType], ltOther) rememberSplit(splitComma) wrSpace em - of tkParDotLe, tkParLe, tkBracketDotLe, tkBracketLe, - tkCurlyLe, tkCurlyDotLe, tkBracketLeColon: + of openPars: if tok.strongSpaceA > 0 and not em.endsInWhite and not em.wasExportMarker: wrSpace em - wr(em, TokTypeToStr[tok.tokType], ltOther) + wr(em, TokTypeToStr[tok.tokType], ltSomeParLe) rememberSplit(splitParLe) - of tkParRi, - tkBracketRi, tkCurlyRi, - tkBracketDotRi, - tkCurlyDotRi, - tkParDotRi, - tkColonColon: + of closedPars: + wr(em, TokTypeToStr[tok.tokType], ltSomeParRi) + of tkColonColon: wr(em, TokTypeToStr[tok.tokType], ltOther) of tkDot: lastTokWasTerse = true diff --git a/nimpretty/nimpretty.nim b/nimpretty/nimpretty.nim index e0b27c2311..aa6784c82d 100644 --- a/nimpretty/nimpretty.nim +++ b/nimpretty/nimpretty.nim @@ -25,7 +25,7 @@ const Usage: nimpretty [options] file.nim Options: - --output:file set the output file (default: overwrite the input file) + --out:file set the output file (default: overwrite the input file) --indent:N[=0] set the number of spaces that is used for indentation --indent:0 means autodetection (default behaviour) --maxLineLen:N set the desired maximum line length (default: 80) @@ -79,7 +79,7 @@ proc main = of "help", "h": writeHelp() of "version", "v": writeVersion() of "backup": backup = parseBool(val) - of "output", "o": outfile = val + of "output", "o", "out": outfile = val of "indent": opt.indWidth = parseInt(val) of "maxlinelen": opt.maxLineLen = parseInt(val) else: writeHelp()