Override known, addIdentifier

This commit is contained in:
Ganesh Viswanathan 2019-10-21 18:43:53 -05:00
commit 9b6469ca97
3 changed files with 59 additions and 47 deletions

View file

@ -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.

View file

@ -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":

View file

@ -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"