Initial ast2 pragma support
This commit is contained in:
parent
795f607e96
commit
2d45c6adf6
5 changed files with 107 additions and 60 deletions
|
|
@ -4,6 +4,42 @@ import regex
|
||||||
|
|
||||||
import "."/[getters, globals, treesitter/api]
|
import "."/[getters, globals, treesitter/api]
|
||||||
|
|
||||||
|
proc getHeaderPragma*(nimState: NimState): string =
|
||||||
|
result =
|
||||||
|
if nimState.includeHeader():
|
||||||
|
&", header: {nimState.currentHeader}"
|
||||||
|
else:
|
||||||
|
""
|
||||||
|
|
||||||
|
proc getDynlib*(nimState: NimState): string =
|
||||||
|
result =
|
||||||
|
if nimState.gState.dynlib.nBl:
|
||||||
|
&", dynlib: {nimState.gState.dynlib}"
|
||||||
|
else:
|
||||||
|
""
|
||||||
|
|
||||||
|
proc getImportC*(nimState: NimState, origName, nimName: string): string =
|
||||||
|
if nimName != origName:
|
||||||
|
result = &"importc: \"{origName}\"{nimState.getHeaderPragma()}"
|
||||||
|
else:
|
||||||
|
result = nimState.impShort
|
||||||
|
|
||||||
|
proc getPragma*(nimState: NimState, pragmas: varargs[string]): string =
|
||||||
|
result = ""
|
||||||
|
for pragma in pragmas.items():
|
||||||
|
if pragma.nBl:
|
||||||
|
result &= pragma & ", "
|
||||||
|
if result.nBl:
|
||||||
|
result = " {." & result[0 .. ^3] & ".}"
|
||||||
|
|
||||||
|
result = result.replace(nimState.impShort & ", cdecl", nimState.impShort & "C")
|
||||||
|
|
||||||
|
let
|
||||||
|
dy = nimState.getDynlib()
|
||||||
|
|
||||||
|
if ", cdecl" in result and dy.nBl:
|
||||||
|
result = result.replace(".}", dy & ".}")
|
||||||
|
|
||||||
proc saveNodeData(node: TSNode, nimState: NimState): bool =
|
proc saveNodeData(node: TSNode, nimState: NimState): bool =
|
||||||
let name = $node.tsNodeType()
|
let name = $node.tsNodeType()
|
||||||
|
|
||||||
|
|
@ -178,7 +214,7 @@ proc printNim*(gState: State, fullpath: string, root: TSNode, astTable: AstTable
|
||||||
nimState.impShort = nimState.currentHeader.replace("header", "imp")
|
nimState.impShort = nimState.currentHeader.replace("header", "imp")
|
||||||
nimState.sourceFile = fullpath
|
nimState.sourceFile = fullpath
|
||||||
|
|
||||||
if nimState.gState.dynlib.Bl and nimState.gState.includeHeader:
|
if nimState.includeHeader():
|
||||||
nimState.constStr &= &"\n {nimState.currentHeader} {{.used.}} = \"{fp}\""
|
nimState.constStr &= &"\n {nimState.currentHeader} {{.used.}} = \"{fp}\""
|
||||||
|
|
||||||
root.searchAst(astTable, nimState)
|
root.searchAst(astTable, nimState)
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,23 @@ proc addConst(nimState: NimState, node: TSNode) =
|
||||||
|
|
||||||
nimState.printDebug(constDef)
|
nimState.printDebug(constDef)
|
||||||
|
|
||||||
proc newPragma(nimState: NimState, node: TSNode, pragmas: OrderedTable[string, string]): PNode =
|
proc addPragma(nimState: NimState, node: TSNode, pragma: PNode, pragmas: OrderedTable[string, PNode]) =
|
||||||
|
# Add pragmas to an existing nkPragma tree
|
||||||
|
for name, value in pragmas.pairs:
|
||||||
|
let
|
||||||
|
(_, pinfo) = nimState.getNameInfo(node.getAtom(), nskUnknown)
|
||||||
|
pident = nimState.getIdent(name, pinfo, exported = false)
|
||||||
|
|
||||||
|
if value.isNil:
|
||||||
|
pragma.add pident
|
||||||
|
else:
|
||||||
|
let
|
||||||
|
colExpr = newNode(nkExprColonExpr)
|
||||||
|
colExpr.add pident
|
||||||
|
colExpr.add value
|
||||||
|
pragma.add colExpr
|
||||||
|
|
||||||
|
proc newPragma(nimState: NimState, node: TSNode, pragmas: OrderedTable[string, PNode]): PNode =
|
||||||
# Create nkPragma tree for name:value
|
# Create nkPragma tree for name:value
|
||||||
#
|
#
|
||||||
# {.name1, name2: value2.}
|
# {.name1, name2: value2.}
|
||||||
|
|
@ -120,22 +136,9 @@ proc newPragma(nimState: NimState, node: TSNode, pragmas: OrderedTable[string, s
|
||||||
# )
|
# )
|
||||||
# )
|
# )
|
||||||
result = newNode(nkPragma)
|
result = newNode(nkPragma)
|
||||||
for name, value in pragmas.pairs:
|
nimState.addPragma(node, result, pragmas)
|
||||||
let
|
|
||||||
(_, pinfo) = nimState.getNameInfo(node.getAtom(), nskUnknown)
|
|
||||||
pident = nimState.getIdent(name, pinfo, exported = false)
|
|
||||||
|
|
||||||
if value.len == 0:
|
|
||||||
result.add pident
|
|
||||||
else:
|
|
||||||
let
|
|
||||||
colExpr = newNode(nkExprColonExpr)
|
|
||||||
pvalue = newStrNode(nkStrLit, value)
|
|
||||||
colExpr.add pident
|
|
||||||
colExpr.add pvalue
|
|
||||||
result.add colExpr
|
|
||||||
|
|
||||||
proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: OrderedTable[string, string]): PNode =
|
proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: OrderedTable[string, PNode]): PNode =
|
||||||
# Create nkPragmaExpr tree
|
# Create nkPragmaExpr tree
|
||||||
#
|
#
|
||||||
# nkPragmaExpr(
|
# nkPragmaExpr(
|
||||||
|
|
@ -169,7 +172,9 @@ proc newTypeIdent(nimState: NimState, node: TSNode, override = "", union = false
|
||||||
nimState.getIdent(name, info)
|
nimState.getIdent(name, info)
|
||||||
prident =
|
prident =
|
||||||
if union:
|
if union:
|
||||||
nimState.newPragmaExpr(node, ident, {"union": ""}.toOrderedTable())
|
var
|
||||||
|
empty: PNode
|
||||||
|
nimState.newPragmaExpr(node, ident, {"union": empty}.toOrderedTable())
|
||||||
else:
|
else:
|
||||||
ident
|
ident
|
||||||
|
|
||||||
|
|
@ -1008,6 +1013,39 @@ proc searchTree(nimState: NimState, root: TSNode) =
|
||||||
if node == root:
|
if node == root:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
proc setupPragmas(nimState: NimState, root: TSNode, fullpath: string) =
|
||||||
|
var
|
||||||
|
impPragma = newNode(nkPragma)
|
||||||
|
impCPragma = newNode(nkPragma)
|
||||||
|
empty: PNode
|
||||||
|
|
||||||
|
nimState.addPragma(root, impPragma, {
|
||||||
|
"pragma": nimState.getIdent(nimState.impShort),
|
||||||
|
"importc": empty
|
||||||
|
}.toOrderedTable())
|
||||||
|
|
||||||
|
if nimState.includeHeader():
|
||||||
|
nimState.constSection.add nimState.newConstDef(
|
||||||
|
root, name = nimState.currentHeader, val = fullpath)
|
||||||
|
|
||||||
|
nimState.addPragma(root, impPragma, {
|
||||||
|
"header": newStrNode(nkStrLit, nimState.currentHeader)
|
||||||
|
}.toOrderedTable())
|
||||||
|
|
||||||
|
nimState.addPragma(root, impCPragma, {
|
||||||
|
"pragma": nimState.getIdent(nimState.impShort & "C"),
|
||||||
|
nimState.impShort: empty,
|
||||||
|
"cdecl": empty
|
||||||
|
}.toOrderedTable())
|
||||||
|
|
||||||
|
if nimState.gState.dynlib.nBl:
|
||||||
|
nimState.addPragma(root, impCPragma, {
|
||||||
|
"dynlib": nimState.getIdent(nimState.gState.dynlib)
|
||||||
|
}.toOrderedTable())
|
||||||
|
|
||||||
|
nimState.pragmaSection.add impPragma
|
||||||
|
nimState.pragmaSection.add impCPragma
|
||||||
|
|
||||||
proc printNimHeader*(gState: State) =
|
proc printNimHeader*(gState: State) =
|
||||||
gecho """# Generated at $1
|
gecho """# Generated at $1
|
||||||
# Command line:
|
# Command line:
|
||||||
|
|
@ -1035,19 +1073,19 @@ proc printNim*(gState: State, fullpath: string, root: TSNode) =
|
||||||
nimState.config = newConfigRef()
|
nimState.config = newConfigRef()
|
||||||
nimstate.graph = newModuleGraph(nimState.identCache, nimState.config)
|
nimstate.graph = newModuleGraph(nimState.identCache, nimState.config)
|
||||||
|
|
||||||
|
nimState.pragmaSection = newNode(nkStmtList)
|
||||||
nimState.constSection = newNode(nkConstSection)
|
nimState.constSection = newNode(nkConstSection)
|
||||||
nimState.enumSection = newNode(nkStmtList)
|
nimState.enumSection = newNode(nkStmtList)
|
||||||
nimState.procSection = newNode(nkStmtList)
|
nimState.procSection = newNode(nkStmtList)
|
||||||
nimState.typeSection = newNode(nkTypeSection)
|
nimState.typeSection = newNode(nkTypeSection)
|
||||||
|
|
||||||
if nimState.gState.dynlib.Bl and nimState.gState.includeHeader:
|
nimState.setupPragmas(root, fp)
|
||||||
nimState.constSection.add nimState.newConstDef(
|
|
||||||
root, name = nimState.currentHeader, val = fp)
|
|
||||||
|
|
||||||
nimState.searchTree(root)
|
nimState.searchTree(root)
|
||||||
|
|
||||||
var
|
var
|
||||||
tree = newNode(nkStmtList)
|
tree = newNode(nkStmtList)
|
||||||
|
tree.add nimState.pragmaSection
|
||||||
tree.add nimState.enumSection
|
tree.add nimState.enumSection
|
||||||
tree.add nimState.constSection
|
tree.add nimState.constSection
|
||||||
tree.add nimState.typeSection
|
tree.add nimState.typeSection
|
||||||
|
|
|
||||||
|
|
@ -426,6 +426,9 @@ proc printDebug*(nimState: NimState, pnode: PNode) =
|
||||||
|
|
||||||
# Compiler shortcuts
|
# Compiler shortcuts
|
||||||
|
|
||||||
|
proc getDefaultLineInfo*(nimState: NimState): TLineInfo =
|
||||||
|
result = newLineInfo(nimState.config, nimState.sourceFile.AbsoluteFile, -1, -1)
|
||||||
|
|
||||||
proc getLineInfo*(nimState: NimState, node: TSNode): TLineInfo =
|
proc getLineInfo*(nimState: NimState, node: TSNode): TLineInfo =
|
||||||
# Get Nim equivalent line:col info from node
|
# Get Nim equivalent line:col info from node
|
||||||
let
|
let
|
||||||
|
|
@ -446,6 +449,9 @@ proc getIdent*(nimState: NimState, name: string, info: TLineInfo, exported = tru
|
||||||
else:
|
else:
|
||||||
result = newIdentNode(ident, info)
|
result = newIdentNode(ident, info)
|
||||||
|
|
||||||
|
proc getIdent*(nimState: NimState, name: string): PNode =
|
||||||
|
nimState.getIdent(name, nimState.getDefaultLineInfo(), exported = false)
|
||||||
|
|
||||||
proc getNameInfo*(nimState: NimState, node: TSNode, kind: NimSymKind, parent = ""):
|
proc getNameInfo*(nimState: NimState, node: TSNode, kind: NimSymKind, parent = ""):
|
||||||
tuple[name: string, info: TLineInfo] =
|
tuple[name: string, info: TLineInfo] =
|
||||||
# Shortcut to get identifier name and info (node value and line:col)
|
# Shortcut to get identifier name and info (node value and line:col)
|
||||||
|
|
@ -648,41 +654,8 @@ proc getSplitComma*(joined: seq[string]): seq[string] =
|
||||||
for i in joined:
|
for i in joined:
|
||||||
result = result.concat(i.split(","))
|
result = result.concat(i.split(","))
|
||||||
|
|
||||||
proc getHeaderPragma*(nimState: NimState): string =
|
template includeHeader*(nimState: NimState): bool =
|
||||||
result =
|
nimState.gState.dynlib.Bl and nimState.gState.includeHeader
|
||||||
if nimState.gState.dynlib.Bl and nimState.gState.includeHeader:
|
|
||||||
&", header: {nimState.currentHeader}"
|
|
||||||
else:
|
|
||||||
""
|
|
||||||
|
|
||||||
proc getDynlib*(nimState: NimState): string =
|
|
||||||
result =
|
|
||||||
if nimState.gState.dynlib.nBl:
|
|
||||||
&", dynlib: {nimState.gState.dynlib}"
|
|
||||||
else:
|
|
||||||
""
|
|
||||||
|
|
||||||
proc getImportC*(nimState: NimState, origName, nimName: string): string =
|
|
||||||
if nimName != origName:
|
|
||||||
result = &"importc: \"{origName}\"{nimState.getHeaderPragma()}"
|
|
||||||
else:
|
|
||||||
result = nimState.impShort
|
|
||||||
|
|
||||||
proc getPragma*(nimState: NimState, pragmas: varargs[string]): string =
|
|
||||||
result = ""
|
|
||||||
for pragma in pragmas.items():
|
|
||||||
if pragma.nBl:
|
|
||||||
result &= pragma & ", "
|
|
||||||
if result.nBl:
|
|
||||||
result = " {." & result[0 .. ^3] & ".}"
|
|
||||||
|
|
||||||
result = result.replace(nimState.impShort & ", cdecl", nimState.impShort & "C")
|
|
||||||
|
|
||||||
let
|
|
||||||
dy = nimState.getDynlib()
|
|
||||||
|
|
||||||
if ", cdecl" in result and dy.nBl:
|
|
||||||
result = result.replace(".}", dy & ".}")
|
|
||||||
|
|
||||||
proc getComments*(nimState: NimState, strip = false): string =
|
proc getComments*(nimState: NimState, strip = false): string =
|
||||||
if not nimState.gState.nocomments and nimState.commentStr.nBl:
|
if not nimState.gState.nocomments and nimState.commentStr.nBl:
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ type
|
||||||
|
|
||||||
# Nim compiler objects
|
# Nim compiler objects
|
||||||
when not declared(CIMPORT):
|
when not declared(CIMPORT):
|
||||||
constSection*, enumSection*, procSection*, typeSection*: PNode
|
pragmaSection*, constSection*, enumSection*, procSection*, typeSection*: PNode
|
||||||
identCache*: IdentCache
|
identCache*: IdentCache
|
||||||
config*: ConfigRef
|
config*: ConfigRef
|
||||||
graph*: ModuleGraph
|
graph*: ModuleGraph
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import macros, strformat, strutils, tables
|
||||||
|
|
||||||
import regex
|
import regex
|
||||||
|
|
||||||
import "."/[getters, globals, lisp, treesitter/api]
|
import "."/[ast, getters, globals, lisp, treesitter/api]
|
||||||
|
|
||||||
type
|
type
|
||||||
Grammar = seq[tuple[grammar: string, call: proc(ast: ref Ast, node: TSNode, nimState: NimState) {.nimcall.}]]
|
Grammar = seq[tuple[grammar: string, call: proc(ast: ref Ast, node: TSNode, nimState: NimState) {.nimcall.}]]
|
||||||
|
|
@ -200,7 +200,7 @@ proc initGrammar(): Grammar =
|
||||||
nname = nimState.getIdentifier(name, nskType)
|
nname = nimState.getIdentifier(name, nskType)
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
if nimState.gState.dynlib.Bl and nimState.gState.includeHeader:
|
if nimState.includeHeader():
|
||||||
pragmas.add nimState.getImportC(name, nname)
|
pragmas.add nimState.getImportC(name, nname)
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
@ -316,7 +316,7 @@ proc initGrammar(): Grammar =
|
||||||
else:
|
else:
|
||||||
var
|
var
|
||||||
pragmas: seq[string] = @[]
|
pragmas: seq[string] = @[]
|
||||||
if nimState.gState.dynlib.Bl and nimState.gState.includeHeader:
|
if nimState.includeHeader():
|
||||||
pragmas.add nimState.getImportC(prefix & name, nname)
|
pragmas.add nimState.getImportC(prefix & name, nname)
|
||||||
pragmas.add "bycopy"
|
pragmas.add "bycopy"
|
||||||
if union.nBl:
|
if union.nBl:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue