Skip to content

Commit 9d24c00

Browse files
authored
Do not munge names when resolving names from imports (#125)
1 parent 475ac17 commit 9d24c00

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

basilisp/compiler.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import contextlib
44
import functools
55
import itertools
6+
import sys
67
import types
78
import uuid
89
from collections import OrderedDict
@@ -470,7 +471,7 @@ def _def_ast(ctx: CompilerContext, form: llist.List) -> ASTStream:
470471

471472
try:
472473
def_nodes, def_value = _nodes_and_expr(_to_ast(ctx, form[2]))
473-
except KeyError:
474+
except IndexError:
474475
def_nodes, def_value = [], None
475476

476477
meta_nodes, meta = _nodes_and_exprl(_meta_kwargs_ast(ctx, form[1]))
@@ -1448,8 +1449,25 @@ def _resolve_sym(ctx: CompilerContext, form: sym.Symbol) -> Optional[str]:
14481449

14491450
# Otherwise, try to direct-link it like a Python variable
14501451
safe_ns = munge(form.ns)
1452+
try:
1453+
ns_module = sys.modules[safe_ns]
1454+
except KeyError:
1455+
# This should never happen. A module listed in the namespace
1456+
# imports should always be imported already.
1457+
raise CompilerException(f"Module '{safe_ns}' is not imported")
1458+
1459+
# Try without allowing builtins first
14511460
safe_name = munge(form.name)
1452-
return f"{safe_ns}.{safe_name}"
1461+
if safe_name in ns_module.__dict__:
1462+
return f"{safe_ns}.{safe_name}"
1463+
1464+
# Then allow builtins
1465+
safe_name = munge(form.name, allow_builtins=True)
1466+
if safe_name in ns_module.__dict__:
1467+
return f"{safe_ns}.{safe_name}"
1468+
1469+
# If neither resolve, then defer to a Var.find
1470+
return None
14531471
elif ns_sym in ctx.current_ns.aliases:
14541472
aliased_ns = ctx.current_ns.aliases[ns_sym]
14551473
v = Var.find(sym.symbol(form.name, ns=aliased_ns))

0 commit comments

Comments
 (0)