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