fix(emitter): avoid clj_ prefix on nim/ interop identifiers
The clj_ prefix added in fb8928e broke nim/module/proc interop because
native Nim identifiers were being mangled to clj_foo instead of foo.
- Extract sanitizeNimIdent from mangleName (does all cleanups except prefix)
- Use sanitizeNimIdent for nim/ interop function chains
- Regular Clojure symbols still get clj_ prefix via mangleName
Fixes BRing bringRunServer and other native Nim proc calls.
This commit is contained in:
+8
-5
@@ -35,7 +35,8 @@ proc resolveNsAlias*(name: string): string =
|
|||||||
type
|
type
|
||||||
EmitterError* = object of CatchableError
|
EmitterError* = object of CatchableError
|
||||||
|
|
||||||
proc mangleName*(name: string): string =
|
proc sanitizeNimIdent*(name: string): string =
|
||||||
|
## Sanitize a string to be a valid Nim identifier, without the clj_ prefix.
|
||||||
result = ""
|
result = ""
|
||||||
for c in name:
|
for c in name:
|
||||||
case c
|
case c
|
||||||
@@ -79,8 +80,9 @@ proc mangleName*(name: string): string =
|
|||||||
"interface", "lambda", "open", "quit", "result", "nil", "end"]
|
"interface", "lambda", "open", "quit", "result", "nil", "end"]
|
||||||
if result in nimKeywords:
|
if result in nimKeywords:
|
||||||
result = result & "1"
|
result = result & "1"
|
||||||
# Prefix to avoid conflicts with Nim identifiers (case-insensitive + underscore ignoring)
|
|
||||||
result = "clj_" & result
|
proc mangleName*(name: string): string =
|
||||||
|
result = "clj_" & sanitizeNimIdent(name)
|
||||||
|
|
||||||
proc pushScope() =
|
proc pushScope() =
|
||||||
scopeStack.add(initHashSet[string]())
|
scopeStack.add(initHashSet[string]())
|
||||||
@@ -1958,10 +1960,11 @@ proc emitSpecialForm(items: seq[CljVal], indent: int): string =
|
|||||||
let parts = op.replace(".", "/").split("/")
|
let parts = op.replace(".", "/").split("/")
|
||||||
if parts.len >= 3:
|
if parts.len >= 3:
|
||||||
let module = parts[1]
|
let module = parts[1]
|
||||||
# Mangle each part of the function chain for Nim identifier validity
|
# Sanitize each part of the function chain for Nim identifier validity
|
||||||
|
# (native Nim identifiers must NOT get the clj_ prefix)
|
||||||
var mangledParts: seq[string] = @[]
|
var mangledParts: seq[string] = @[]
|
||||||
for p in parts[2..^1]:
|
for p in parts[2..^1]:
|
||||||
mangledParts.add(mangleName(p))
|
mangledParts.add(sanitizeNimIdent(p))
|
||||||
var funcChain = mangledParts.join(".")
|
var funcChain = mangledParts.join(".")
|
||||||
# Strip ? suffix (Clojure convention) — not valid in Nim
|
# Strip ? suffix (Clojure convention) — not valid in Nim
|
||||||
if funcChain.endsWith("?"):
|
if funcChain.endsWith("?"):
|
||||||
|
|||||||
Reference in New Issue
Block a user