aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2019-10-21 18:43:53 -0500
committerGanesh Viswanathan <dev@genotrance.com>2019-10-21 18:43:53 -0500
commit9b6469ca97b8614e6634379e8b7290b7dc4c8606 (patch)
tree6e6aa01bfeaed4665f25c124abb999c63cd11325
parent8eb950d46df86466798e239efc60e864da345921 (diff)
downloadnimterop-9b6469ca97b8614e6634379e8b7290b7dc4c8606.tar.gz
nimterop-9b6469ca97b8614e6634379e8b7290b7dc4c8606.zip
Override known, addIdentifier
-rw-r--r--nimterop/cimport.nim8
-rw-r--r--nimterop/getters.nim50
-rw-r--r--nimterop/grammar.nim48
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"