Override known, addIdentifier
This commit is contained in:
parent
8eb950d46d
commit
9b6469ca97
3 changed files with 59 additions and 47 deletions
|
|
@ -172,8 +172,8 @@ proc getToast(fullpath: string, recurse: bool = false, dynlib: string = "",
|
|||
macro cOverride*(body): untyped =
|
||||
## When the wrapper code generated by nimterop is missing certain symbols or not
|
||||
## accurate, it may be required to hand wrap them. Define them in a
|
||||
## `cOverride() <cimport.html#cOverride.m>`_ macro block so that Nimterop no
|
||||
## longer defines these symbols.
|
||||
## `cOverride() <cimport.html#cOverride.m>`_ macro block so that Nimterop uses
|
||||
## these definitions instead.
|
||||
##
|
||||
## For example:
|
||||
##
|
||||
|
|
@ -195,8 +195,8 @@ macro cOverride*(body): untyped =
|
|||
## proc svGetCallerInfo(fileName: var cstring; lineNumber: var cint)
|
||||
##
|
||||
## Using the `cOverride() <cimport.html#cOverride.m>`_ block, nimterop
|
||||
## can be instructed to skip over `svGetCallerInfo()`. This works for procs,
|
||||
## consts and types.
|
||||
## can be instructed to use this definition of `svGetCallerInfo()` instead.
|
||||
## This works for procs, consts and types.
|
||||
##
|
||||
## `cOverride() <cimport.html#cOverride.m>`_ only affects calls to
|
||||
## `cImport() <cimport.html#cImport.m%2C%2Cstring%2Cstring%2Cstring>`_ that follow it.
|
||||
|
|
|
|||
|
|
@ -127,28 +127,6 @@ proc getIdentifier*(nimState: NimState, name: string, kind: NimSymKind, parent="
|
|||
else:
|
||||
result = ""
|
||||
|
||||
proc getOverride*(nimState: NimState, name: string, kind: NimSymKind): string =
|
||||
doAssert name.len != 0, "Blank identifier error"
|
||||
|
||||
if nimState.gState.onSymbolOverride != nil:
|
||||
var
|
||||
nname = nimState.getIdentifier(name, kind, "Parent")
|
||||
sym = Symbol(name: nname, kind: kind)
|
||||
nimState.gState.onSymbolOverride(sym)
|
||||
|
||||
result = sym.override
|
||||
|
||||
proc getOverrideFinal*(nimState: NimState, kind: NimSymKind): string =
|
||||
let
|
||||
typ = $kind
|
||||
|
||||
if nimState.gState.onSymbolOverrideFinal != nil:
|
||||
for i in nimState.gState.onSymbolOverrideFinal(typ):
|
||||
result &= "\n" & nimState.getOverride(i, kind)
|
||||
|
||||
if kind != nskProc:
|
||||
result = result.replace(re"(?m)^(.*?)$", " $1")
|
||||
|
||||
proc getUniqueIdentifier*(nimState: NimState, prefix = ""): string =
|
||||
var
|
||||
name = prefix & "_" & nimState.sourceFile.extractFilename().multiReplace([(".", ""), ("-", "")])
|
||||
|
|
@ -160,8 +138,8 @@ proc getUniqueIdentifier*(nimState: NimState, prefix = ""): string =
|
|||
|
||||
return name & $count
|
||||
|
||||
proc addNewIdentifer*(nimState: NimState, name: string): bool =
|
||||
if name notin nimState.gState.symOverride:
|
||||
proc addNewIdentifer*(nimState: NimState, name: string, override = false): bool =
|
||||
if override or name notin nimState.gState.symOverride:
|
||||
let
|
||||
nimName = name[0] & name[1 .. ^1].replace("_", "").toLowerAscii
|
||||
|
||||
|
|
@ -174,6 +152,30 @@ proc addNewIdentifer*(nimState: NimState, name: string): bool =
|
|||
nimState.identifiers[nimName] = name
|
||||
result = true
|
||||
|
||||
proc getOverride*(nimState: NimState, name: string, kind: NimSymKind): string =
|
||||
doAssert name.len != 0, "Blank identifier error"
|
||||
|
||||
if nimState.gState.onSymbolOverride != nil:
|
||||
var
|
||||
nname = nimState.getIdentifier(name, kind, "Override")
|
||||
sym = Symbol(name: nname, kind: kind)
|
||||
if nname.nBl:
|
||||
nimState.gState.onSymbolOverride(sym)
|
||||
|
||||
if sym.override.len != 0 and nimState.addNewIdentifer(nname, override = true):
|
||||
result = sym.override
|
||||
|
||||
if kind != nskProc:
|
||||
result = result.replace(re"(?m)^(.*?)$", " $1")
|
||||
|
||||
proc getOverrideFinal*(nimState: NimState, kind: NimSymKind): string =
|
||||
let
|
||||
typ = $kind
|
||||
|
||||
if nimState.gState.onSymbolOverrideFinal != nil:
|
||||
for i in nimState.gState.onSymbolOverrideFinal(typ):
|
||||
result &= "\n" & nimState.getOverride(i, kind)
|
||||
|
||||
proc getPtrType*(str: string): string =
|
||||
result = case str:
|
||||
of "ptr cchar":
|
||||
|
|
|
|||
|
|
@ -20,22 +20,19 @@ proc initGrammar(): Grammar =
|
|||
nimState.debugStr &= "\n# define X Y"
|
||||
|
||||
let
|
||||
name = nimState.getIdentifier(nimState.data[0].val, nskConst)
|
||||
name = nimState.data[0].val
|
||||
nname = nimState.getIdentifier(name, nskConst)
|
||||
val = nimState.data[1].val.getLit()
|
||||
|
||||
if name.nBl:
|
||||
if val.nBl:
|
||||
if nimState.addNewIdentifer(name):
|
||||
nimState.constStr &= &"{nimState.getComments()}\n {name}* = {val}"
|
||||
if not nname.nBl:
|
||||
let
|
||||
override = nimState.getOverride(name, nskConst)
|
||||
if override.len != 0:
|
||||
nimState.constStr &= &"{nimState.getComments()}\n{override}"
|
||||
else:
|
||||
let
|
||||
override = nimState.getOverride(name, nskConst)
|
||||
|
||||
if override.len != 0:
|
||||
if nimState.addNewIdentifer(name):
|
||||
nimState.constStr &= &"{nimState.getComments()}\n {override}"
|
||||
else:
|
||||
nimState.constStr &= &"{nimState.getComments()}\n # Const '{name}' skipped"
|
||||
nimState.constStr &= &"{nimState.getComments()}\n # Const '{name}' skipped"
|
||||
elif val.nBl and nimState.addNewIdentifer(nname):
|
||||
nimState.constStr &= &"{nimState.getComments()}\n {nname}* = {val}"
|
||||
))
|
||||
|
||||
let
|
||||
|
|
@ -183,7 +180,12 @@ proc initGrammar(): Grammar =
|
|||
let
|
||||
pragma = nimState.getPragma(pragmas)
|
||||
|
||||
if nname notin gTypeMap and typ.nBl and nname.nBl and nimState.addNewIdentifer(nname):
|
||||
if not nname.nBl:
|
||||
let
|
||||
override = nimState.getOverride(name, nskType)
|
||||
if override.len != 0:
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n{override}"
|
||||
elif nname notin gTypeMap and typ.nBl and nimState.addNewIdentifer(nname):
|
||||
if i < nimState.data.len and nimState.data[^1].name == "function_declarator":
|
||||
var
|
||||
fname = nname
|
||||
|
|
@ -274,7 +276,12 @@ proc initGrammar(): Grammar =
|
|||
union = ", union"
|
||||
break
|
||||
|
||||
if nname.nBl and nimState.addNewIdentifer(nname):
|
||||
if not nname.nBl:
|
||||
let
|
||||
override = nimState.getOverride(name, nskType)
|
||||
if override.len != 0:
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n{override}"
|
||||
elif nimState.addNewIdentifer(nname):
|
||||
if nimState.data.len == 1:
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n {nname}* {{.bycopy{union}.}} = object"
|
||||
else:
|
||||
|
|
@ -612,7 +619,12 @@ proc initGrammar(): Grammar =
|
|||
if pout.len != 0 and pout[^2 .. ^1] == ", ":
|
||||
pout = pout[0 .. ^3]
|
||||
|
||||
if fnname.nBl and nimState.addNewIdentifer(fnname):
|
||||
if not fnname.nBl:
|
||||
let
|
||||
override = nimState.getOverride(fname, nskProc)
|
||||
if override.len != 0:
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n{override}"
|
||||
elif nimState.addNewIdentifer(fnname):
|
||||
let
|
||||
ftyp = nimState.getIdentifier(nimState.data[0].val, nskType, fnname).getType()
|
||||
pragma = nimState.getPragma(nimState.getImportC(fname, fnname), "cdecl")
|
||||
|
|
@ -671,9 +683,7 @@ proc initGrammar(): Grammar =
|
|||
override = nimState.getOverride(i.val, nskType)
|
||||
|
||||
if override.len != 0:
|
||||
let
|
||||
override = override.replace(re"(?m)^(.*?)$", " $1")
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n{override} #" & $nimState.data
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n{override}"
|
||||
else:
|
||||
nimState.typeStr &= &"{nimState.getComments()}\n # Type '{i.val}' skipped"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue