diff options
-rw-r--r-- | compiler/commands.nim | 12 | ||||
-rw-r--r-- | compiler/configuration.nim | 13 | ||||
-rw-r--r-- | compiler/docgen.nim | 56 | ||||
-rw-r--r-- | compiler/lexer.nim | 2 | ||||
-rw-r--r-- | compiler/msgs.nim | 12 | ||||
-rw-r--r-- | compiler/nimconf.nim | 4 | ||||
-rw-r--r-- | compiler/nversion.nim | 3 | ||||
-rw-r--r-- | compiler/options.nim | 33 | ||||
-rw-r--r-- | compiler/typesrenderer.nim | 7 |
9 files changed, 80 insertions, 62 deletions
diff --git a/compiler/commands.nim b/compiler/commands.nim index 46ade667e..6ca212ddb 100644 --- a/compiler/commands.nim +++ b/compiler/commands.nim @@ -490,10 +490,10 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo; of "oldnewlines": case arg.normalize of "on": - options.gOldNewlines = true + conf.oldNewlines = true defineSymbol(conf.symbols, "nimOldNewlines") of "off": - options.gOldNewlines = false + conf.oldNewlines = false undefSymbol(conf.symbols, "nimOldNewlines") else: localError(conf, info, errOnOrOffExpectedButXFound % arg) @@ -671,19 +671,19 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo; trackDirty(conf, arg, info) of "suggest": expectNoArg(conf, switch, arg, pass, info) - gIdeCmd = ideSug + conf.ideCmd = ideSug of "def": expectNoArg(conf, switch, arg, pass, info) - gIdeCmd = ideDef + conf.ideCmd = ideDef of "eval": expectArg(conf, switch, arg, pass, info) gEvalExpr = arg of "context": expectNoArg(conf, switch, arg, pass, info) - gIdeCmd = ideCon + conf.ideCmd = ideCon of "usages": expectNoArg(conf, switch, arg, pass, info) - gIdeCmd = ideUse + conf.ideCmd = ideUse of "stdout": expectNoArg(conf, switch, arg, pass, info) incl(gGlobalOptions, optStdout) diff --git a/compiler/configuration.nim b/compiler/configuration.nim index f7b9803e7..5164fd6df 100644 --- a/compiler/configuration.nim +++ b/compiler/configuration.nim @@ -18,7 +18,13 @@ const type TMsgKind* = enum - errUnknown, errInternal, errIllFormedAstX, errCannotOpenFile, errGenerated, + errUnknown, errInternal, errIllFormedAstX, errCannotOpenFile, + errXExpected, + errGridTableNotImplemented, + errGeneralParseError, + errNewSectionExpected, + errInvalidDirectiveX, + errGenerated, errUser, warnCannotOpenFile, warnOctalEscape, warnXIsNeverRead, warnXmightNotBeenInit, @@ -47,6 +53,11 @@ const errInternal: "internal error: $1", errIllFormedAstX: "illformed AST: $1", errCannotOpenFile: "cannot open '$1'", + errXExpected: "'$1' expected", + errGridTableNotImplemented: "grid table is not implemented", + errGeneralParseError: "general parse error", + errNewSectionExpected: "new section expected", + errInvalidDirectiveX: "invalid directive: '$1'", errGenerated: "$1", errUser: "$1", warnCannotOpenFile: "cannot open '$1'", diff --git a/compiler/docgen.nim b/compiler/docgen.nim index e1a70a23e..a21c8073f 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -16,7 +16,7 @@ import wordrecg, syntaxes, renderer, lexer, packages/docutils/rstast, packages/docutils/rst, packages/docutils/rstgen, times, packages/docutils/highlite, sempass2, json, xmltree, cgi, - typesrenderer, astalgo, modulepaths + typesrenderer, astalgo, modulepaths, configuration type TSections = array[TSymKind, Rope] @@ -53,36 +53,40 @@ proc attachToType(d: PDoc; p: PSym): PSym = if params.len > 0: check(0) for i in 2..<params.len: check(i) -proc compilerMsgHandler(filename: string, line, col: int, - msgKind: rst.MsgKind, arg: string) {.procvar.} = - # translate msg kind: - var k: msgs.TMsgKind - case msgKind - of meCannotOpenFile: k = errCannotOpenFile - of meExpected: k = errXExpected - of meGridTableNotImplemented: k = errGridTableNotImplemented - of meNewSectionExpected: k = errNewSectionExpected - of meGeneralParseError: k = errGeneralParseError - of meInvalidDirective: k = errInvalidDirectiveX - of mwRedefinitionOfLabel: k = warnRedefinitionOfLabel - of mwUnknownSubstitution: k = warnUnknownSubstitutionX - of mwUnsupportedLanguage: k = warnLanguageXNotSupported - of mwUnsupportedField: k = warnFieldXNotSupported - globalError(newLineInfo(filename, line, col), k, arg) - -proc docgenFindFile(s: string): string {.procvar.} = - result = options.findFile(s) - if result.len == 0: - result = getCurrentDir() / s - if not existsFile(result): result = "" +template declareClosures = + proc compilerMsgHandler(filename: string, line, col: int, + msgKind: rst.MsgKind, arg: string) {.procvar.} = + # translate msg kind: + var k: TMsgKind + case msgKind + of meCannotOpenFile: k = errCannotOpenFile + of meExpected: k = errXExpected + of meGridTableNotImplemented: k = errGridTableNotImplemented + of meNewSectionExpected: k = errNewSectionExpected + of meGeneralParseError: k = errGeneralParseError + of meInvalidDirective: k = errInvalidDirectiveX + of mwRedefinitionOfLabel: k = warnRedefinitionOfLabel + of mwUnknownSubstitution: k = warnUnknownSubstitutionX + of mwUnsupportedLanguage: k = warnLanguageXNotSupported + of mwUnsupportedField: k = warnFieldXNotSupported + globalError(conf, newLineInfo(conf, filename, line, col), k, arg) + + proc docgenFindFile(s: string): string {.procvar.} = + result = options.findFile(conf, s) + if result.len == 0: + result = getCurrentDir() / s + if not existsFile(result): result = "" proc parseRst(text, filename: string, line, column: int, hasToc: var bool, - rstOptions: RstParseOptions): PRstNode = + rstOptions: RstParseOptions; + conf: ConfigRef): PRstNode = + declareClosures() result = rstParse(text, filename, line, column, hasToc, rstOptions, docgenFindFile, compilerMsgHandler) -proc newDocumentor*(filename: string, config: StringTableRef): PDoc = +proc newDocumentor*(filename: string, conf: ConfigRef): PDoc = + declareClosures() new(result) initRstGenerator(result[], (if gCmd != cmdRst2tex: outHtml else: outLatex), options.gConfigVars, filename, {roSupportRawDirective}, @@ -109,7 +113,7 @@ proc newDocumentor*(filename: string, config: StringTableRef): PDoc = result.jArray = newJArray() initStrTable result.types result.onTestSnippet = proc (d: var RstGenerator; filename, cmd: string; status: int; content: string) = - localError(newLineInfo(d.filename, -1, -1), warnUser, "only 'rst2html' supports the ':test:' attribute") + localError(conf, newLineInfo(conf, d.filename, -1, -1), warnUser, "only 'rst2html' supports the ':test:' attribute") proc dispA(dest: var Rope, xml, tex: string, args: openArray[Rope]) = if gCmd != cmdRst2tex: addf(dest, xml, args) diff --git a/compiler/lexer.nim b/compiler/lexer.nim index 68348a73e..7c89ee4a7 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -627,7 +627,7 @@ proc getEscapedChar(L: var TLexer, tok: var TToken) = inc(L.bufpos) # skip '\' case L.buf[L.bufpos] of 'n', 'N': - if gOldNewlines: + if L.config.oldNewlines: if tok.tokType == tkCharLit: lexMessage(L, errGenerated, "\\n not allowed in character literal") add(tok.literal, tnl) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index fa30acb25..1efc3c944 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -168,7 +168,7 @@ when false: proc raiseRecoverableError*(msg: string) {.noinline, noreturn.} = raise newException(ERecoverableError, msg) -proc sourceLine*(i: TLineInfo): Rope +proc sourceLine*(conf: ConfigRef; i: TLineInfo): Rope proc unknownLineInfo*(): TLineInfo = result.line = uint16(0) @@ -492,9 +492,9 @@ proc resetAttributes*(conf: ConfigRef) = if {optUseColors, optStdout} * gGlobalOptions == {optUseColors}: terminal.resetAttributes(stderr) -proc writeSurroundingSrc(info: TLineInfo) = +proc writeSurroundingSrc(conf: ConfigRef; info: TLineInfo) = const indent = " " - msgWriteln(indent & $info.sourceLine) + msgWriteln(indent & $sourceLine(conf, info)) msgWriteln(indent & spaces(info.col) & '^') proc formatMsg*(info: TLineInfo, msg: TMsgKind, arg: string): string = @@ -557,7 +557,7 @@ proc liMessage(conf: ConfigRef; info: TLineInfo, msg: TMsgKind, arg: string, else: styledMsgWriteln(styleBright, x, resetStyle, color, title, resetStyle, s) if hintSource in conf.notes: - info.writeSurroundingSrc() + conf.writeSurroundingSrc(info) handleError(conf, msg, eh, s) proc fatal*(conf: ConfigRef; info: TLineInfo, msg: TMsgKind, arg = "") = @@ -604,10 +604,10 @@ template internalAssert*(conf: ConfigRef, e: bool) = proc addSourceLine*(fileIdx: FileIndex, line: string) = fileInfos[fileIdx.int32].lines.add line.rope -proc sourceLine*(i: TLineInfo): Rope = +proc sourceLine*(conf: ConfigRef; i: TLineInfo): Rope = if i.fileIndex.int32 < 0: return nil - if not optPreserveOrigSource and fileInfos[i.fileIndex.int32].lines.len == 0: + if not optPreserveOrigSource(conf) and fileInfos[i.fileIndex.int32].lines.len == 0: try: for line in lines(i.toFullPath): addSourceLine i.fileIndex, line.string diff --git a/compiler/nimconf.nim b/compiler/nimconf.nim index 9f5031d3b..b333252a1 100644 --- a/compiler/nimconf.nim +++ b/compiler/nimconf.nim @@ -123,7 +123,7 @@ proc parseDirective(L: var TLexer, tok: var TToken; config: ConfigRef; condStack of wEnd: doEnd(L, tok, condStack) of wWrite: ppGetTok(L, tok) - msgs.msgWriteln(strtabs.`%`(tokToStr(tok), options.gConfigVars, + msgs.msgWriteln(strtabs.`%`(tokToStr(tok), config.configVars, {useEnvironment, useKey})) ppGetTok(L, tok) else: @@ -196,7 +196,7 @@ proc parseAssignment(L: var TLexer, tok: var TToken; add(val, tokToStr(tok)) confTok(L, tok, config, condStack) if percent: - processSwitch(s, strtabs.`%`(val, options.gConfigVars, + processSwitch(s, strtabs.`%`(val, config.configVars, {useEnvironment, useEmpty}), passPP, info, config) else: processSwitch(s, val, passPP, info, config) diff --git a/compiler/nversion.nim b/compiler/nversion.nim index 85265a7c0..caa818d79 100644 --- a/compiler/nversion.nim +++ b/compiler/nversion.nim @@ -15,3 +15,6 @@ const VersionAsString* = system.NimVersion RodFileVersion* = "1223" # modify this if the rod-format changes! + NimCompilerApiVersion* = 1 ## Check for the existance of this before accessing it + ## as older versions of the compiler API do not + ## declare this. diff --git a/compiler/options.nim b/compiler/options.nim index 643b6f4f6..8aa438917 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -119,6 +119,8 @@ type arguments*: string ## the arguments to be passed to the program that ## should be run helpWritten*: bool + ideCmd*: IdeCmd + oldNewlines*: bool enableNotes*: TNoteKinds disableNotes*: TNoteKinds foreignPackageNotes*: TNoteKinds @@ -128,6 +130,7 @@ type hintCounter*: int warnCounter*: int errorMax*: int + configVars*: StringTableRef symbols*: StringTableRef ## We need to use a StringTableRef here as defined ## symbols are always guaranteed to be style ## insensitive. Otherwise hell would break lose. @@ -146,6 +149,7 @@ proc newConfigRef*(): ConfigRef = headerFile: "", features: {}, foreignPackageNotes: {hintProcessing, warnUnknownMagic, hintQuitCalled, hintExecuting}, notes: NotesVerbosity[1], mainPackageNotes: NotesVerbosity[1], + configVars: newStringTable(modeStyleInsensitive), symbols: newStringTable(modeStyleInsensitive), packageCache: newPackageCache()) @@ -197,10 +201,6 @@ proc isDefined*(conf: ConfigRef; symbol: string): bool = osDragonfly, osMacosx} else: discard -var - gIdeCmd*: IdeCmd - gOldNewlines*: bool - const ChecksOptions* = {optObjCheck, optFieldCheck, optRangeCheck, optNilCheck, optOverflowCheck, optBoundsCheck, optAssert, optNaNCheck, optInfCheck, @@ -227,8 +227,8 @@ var gEvalExpr* = "" # expression for idetools --eval gLastCmdTime*: float # when caas is enabled, we measure each command gListFullPaths*: bool - gPreciseStack*: bool = false - gNoNimblePath* = false + gPreciseStack*: bool + gNoNimblePath*: bool gDynlibOverrideAll*: bool useNimNamespace*: bool @@ -238,15 +238,15 @@ type var gSymbolFiles*: SymbolFilesOption -proc importantComments*(): bool {.inline.} = gCmd in {cmdDoc, cmdIdeTools} -proc usesNativeGC*(): bool {.inline.} = gSelectedGC >= gcRefc -template preciseStack*(): bool = gPreciseStack +proc importantComments*(conf: ConfigRef): bool {.inline.} = gCmd in {cmdDoc, cmdIdeTools} +proc usesNativeGC*(conf: ConfigRef): bool {.inline.} = gSelectedGC >= gcRefc +template preciseStack*(conf: ConfigRef): bool = gPreciseStack -template compilationCachePresent*: untyped = +template compilationCachePresent*(conf: ConfigRef): untyped = gSymbolFiles in {enabledSf, writeOnlySf} # {optCaasEnabled, optSymbolFiles} * gGlobalOptions != {} -template optPreserveOrigSource*: untyped = +template optPreserveOrigSource*(conf: ConfigRef): untyped = optEmbedOrigSrc in gGlobalOptions const @@ -264,7 +264,6 @@ const # additional configuration variables: var - gConfigVars* = newStringTable(modeStyleInsensitive) gDllOverrides = newStringTable(modeCaseInsensitive) gModuleOverrides* = newStringTable(modeStyleInsensitive) gPrefixDir* = "" # Overrides the default prefix dir in getPrefixDir proc. @@ -283,10 +282,10 @@ var const oKeepVariableNames* = true -template compilingLib*: bool = +template compilingLib*(conf: ConfigRef): bool = gGlobalOptions * {optGenGuiApp, optGenDynLib} != {} -proc mainCommandArg*: string = +proc mainCommandArg*(conf: ConfigRef): string = ## This is intended for commands like check or parse ## which will work on the main project file unless ## explicitly given a specific file argument @@ -296,13 +295,13 @@ proc mainCommandArg*: string = result = gProjectName proc existsConfigVar*(conf: ConfigRef; key: string): bool = - result = hasKey(gConfigVars, key) + result = hasKey(conf.configVars, key) proc getConfigVar*(conf: ConfigRef; key: string): string = - result = gConfigVars.getOrDefault key + result = conf.configVars.getOrDefault key proc setConfigVar*(conf: ConfigRef; key, val: string) = - gConfigVars[key] = val + conf.configVars[key] = val proc getOutFile*(conf: ConfigRef; filename, ext: string): string = if options.outFile != "": result = options.outFile diff --git a/compiler/typesrenderer.nim b/compiler/typesrenderer.nim index 4a9b8d1a9..4d75d5d05 100644 --- a/compiler/typesrenderer.nim +++ b/compiler/typesrenderer.nim @@ -17,7 +17,6 @@ proc renderPlainSymbolName*(n: PNode): string = ## Use this on documentation name nodes to extract the *raw* symbol name, ## without decorations, parameters, or anything. That can be used as the base ## for the HTML hyperlinks. - result = "" case n.kind of nkPostfix, nkAccQuoted: result = renderPlainSymbolName(n[n.len-1]) @@ -28,7 +27,8 @@ proc renderPlainSymbolName*(n: PNode): string = of nkPragmaExpr: result = renderPlainSymbolName(n[0]) else: - internalError(n.info, "renderPlainSymbolName() with " & $n.kind) + result = "" + #internalError(n.info, "renderPlainSymbolName() with " & $n.kind) assert(not result.isNil) proc renderType(n: PNode): string = @@ -105,7 +105,8 @@ proc renderParamTypes(found: var seq[string], n: PNode) = for i in 0 ..< typePos: found.add(typeStr) else: - internalError(n.info, "renderParamTypes(found,n) with " & $n.kind) + found.add($n) + #internalError(n.info, "renderParamTypes(found,n) with " & $n.kind) proc renderParamTypes*(n: PNode, sep = defaultParamSeparator): string = ## Returns the types contained in `n` joined by `sep`. |