Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
* Added support for Python 3.14 (#1282)

### Fixed
* Fix a bug where `import` refers would incorrectly be applied to all import modules in the same form (#1274)

### Removed
* Removed support for Python 3.9 (#1283)

Expand All @@ -33,7 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
* Fix a bug where protocols with methods with leading hyphens in method names could not be defined (#1230)
* Fix a bug where attempting to `:refer` a non-existent Var from another namespace would throw an unhelpful exception (#1231)
* Fixed a bug where `(range 0)` would return `(0)` rather than than `()` as expected (#1258)
* Fix a bug where `(range 0)` would return `(0)` rather than `()` as expected (#1258)

## [v0.3.8]
### Added
Expand Down
7 changes: 4 additions & 3 deletions src/basilisp/lang/compiler/analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2574,8 +2574,9 @@ def _do_warn_on_import_or_require_name_clash(
def _import_ast(form: ISeq, ctx: AnalyzerContext) -> Import:
assert form.first == SpecialForm.IMPORT

aliases, refers, refer_all = [], [], False
aliases = []
for f in form.rest: # pylint: disable=too-many-nested-blocks
refers, refer_all = [], False
if isinstance(f, sym.Symbol):
module_name = f
module_alias = None
Expand Down Expand Up @@ -2678,6 +2679,8 @@ def _import_ast(form: ISeq, ctx: AnalyzerContext) -> Import:
form=f,
name=module_name.name,
alias=module_alias,
refers=refers,
refer_all=refer_all,
env=ctx.get_node_env(),
)
)
Expand All @@ -2691,8 +2694,6 @@ def _import_ast(form: ISeq, ctx: AnalyzerContext) -> Import:
return Import(
form=form,
aliases=aliases,
refers=refers,
refer_all=refer_all,
env=ctx.get_node_env(pos=ctx.syntax_position),
)

Expand Down
6 changes: 3 additions & 3 deletions src/basilisp/lang/compiler/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2411,7 +2411,7 @@ def _import_to_py_ast(ctx: GeneratorContext, node: Import) -> GeneratedPyAST[ast
)

refers: Optional[ast.expr] = None
if node.refer_all:
if alias.refer_all:
key, val = genname("k"), genname("v")
refers = ast.DictComp(
key=ast.Call(
Expand Down Expand Up @@ -2447,10 +2447,10 @@ def _import_to_py_ast(ctx: GeneratorContext, node: Import) -> GeneratedPyAST[ast
)
],
)
elif node.refers:
elif alias.refers:
refer_keys: list[Optional[ast.expr]] = []
refer_vals: list[ast.expr] = []
for refer in node.refers:
for refer in alias.refers:
refer_keys.append(
ast.Call(
func=_NEW_SYM_FN_NAME, args=[ast.Constant(refer)], keywords=[]
Expand Down
4 changes: 2 additions & 2 deletions src/basilisp/lang/compiler/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -613,8 +613,6 @@ class If(Node[SpecialForm]):
class Import(Node[SpecialForm]):
form: SpecialForm
aliases: Iterable["ImportAlias"]
refers: Iterable[str]
refer_all: bool
env: NodeEnv = attr.field(hash=False)
children: Sequence[kw.Keyword] = vec.EMPTY
op: NodeOp = NodeOp.IMPORT
Expand All @@ -627,6 +625,8 @@ class ImportAlias(Node[Union[sym.Symbol, vec.PersistentVector]]):
form: Union[sym.Symbol, vec.PersistentVector]
name: str
alias: Optional[str]
refers: Iterable[str]
refer_all: bool
env: NodeEnv = attr.field(hash=False)
children: Sequence[kw.Keyword] = vec.EMPTY
op: NodeOp = NodeOp.IMPORT_ALIAS
Expand Down
11 changes: 11 additions & 0 deletions tests/basilisp/compiler_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3572,6 +3572,17 @@ def test_multi_import(self, lcompile: CompileFn):
)
)

def test_multi_import_with_refer(self, lcompile: CompileFn):
import sys
from os import mkdir

assert [sys, mkdir] == list(
lcompile("(import sys [os :refer [mkdir]]) [sys mkdir]")
)
assert [sys, mkdir] == list(
lcompile("(import [os :refer [mkdir]] sys) [sys mkdir]")
)

def test_nested_imports_visible_with_parent(self, lcompile: CompileFn):
import collections.abc

Expand Down