diff options
| author | Ganesh Viswanathan <dev@genotrance.com> | 2019-10-21 18:43:53 -0500 |
|---|---|---|
| committer | Ganesh Viswanathan <dev@genotrance.com> | 2019-10-21 18:43:53 -0500 |
| commit | 9b6469ca97b8614e6634379e8b7290b7dc4c8606 (patch) | |
| tree | 6e6aa01bfeaed4665f25c124abb999c63cd11325 | |
| parent | 8eb950d46df86466798e239efc60e864da345921 (diff) | |
| download | nimterop-9b6469ca97b8614e6634379e8b7290b7dc4c8606.tar.gz nimterop-9b6469ca97b8614e6634379e8b7290b7dc4c8606.zip | |
Override known, addIdentifier
| -rw-r--r-- | nimterop/cimport.nim | 8 | ||||
| -rw-r--r-- | nimterop/getters.nim | 50 | ||||
| -rw-r--r-- | nimterop/grammar.nim | 48 |
3 files changed, 59 insertions, 47 deletions
diff --git a/nimterop/cimport.nim b/nimterop/cimport.nim index 6eddd0b..87d5ba6 100644 --- a/nimterop/cimport.nim +++ b/nimterop/cimport.nim @@ -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. diff --git a/nimterop/getters.nim b/nimterop/getters.nim index ff7053a..9970981 100644 --- a/nimterop/getters.nim +++ b/nimterop/getters.nim @@ -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": diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim index 5bd8cba..767c8f8 100644 --- a/nimterop/grammar.nim +++ b/nimterop/grammar.nim @@ -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" |
