@@ -267,61 +267,63 @@ impl Compiler {
267267 self . set_source_location ( & statement. location ) ;
268268
269269 match & statement. node {
270- ast:: Statement :: Import { import_parts } => {
271- for ast:: SingleImport {
272- module,
273- symbols,
274- alias,
275- level,
276- } in import_parts
277- {
278- let level = * level;
279- if let Some ( alias) = alias {
280- // import module as alias
281- self . emit ( Instruction :: Import {
282- name : module. clone ( ) ,
283- symbols : vec ! [ ] ,
284- level,
285- } ) ;
286- self . store_name ( & alias) ;
287- } else if symbols. is_empty ( ) {
288- // import module
289- self . emit ( Instruction :: Import {
290- name : module. clone ( ) ,
291- symbols : vec ! [ ] ,
292- level,
293- } ) ;
294- self . store_name ( & module. clone ( ) ) ;
270+ ast:: Statement :: Import { names } => {
271+ // import a, b, c as d
272+ for name in names {
273+ self . emit ( Instruction :: Import {
274+ name : name. symbol . clone ( ) ,
275+ symbols : vec ! [ ] ,
276+ level : 0 ,
277+ } ) ;
278+
279+ if let Some ( alias) = & name. alias {
280+ self . store_name ( alias) ;
295281 } else {
296- let import_star = symbols
297- . iter ( )
298- . any ( |import_symbol| import_symbol. symbol == "*" ) ;
299- if import_star {
300- // from module import *
301- self . emit ( Instruction :: ImportStar {
302- name : module. clone ( ) ,
303- level,
304- } ) ;
282+ self . store_name ( & name. symbol ) ;
283+ }
284+ }
285+ }
286+ ast:: Statement :: ImportFrom {
287+ level,
288+ module,
289+ names,
290+ } => {
291+ let import_star = names. iter ( ) . any ( |n| n. symbol == "*" ) ;
292+
293+ if import_star {
294+ // from .... import *
295+ self . emit ( Instruction :: ImportStar {
296+ name : module. clone ( ) . unwrap ( ) ,
297+ level : * level,
298+ } ) ;
299+ } else {
300+ // from mod import a, b as c
301+ // First, determine the fromlist (for import lib):
302+ let from_list = names. iter ( ) . map ( |n| n. symbol . clone ( ) ) . collect ( ) ;
303+
304+ // Load module once:
305+ self . emit ( Instruction :: Import {
306+ name : module. clone ( ) . unwrap ( ) ,
307+ symbols : from_list,
308+ level : * level,
309+ } ) ;
310+
311+ for name in names {
312+ // import symbol from module:
313+ self . emit ( Instruction :: ImportFrom {
314+ name : name. symbol . to_string ( ) ,
315+ } ) ;
316+
317+ // Store module under proper name:
318+ if let Some ( alias) = & name. alias {
319+ self . store_name ( alias) ;
305320 } else {
306- // from module import symbol
307- // from module import symbol as alias
308- let ( names, symbols_strings) : ( Vec < String > , Vec < String > ) = symbols
309- . iter ( )
310- . map ( |ast:: ImportSymbol { symbol, alias } | {
311- (
312- alias. clone ( ) . unwrap_or_else ( || symbol. to_string ( ) ) ,
313- symbol. to_string ( ) ,
314- )
315- } )
316- . unzip ( ) ;
317- self . emit ( Instruction :: Import {
318- name : module. clone ( ) ,
319- symbols : symbols_strings,
320- level,
321- } ) ;
322- names. iter ( ) . rev ( ) . for_each ( |name| self . store_name ( & name) ) ;
321+ self . store_name ( & name. symbol ) ;
323322 }
324323 }
324+
325+ // Pop module from stack:
326+ self . emit ( Instruction :: Pop ) ;
325327 }
326328 }
327329 ast:: Statement :: Expression { expression } => {
0 commit comments