diff options
Diffstat (limited to 'rod/main.nim')
-rw-r--r-- | rod/main.nim | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/rod/main.nim b/rod/main.nim deleted file mode 100644 index 3221f531e..000000000 --- a/rod/main.nim +++ /dev/null @@ -1,250 +0,0 @@ -# -# -# The Nimrod Compiler -# (c) Copyright 2010 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -# implements the command dispatcher and several commands as well as the -# module handling - -import - llstream, strutils, ast, astalgo, scanner, syntaxes, rnimsyn, options, msgs, - os, lists, condsyms, rodread, rodwrite, ropes, trees, - wordrecg, sem, semdata, idents, passes, docgen, extccomp, - cgen, ecmasgen, - platform, interact, nimconf, importer, passaux, depends, transf, evals, types - -const - has_LLVM_Backend = false - -when has_LLVM_Backend: - import llvmgen - -proc MainCommand*(cmd, filename: string) -# implementation -# ------------------ module handling ----------------------------------------- - -type - TFileModuleRec{.final.} = object - filename*: string - module*: PSym - - TFileModuleMap = seq[TFileModuleRec] - -var compMods: TFileModuleMap = @ [] - -proc registerModule(filename: string, module: PSym) = - # all compiled modules - var length = len(compMods) - setlen(compMods, length + 1) - compMods[length].filename = filename - compMods[length].module = module - -proc getModule(filename: string): PSym = - for i in countup(0, high(compMods)): - if sameFile(compMods[i].filename, filename): - return compMods[i].module - -proc newModule(filename: string): PSym = - # We cannot call ``newSym`` here, because we have to circumvent the ID - # mechanism, which we do in order to assign each module a persistent ID. - new(result) - result.id = - 1 # for better error checking - result.kind = skModule - result.name = getIdent(splitFile(filename).name) - if not isNimrodIdentifier(result.name.s): - rawMessage(errIdentifierExpected, result.name.s) - - result.owner = result # a module belongs to itself - result.info = newLineInfo(filename, 1, 1) - incl(result.flags, sfUsed) - initStrTable(result.tab) - RegisterModule(filename, result) - StrTableAdd(result.tab, result) # a module knows itself - -proc CompileModule(filename: string, isMainFile, isSystemFile: bool): PSym -proc importModule(filename: string): PSym = - # this is called by the semantic checking phase - result = getModule(filename) - if result == nil: - # compile the module - result = compileModule(filename, false, false) - elif sfSystemModule in result.flags: - liMessage(result.info, errAttemptToRedefine, result.Name.s) - -proc CompileModule(filename: string, isMainFile, isSystemFile: bool): PSym = - var rd: PRodReader = nil - var f = addFileExt(filename, nimExt) - result = newModule(filename) - if isMainFile: incl(result.flags, sfMainModule) - if isSystemFile: incl(result.flags, sfSystemModule) - if (gCmd == cmdCompileToC) or (gCmd == cmdCompileToCpp): - rd = handleSymbolFile(result, f) - if result.id < 0: - InternalError("handleSymbolFile should have set the module\'s ID") - else: - result.id = getID() - processModule(result, f, nil, rd) - -proc CompileProject(filename: string) = - discard CompileModule(JoinPath(options.libpath, addFileExt("system", nimExt)), - false, true) - discard CompileModule(addFileExt(filename, nimExt), true, false) - -proc semanticPasses() = - registerPass(verbosePass()) - registerPass(sem.semPass()) - registerPass(transf.transfPass()) - -proc CommandGenDepend(filename: string) = - semanticPasses() - registerPass(genDependPass()) - registerPass(cleanupPass()) - compileProject(filename) - generateDot(filename) - execExternalProgram("dot -Tpng -o" & changeFileExt(filename, "png") & ' ' & - changeFileExt(filename, "dot")) - -proc CommandCheck(filename: string) = - semanticPasses() # use an empty backend for semantic checking only - compileProject(filename) - -proc CommandCompileToC(filename: string) = - semanticPasses() - registerPass(cgen.cgenPass()) - registerPass(rodwrite.rodwritePass()) - #registerPass(cleanupPass()) - compileProject(filename) - extccomp.CallCCompiler(changeFileExt(filename, "")) - -when has_LLVM_Backend: - proc CommandCompileToLLVM(filename: string) = - semanticPasses() - registerPass(llvmgen.llvmgenPass()) - registerPass(rodwrite.rodwritePass()) - #registerPass(cleanupPass()) - compileProject(filename) - -proc CommandCompileToEcmaScript(filename: string) = - incl(gGlobalOptions, optSafeCode) - setTarget(osEcmaScript, cpuEcmaScript) - initDefines() - semanticPasses() - registerPass(ecmasgenPass()) - compileProject(filename) - -proc CommandInteractive() = - incl(gGlobalOptions, optSafeCode) - setTarget(osNimrodVM, cpuNimrodVM) - initDefines() - registerPass(verbosePass()) - registerPass(sem.semPass()) - registerPass(transf.transfPass()) - registerPass(evals.evalPass()) # load system module: - discard CompileModule(JoinPath(options.libpath, addFileExt("system", nimExt)), - false, true) - var m = newModule("stdin") - m.id = getID() - incl(m.flags, sfMainModule) - processModule(m, "stdin", LLStreamOpenStdIn(), nil) - -proc CommandPretty(filename: string) = - var module = parseFile(addFileExt(filename, NimExt)) - if module != nil: - renderModule(module, getOutFile(filename, "pretty." & NimExt)) - -proc CommandScan(filename: string) = - var f = addFileExt(filename, nimExt) - var stream = LLStreamOpen(f, fmRead) - if stream != nil: - var - L: TLexer - tok: PToken - new(tok) - openLexer(L, f, stream) - while true: - rawGetTok(L, tok^) - PrintTok(tok) - if tok.tokType == tkEof: break - CloseLexer(L) - else: - rawMessage(errCannotOpenFile, f) - -proc WantFile(filename: string) = - if filename == "": - liMessage(newLineInfo("command line", 1, 1), errCommandExpectsFilename) - -proc MainCommand(cmd, filename: string) = - appendStr(searchPaths, options.libpath) - if filename != "": - # current path is always looked first for modules - prependStr(searchPaths, splitFile(filename).dir) - setID(100) - passes.gIncludeFile = syntaxes.parseFile - passes.gImportModule = importModule - case whichKeyword(cmd) - of wCompile, wCompileToC, wC, wCC: - # compile means compileToC currently - gCmd = cmdCompileToC - wantFile(filename) - CommandCompileToC(filename) - of wCompileToCpp: - gCmd = cmdCompileToCpp - wantFile(filename) - CommandCompileToC(filename) - of wCompileToEcmaScript: - gCmd = cmdCompileToEcmaScript - wantFile(filename) - CommandCompileToEcmaScript(filename) - of wCompileToLLVM: - gCmd = cmdCompileToLLVM - wantFile(filename) - when has_LLVM_Backend: - CommandCompileToLLVM(filename) - of wPretty: - gCmd = cmdPretty - wantFile(filename) #CommandExportSymbols(filename); - CommandPretty(filename) - of wDoc: - gCmd = cmdDoc - LoadSpecialConfig(DocConfig) - wantFile(filename) - CommandDoc(filename) - of wRst2html: - gCmd = cmdRst2html - LoadSpecialConfig(DocConfig) - wantFile(filename) - CommandRst2Html(filename) - of wRst2tex: - gCmd = cmdRst2tex - LoadSpecialConfig(DocTexConfig) - wantFile(filename) - CommandRst2TeX(filename) - of wGenDepend: - gCmd = cmdGenDepend - wantFile(filename) - CommandGenDepend(filename) - of wListDef: - gCmd = cmdListDef - condsyms.ListSymbols() - of wCheck: - gCmd = cmdCheck - wantFile(filename) - CommandCheck(filename) - of wParse: - gCmd = cmdParse - wantFile(filename) - discard parseFile(addFileExt(filename, nimExt)) - of wScan: - gCmd = cmdScan - wantFile(filename) - CommandScan(filename) - MessageOut("Beware: Indentation tokens depend on the parser\'s state!") - of wI: - gCmd = cmdInteractive - CommandInteractive() - else: rawMessage(errInvalidCommandX, cmd) - |