nimrod dump can now produce a machine readable json report

The data in the report includes necessary information for starting
the compiler service and setting up the project paths in the IDE.

the default verbosity of 1 is now set in the compiler code to fix an
issue with verbosity being temporary set to 1 during config parsing
even when it's explicitly overridden on the command-line.

compiler/lexbase was temporary renamed to nimlexbase as a
work-around for a codegen naming conflict with lib/pure/lexbase
resulting in linking errors (further investigation needed).
This commit is contained in:
Zahary Karadjov 2013-05-01 20:20:48 +03:00
commit 89f9772f15
10 changed files with 64 additions and 34 deletions

View file

@ -60,7 +60,7 @@ iterator chosen(packages: PStringTable): string =
proc addBabelPath(p: string, info: TLineInfo) = proc addBabelPath(p: string, info: TLineInfo) =
if not contains(options.searchPaths, p): if not contains(options.searchPaths, p):
Message(info, hintPath, p) if gVerbosity >= 1: Message(info, hintPath, p)
lists.PrependStr(options.lazyPaths, p) lists.PrependStr(options.lazyPaths, p)
proc addPathWithNimFiles(p: string, info: TLineInfo) = proc addPathWithNimFiles(p: string, info: TLineInfo) =

View file

@ -11,7 +11,7 @@
## is needed for incremental compilation. ## is needed for incremental compilation.
import import
ast, astalgo, ropes, options, strutils, lexbase, msgs, cgendata, rodutils, ast, astalgo, ropes, options, strutils, nimlexbase, msgs, cgendata, rodutils,
intsets, platform, llstream intsets, platform, llstream
# Careful! Section marks need to contain a tabulator so that they cannot # Careful! Section marks need to contain a tabulator so that they cannot
@ -119,8 +119,8 @@ proc skipWhite(L: var TBaseLexer) =
var pos = L.bufpos var pos = L.bufpos
while true: while true:
case ^pos case ^pos
of CR: pos = lexbase.HandleCR(L, pos) of CR: pos = nimlexbase.HandleCR(L, pos)
of LF: pos = lexbase.HandleLF(L, pos) of LF: pos = nimlexbase.HandleLF(L, pos)
of ' ': inc pos of ' ': inc pos
else: break else: break
L.bufpos = pos L.bufpos = pos
@ -129,8 +129,8 @@ proc skipUntilCmd(L: var TBaseLexer) =
var pos = L.bufpos var pos = L.bufpos
while true: while true:
case ^pos case ^pos
of CR: pos = lexbase.HandleCR(L, pos) of CR: pos = nimlexbase.HandleCR(L, pos)
of LF: pos = lexbase.HandleLF(L, pos) of LF: pos = nimlexbase.HandleLF(L, pos)
of '\0': break of '\0': break
of '/': of '/':
if ^(pos+1) == '*' and ^(pos+2) == '\t': if ^(pos+1) == '*' and ^(pos+2) == '\t':
@ -153,11 +153,11 @@ when false:
while true: while true:
case buf[pos] case buf[pos]
of CR: of CR:
pos = lexbase.HandleCR(L, pos) pos = nimlexbase.HandleCR(L, pos)
buf = L.buf buf = L.buf
result.data.add(tnl) result.data.add(tnl)
of LF: of LF:
pos = lexbase.HandleLF(L, pos) pos = nimlexbase.HandleLF(L, pos)
buf = L.buf buf = L.buf
result.data.add(tnl) result.data.add(tnl)
of '\0': of '\0':
@ -179,11 +179,11 @@ proc readVerbatimSection(L: var TBaseLexer): PRope =
while true: while true:
case buf[pos] case buf[pos]
of CR: of CR:
pos = lexbase.HandleCR(L, pos) pos = nimlexbase.HandleCR(L, pos)
buf = L.buf buf = L.buf
r.add(tnl) r.add(tnl)
of LF: of LF:
pos = lexbase.HandleLF(L, pos) pos = nimlexbase.HandleLF(L, pos)
buf = L.buf buf = L.buf
r.add(tnl) r.add(tnl)
of '\0': of '\0':

View file

@ -10,7 +10,7 @@
# This module handles the conditional symbols. # This module handles the conditional symbols.
import import
ast, astalgo, msgs, hashes, platform, strutils, idents ast, astalgo, hashes, platform, strutils, idents
var gSymbols*: TStrTable var gSymbols*: TStrTable
@ -35,14 +35,12 @@ proc isDefined*(symbol: PIdent): bool =
proc isDefined*(symbol: string): bool = proc isDefined*(symbol: string): bool =
result = isDefined(getIdent(symbol)) result = isDefined(getIdent(symbol))
proc ListSymbols*() = iterator definedSymbolNames*: string =
var it: TTabIter var it: TTabIter
var s = InitTabIter(it, gSymbols) var s = InitTabIter(it, gSymbols)
OutWriteln("-- List of currently defined symbols --")
while s != nil: while s != nil:
if s.position == 1: OutWriteln(s.name.s) if s.position == 1: yield s.name.s
s = nextIter(it, gSymbols) s = nextIter(it, gSymbols)
OutWriteln("-- End of list --")
proc countDefinedSymbols*(): int = proc countDefinedSymbols*(): int =
var it: TTabIter var it: TTabIter

View file

@ -16,7 +16,7 @@
# DOS or Macintosh text files, even when it is not the native format. # DOS or Macintosh text files, even when it is not the native format.
import import
hashes, options, msgs, strutils, platform, idents, lexbase, llstream, hashes, options, msgs, strutils, platform, idents, nimlexbase, llstream,
wordrecg wordrecg
const const
@ -530,10 +530,10 @@ proc HandleCRLF(L: var TLexer, pos: int): int =
case L.buf[pos] case L.buf[pos]
of CR: of CR:
registerLine() registerLine()
result = lexbase.HandleCR(L, pos) result = nimlexbase.HandleCR(L, pos)
of LF: of LF:
registerLine() registerLine()
result = lexbase.HandleLF(L, pos) result = nimlexbase.HandleLF(L, pos)
else: result = pos else: result = pos
proc getString(L: var TLexer, tok: var TToken, rawMode: bool) = proc getString(L: var TLexer, tok: var TToken, rawMode: bool) =
@ -559,7 +559,7 @@ proc getString(L: var TLexer, tok: var TToken, rawMode: bool) =
pos = HandleCRLF(L, pos) pos = HandleCRLF(L, pos)
buf = L.buf buf = L.buf
add(tok.literal, tnl) add(tok.literal, tnl)
of lexbase.EndOfFile: of nimlexbase.EndOfFile:
var line2 = L.linenumber var line2 = L.linenumber
L.LineNumber = line L.LineNumber = line
lexMessagePos(L, errClosingTripleQuoteExpected, L.lineStart) lexMessagePos(L, errClosingTripleQuoteExpected, L.lineStart)
@ -581,7 +581,7 @@ proc getString(L: var TLexer, tok: var TToken, rawMode: bool) =
else: else:
inc(pos) # skip '"' inc(pos) # skip '"'
break break
elif c in {CR, LF, lexbase.EndOfFile}: elif c in {CR, LF, nimlexbase.EndOfFile}:
lexMessage(L, errClosingQuoteExpected) lexMessage(L, errClosingQuoteExpected)
break break
elif (c == '\\') and not rawMode: elif (c == '\\') and not rawMode:
@ -680,7 +680,7 @@ proc scanComment(L: var TLexer, tok: var TToken) =
var col = getColNumber(L, pos) var col = getColNumber(L, pos)
while true: while true:
var lastBackslash = -1 var lastBackslash = -1
while buf[pos] notin {CR, LF, lexbase.EndOfFile}: while buf[pos] notin {CR, LF, nimlexbase.EndOfFile}:
if buf[pos] == '\\': lastBackslash = pos+1 if buf[pos] == '\\': lastBackslash = pos+1
add(tok.literal, buf[pos]) add(tok.literal, buf[pos])
inc(pos) inc(pos)
@ -688,7 +688,7 @@ proc scanComment(L: var TLexer, tok: var TToken) =
# a backslash is a continuation character if only followed by spaces # a backslash is a continuation character if only followed by spaces
# plus a newline: # plus a newline:
while buf[lastBackslash] == ' ': inc(lastBackslash) while buf[lastBackslash] == ' ': inc(lastBackslash)
if buf[lastBackslash] notin {CR, LF, lexbase.EndOfFile}: if buf[lastBackslash] notin {CR, LF, nimlexbase.EndOfFile}:
# false positive: # false positive:
lastBackslash = -1 lastBackslash = -1
@ -841,7 +841,7 @@ proc rawGetTok(L: var TLexer, tok: var TToken) =
else: else:
if c in OpChars: if c in OpChars:
getOperator(L, tok) getOperator(L, tok)
elif c == lexbase.EndOfFile: elif c == nimlexbase.EndOfFile:
tok.toktype = tkEof tok.toktype = tkEof
else: else:
tok.literal = c & "" tok.literal = c & ""

View file

@ -14,7 +14,7 @@ import
llstream, strutils, ast, astalgo, lexer, syntaxes, renderer, options, msgs, llstream, strutils, ast, astalgo, lexer, syntaxes, renderer, options, msgs,
os, lists, condsyms, rodread, rodwrite, ropes, trees, times, os, lists, condsyms, rodread, rodwrite, ropes, trees, times,
wordrecg, sem, semdata, idents, passes, docgen, extccomp, wordrecg, sem, semdata, idents, passes, docgen, extccomp,
cgen, jsgen, cgendata, cgen, jsgen, cgendata, json, nversion,
platform, nimconf, importer, passaux, depends, evals, types, idgen, platform, nimconf, importer, passaux, depends, evals, types, idgen,
tables, docgen2, service, magicsys, parser, crc, ccgutils tables, docgen2, service, magicsys, parser, crc, ccgutils
@ -392,6 +392,15 @@ proc wantMainModule =
gProjectMainIdx = addFileExt(gProjectFull, nimExt).fileInfoIdx gProjectMainIdx = addFileExt(gProjectFull, nimExt).fileInfoIdx
proc requireMainModuleOption =
if optMainModule.len == 0:
Fatal(gCmdLineInfo, errMainModuleMustBeSpecified)
else:
gProjectName = optMainModule
gProjectFull = gProjectPath / gProjectName
gProjectMainIdx = addFileExt(gProjectFull, nimExt).fileInfoIdx
proc resetMemory = proc resetMemory =
resetCompilationLists() resetCompilationLists()
ccgutils.resetCaches() ccgutils.resetCaches()
@ -529,9 +538,30 @@ proc MainCommand =
wantMainModule() wantMainModule()
CommandGenDepend() CommandGenDepend()
of "dump": of "dump":
gCmd = cmdDump gcmd = cmdDump
condsyms.ListSymbols() if getconfigvar("dump.format") == "json":
for it in iterSearchPath(searchPaths): MsgWriteln(it) requireMainModuleOption()
var definedSymbols = newJArray()
for s in definedSymbolNames(): definedSymbols.elems.add(%s)
var libpaths = newJArray()
for dir in itersearchpath(searchpaths): libpaths.elems.add(%dir)
var dumpdata = % [
(key: "version", val: %VersionAsString),
(key: "project_path", val: %gProjectFull),
(key: "defined_symbols", val: definedSymbols),
(key: "lib_paths", val: libpaths)
]
outWriteLn($dumpdata)
else:
outWriteLn("-- list of currently defined symbols --")
for s in definedSymbolNames(): outWriteLn(s)
outWriteLn("-- end of list --")
for it in iterSearchPath(searchpaths): msgWriteLn(it)
of "check": of "check":
gCmd = cmdCheck gCmd = cmdCheck
wantMainModule() wantMainModule()
@ -568,7 +598,7 @@ proc MainCommand =
else: else:
rawMessage(errInvalidCommandX, command) rawMessage(errInvalidCommandX, command)
if msgs.gErrorCounter == 0 and gCmd notin {cmdInterpret, cmdRun}: if msgs.gErrorCounter == 0 and gCmd notin {cmdInterpret, cmdRun, cmdDump}:
rawMessage(hintSuccessX, [$gLinesCompiled, rawMessage(hintSuccessX, [$gLinesCompiled,
formatFloat(epochTime() - gLastCmdTime, ffDecimal, 3), formatFloat(epochTime() - gLastCmdTime, ffDecimal, 3),
formatSize(getTotalMem())]) formatSize(getTotalMem())])

View file

@ -83,7 +83,9 @@ type
errInvalidCommandX, errXOnlyAtModuleScope, errInvalidCommandX, errXOnlyAtModuleScope,
errXNeedsParamObjectType, errXNeedsParamObjectType,
errTemplateInstantiationTooNested, errInstantiationFrom, errTemplateInstantiationTooNested, errInstantiationFrom,
errInvalidIndexValueForTuple, errCommandExpectsFilename, errXExpected, errInvalidIndexValueForTuple, errCommandExpectsFilename,
errMainModuleMustBeSpecified,
errXExpected,
errInvalidSectionStart, errGridTableNotImplemented, errGeneralParseError, errInvalidSectionStart, errGridTableNotImplemented, errGeneralParseError,
errNewSectionExpected, errWhitespaceExpected, errXisNoValidIndexFile, errNewSectionExpected, errWhitespaceExpected, errXisNoValidIndexFile,
errCannotRenderX, errVarVarTypeNotAllowed, errInstantiateXExplicitely, errCannotRenderX, errVarVarTypeNotAllowed, errInstantiateXExplicitely,
@ -301,6 +303,7 @@ const
errInstantiationFrom: "instantiation from here", errInstantiationFrom: "instantiation from here",
errInvalidIndexValueForTuple: "invalid index value for tuple subscript", errInvalidIndexValueForTuple: "invalid index value for tuple subscript",
errCommandExpectsFilename: "command expects a filename argument", errCommandExpectsFilename: "command expects a filename argument",
errMainModuleMustBeSpecified: "please, specify a main module in the project configuration file",
errXExpected: "\'$1\' expected", errXExpected: "\'$1\' expected",
errInvalidSectionStart: "invalid section start", errInvalidSectionStart: "invalid section start",
errGridTableNotImplemented: "grid table is not implemented", errGridTableNotImplemented: "grid table is not implemented",

View file

@ -99,7 +99,7 @@ var
searchPaths*, lazyPaths*: TLinkedList searchPaths*, lazyPaths*: TLinkedList
outFile*: string = "" outFile*: string = ""
headerFile*: string = "" headerFile*: string = ""
gVerbosity*: int # how verbose the compiler is gVerbosity* = 1 # how verbose the compiler is
gNumberOfProcessors*: int # number of processors gNumberOfProcessors*: int # number of processors
gWholeProject*: bool # for 'doc2': output any dependency gWholeProject*: bool # for 'doc2': output any dependency
gEvalExpr* = "" # expression for idetools --eval gEvalExpr* = "" # expression for idetools --eval

View file

@ -12,7 +12,7 @@
# standard library. # standard library.
import import
llstream, nhashes, strutils, lexbase llstream, nhashes, strutils, nimlexbase
type type
TCfgEventKind* = enum TCfgEventKind* = enum

View file

@ -55,7 +55,6 @@ path="$lib/pure/unidecode"
@end @end
# additional options always passed to the compiler: # additional options always passed to the compiler:
--verbosity: "1"
--parallel_build: "0" # 0 to auto-detect number of processors --parallel_build: "0" # 0 to auto-detect number of processors
hint[LineTooLong]=off hint[LineTooLong]=off