diff options
| author | Ganesh Viswanathan <dev@genotrance.com> | 2020-01-15 16:43:38 -0600 |
|---|---|---|
| committer | Ganesh Viswanathan <dev@genotrance.com> | 2020-01-15 16:43:38 -0600 |
| commit | fa1c4c636ce58e798dbbe9701a264987247765a8 (patch) | |
| tree | 60297c27f9b1604ddc5f61bf8f6eae5c1c5d4861 | |
| parent | b1a56279ffc1870760520f19b6f4f9e17971fbc5 (diff) | |
| parent | b863b1d170f6d442c93eb0774f4a66a2a1f2ba4b (diff) | |
| download | nimterop-fa1c4c636ce58e798dbbe9701a264987247765a8.tar.gz nimterop-fa1c4c636ce58e798dbbe9701a264987247765a8.zip | |
Merge v0.4.4 fixes
| -rw-r--r-- | nimterop.nimble | 4 | ||||
| -rw-r--r-- | nimterop/ast.nim | 26 | ||||
| -rw-r--r-- | nimterop/ast2.nim | 8 | ||||
| -rw-r--r-- | nimterop/build.nim | 4 | ||||
| -rw-r--r-- | nimterop/getters.nim | 12 | ||||
| -rw-r--r-- | nimterop/globals.nim | 18 | ||||
| -rw-r--r-- | nimterop/grammar.nim | 4 | ||||
| -rw-r--r-- | nimterop/toast.nim | 46 |
8 files changed, 60 insertions, 62 deletions
diff --git a/nimterop.nimble b/nimterop.nimble index 86be4dc..39a2346 100644 --- a/nimterop.nimble +++ b/nimterop.nimble @@ -1,6 +1,6 @@ # Package -version = "0.4.3" +version = "0.4.4" author = "genotrance" description = "C/C++ interop for Nim" license = "MIT" @@ -12,7 +12,7 @@ installDirs = @["nimterop"] installFiles = @["config.nims"] # Dependencies -requires "nim >= 0.19.2", "regex >= 0.10.0", "cligen >= 0.9.17" +requires "nim >= 0.19.6", "regex >= 0.13.0", "cligen >= 0.9.41" import nimterop/docs diff --git a/nimterop/ast.nim b/nimterop/ast.nim index fcd9411..8ffb850 100644 --- a/nimterop/ast.nim +++ b/nimterop/ast.nim @@ -83,7 +83,7 @@ proc searchAstForNode(ast: ref Ast, node: TSNode, nimState: NimState): bool = if nimState.gState.debug: nimState.nodeBranch.add $node.tsNodeType() - echo "#" & spaces(nimState.nodeBranch.len * 2) & nimState.nodeBranch[^1] + necho "#" & spaces(nimState.nodeBranch.len * 2) & nimState.nodeBranch[^1] if ast.children.nBl: if childNames.contains(ast.regex) or @@ -111,14 +111,14 @@ proc searchAstForNode(ast: ref Ast, node: TSNode, nimState: NimState): bool = result = node.saveNodeData(nimState) else: if nimState.gState.debug: - echo "#" & spaces(nimState.nodeBranch.len * 2) & &" {ast.getRegexForAstChildren()} !=~ {childNames}" + necho "#" & spaces(nimState.nodeBranch.len * 2) & &" {ast.getRegexForAstChildren()} !=~ {childNames}" elif node.getTSNodeNamedChildCountSansComments() == 0: result = node.saveNodeData(nimState) if nimState.gState.debug: discard nimState.nodeBranch.pop() if nimstate.nodeBranch.Bl: - echo "" + necho "" proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) = var @@ -133,7 +133,7 @@ proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) = if name in astTable: for ast in astTable[name]: if nimState.gState.debug: - echo "\n# " & nimState.getNodeVal(node).replace("\n", "\n# ") & "\n" + necho "\n# " & nimState.getNodeVal(node).replace("\n", "\n# ") & "\n" if searchAstForNode(ast, node, nimState): ast.tonim(ast, node, nimState) if nimState.gState.debug: @@ -166,8 +166,8 @@ proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) = if node == root: break -proc printNimHeader*() = - echo """# Generated at $1 +proc printNimHeader*(gState: State) = + gecho """# Generated at $1 # Command line: # $2 $3 @@ -194,32 +194,32 @@ proc printNim*(gState: State, fullpath: string, root: TSNode, astTable: AstTable root.searchAst(astTable, nimState) if nimState.enumStr.nBl: - echo &"{nimState.enumStr}\n" + necho &"{nimState.enumStr}\n" nimState.constStr = nimState.getOverrideFinal(nskConst) & nimState.constStr if nimState.constStr.nBl: - echo &"const{nimState.constStr}\n" + necho &"const{nimState.constStr}\n" - echo &""" + necho &""" {{.pragma: {nimState.impShort}, importc{nimState.getHeader()}.}} {{.pragma: {nimState.impShort}C, {nimState.impShort}, cdecl{nimState.getDynlib()}.}} """ nimState.typeStr = nimState.getOverrideFinal(nskType) & nimState.typeStr if nimState.typeStr.nBl: - echo &"type{nimState.typeStr}\n" + necho &"type{nimState.typeStr}\n" nimState.procStr = nimState.getOverrideFinal(nskProc) & nimState.procStr if nimState.procStr.nBl: - echo &"{nimState.procStr}\n" + necho &"{nimState.procStr}\n" if nimState.gState.debug: if nimState.debugStr.nBl: - echo nimState.debugStr + necho nimState.debugStr if nimState.skipStr.nBl: let hash = nimState.skipStr.hash().abs() sname = getTempDir() / &"nimterop_{$hash}.h" - echo &"# Writing skipped definitions to {sname}\n" + necho &"# Writing skipped definitions to {sname}\n" writeFile(sname, nimState.skipStr) diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim index 810beea..e6f3a63 100644 --- a/nimterop/ast2.nim +++ b/nimterop/ast2.nim @@ -1,6 +1,6 @@ import macros, os, strutils, tables, times -import compiler/[ast, astalgo, idents, options, renderer] +import compiler/[ast, idents, options, renderer] import "."/treesitter/api @@ -806,8 +806,8 @@ proc searchTree(nimState: NimState, root: TSNode) = if node == root: break -proc printNimHeader*() = - echo """# Generated at $1 +proc printNimHeader*(gState: State) = + gecho """# Generated at $1 # Command line: # $2 $3 @@ -845,4 +845,4 @@ proc printNim*(gState: State, fullpath: string, root: TSNode) = tree.add nimState.typeSection tree.add nimState.procSection - echo tree.renderTree() + gecho tree.renderTree() diff --git a/nimterop/build.nim b/nimterop/build.nim index 3eec406..7939afa 100644 --- a/nimterop/build.nim +++ b/nimterop/build.nim @@ -460,7 +460,7 @@ proc configure*(path, check: string, flags = "") = echo "# Running autogen.sh" echo execAction( - &"cd {(path / i).parentDir().sanitizePath} && bash autogen.sh").output + &"cd {(path / i).parentDir().sanitizePath} && bash ./autogen.sh").output break @@ -477,7 +477,7 @@ proc configure*(path, check: string, flags = "") = echo "# Running configure " & flags var - cmd = &"cd {path.sanitizePath} && bash configure" + cmd = &"cd {path.sanitizePath} && bash ./configure" if flags.len != 0: cmd &= &" {flags}" diff --git a/nimterop/getters.nim b/nimterop/getters.nim index 2469d1c..94bfbb3 100644 --- a/nimterop/getters.nim +++ b/nimterop/getters.nim @@ -445,20 +445,16 @@ proc printTree*(nimState: NimState, pnode: PNode, offset = "") = else: stdout.write ")" if offset.len == 0: - echo "" - -template decho*(str: untyped): untyped = - if nimState.gState.debug: - echo str.getCommented() + necho "" proc printDebug*(nimState: NimState, node: TSNode) = if nimState.gState.debug: - echo ("Input => " & nimState.getNodeVal(node)).getCommented() - echo nimState.gState.printLisp(node).getCommented() + necho ("Input => " & nimState.getNodeVal(node)).getCommented() + necho nimState.gState.printLisp(node).getCommented() proc printDebug*(nimState: NimState, pnode: PNode) = if nimState.gState.debug: - echo ("Output => " & $pnode).getCommented() + necho ("Output => " & $pnode).getCommented() nimState.printTree(pnode) # Compiler shortcuts diff --git a/nimterop/globals.nim b/nimterop/globals.nim index e123dd7..cc7d499 100644 --- a/nimterop/globals.nim +++ b/nimterop/globals.nim @@ -45,6 +45,8 @@ type onSymbol*, onSymbolOverride*: OnSymbol onSymbolOverrideFinal*: OnSymbolOverrideFinal + outputHandle*: File + NimState {.used.} = ref object identifiers*: TableRef[string, string] @@ -83,3 +85,19 @@ const modeDefault {.used.} = $cpp # TODO: USE this everywhere relevant when not declared(CIMPORT): export gAtoms, gExpressions, gEnumVals, State, NimState, nBl, Bl, CompileMode, modeDefault + + # Redirect output to file when required + template gecho*(args: string) {.dirty.} = + if gState.outputHandle.isNil: + echo args + else: + gState.outputHandle.writeLine(args) + + template necho*(args: string) {.dirty.} = + let gState = nimState.gState + gecho args + + template decho*(str: untyped): untyped = + if nimState.gState.debug: + let gState = nimState.gState + necho str.getCommented() diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim index 9f50ba4..ba0e9fc 100644 --- a/nimterop/grammar.nim +++ b/nimterop/grammar.nim @@ -735,7 +735,7 @@ proc parseGrammar*(): AstTable = else: result[n].add(ast) -proc printGrammar*(astTable: AstTable) = +proc printGrammar*(gState: State, astTable: AstTable) = for name in astTable.keys(): for ast in astTable[name]: - echo ast.printAst() + gecho ast.printAst() diff --git a/nimterop/toast.nim b/nimterop/toast.nim index f775738..1909c4a 100644 --- a/nimterop/toast.nim +++ b/nimterop/toast.nim @@ -42,11 +42,11 @@ proc process(gState: State, path: string) = tree.tsTreeDelete() if gState.past: - echo gState.printLisp(root) + gecho gState.printLisp(root) elif gState.pnim: gState.printNim(path, root) elif gState.preprocess: - echo gState.code + gecho gState.code # CLI processing with default values proc main( @@ -99,43 +99,34 @@ proc main( if pluginSourcePath.nBl: gState.loadPlugin(pluginSourcePath) - # Backup stdout var outputFile = output - outputHandle: File - stdoutBackup = stdout check = check or stub - # Fix output file extention - if outputFile.len != 0: + # Fix output file extention for Nim mode + if outputFile.len != 0 and pnim: if outputFile.splitFile().ext != ".nim": outputFile = outputFile & ".nim" # Check needs a file if check and outputFile.len == 0: outputFile = getTempDir() / "toast_" & ($getTime().toUnix()).addFileExt("nim") - when defined(windows): - # https://github.com/nim-lang/Nim/issues/12939 - echo &"Cannot print wrapper with check on Windows, review {outputFile}\n" # Redirect output to file if outputFile.len != 0: - when defined(windows): - doAssert stdout.reopen(outputFile, fmWrite), &"Failed to write to {outputFile}" - else: - doAssert outputHandle.open(outputFile, fmWrite), &"Failed to write to {outputFile}" - stdout = outputHandle + doAssert gState.outputHandle.open(outputFile, fmWrite), + &"Failed to write to {outputFile}" if source.nBl: # Print source after preprocess or Nim output if gState.pnim: - printNimHeader() + gState.printNimHeader() for src in source: gState.process(src.expandSymlinkAbs()) - when not defined(windows): - # Restore stdout - stdout = stdoutBackup + # Close outputFile + if outputFile.len != 0: + gState.outputHandle.close() # Check Nim output if gState.pnim and check: @@ -145,12 +136,6 @@ proc main( if err != 0: # Failed check so try stubbing if stub: - # Close output file to prepend stubs - when not defined(windows): - outputHandle.close() - else: - stdout.close() - # Find undeclared identifiers in error var data = "" @@ -177,14 +162,13 @@ proc main( # Rerun nim check on stubbed wrapper (check, err) = execCmdEx(&"{gState.nim} check {outputFile}") - doAssert err == 0, "# Nim check with stub failed:\n\n" & check + doAssert err == 0, data & "\n# Nim check with stub failed:\n\n" & check else: - doAssert err == 0, "# Nim check failed:\n\n" & check + doAssert err == 0, outputFile.readFile() & "\n# Nim check failed:\n\n" & check - when not defined(windows): - # Print wrapper if temporarily redirected to file - if check and output.len == 0: - stdout.write outputFile.readFile() + # Print wrapper if temporarily redirected to file + if check and output.len == 0: + stdout.write outputFile.readFile() when isMainModule: # Setup cligen command line help and short flags |
