Calculate import level at parsing

This commit is contained in:
Aviv Palivoda 2019-06-29 17:04:31 +03:00
parent a6808efab7
commit 96e49f195d
2 changed files with 24 additions and 2 deletions

View file

@ -51,9 +51,11 @@ pub enum Instruction {
Import { Import {
name: String, name: String,
symbols: Vec<String>, symbols: Vec<String>,
level: usize,
}, },
ImportStar { ImportStar {
name: String, name: String,
level: usize,
}, },
LoadName { LoadName {
name: String, name: String,
@ -327,11 +329,25 @@ impl Instruction {
($variant:ident, $var1:expr, $var2:expr) => { ($variant:ident, $var1:expr, $var2:expr) => {
write!(f, "{:20} ({}, {})\n", stringify!($variant), $var1, $var2) write!(f, "{:20} ({}, {})\n", stringify!($variant), $var1, $var2)
}; };
($variant:ident, $var1:expr, $var2:expr, $var3:expr) => {
write!(
f,
"{:20} ({}, {}, {})\n",
stringify!($variant),
$var1,
$var2,
$var3
)
};
} }
match self { match self {
Import { name, symbols } => w!(Import, name, format!("{:?}", symbols)), Import {
ImportStar { name } => w!(ImportStar, name), name,
symbols,
level,
} => w!(Import, name, format!("{:?}", symbols), level),
ImportStar { name, level } => w!(ImportStar, name, level),
LoadName { name, scope } => w!(LoadName, name, format!("{:?}", scope)), LoadName { name, scope } => w!(LoadName, name, format!("{:?}", scope)),
StoreName { name, scope } => w!(StoreName, name, format!("{:?}", scope)), StoreName { name, scope } => w!(StoreName, name, format!("{:?}", scope)),
DeleteName { name } => w!(DeleteName, name), DeleteName { name } => w!(DeleteName, name),

View file

@ -252,13 +252,16 @@ impl Compiler {
module, module,
symbols, symbols,
alias, alias,
level,
} in import_parts } in import_parts
{ {
let level = *level;
if let Some(alias) = alias { if let Some(alias) = alias {
// import module as alias // import module as alias
self.emit(Instruction::Import { self.emit(Instruction::Import {
name: module.clone(), name: module.clone(),
symbols: vec![], symbols: vec![],
level,
}); });
self.store_name(&alias); self.store_name(&alias);
} else if symbols.is_empty() { } else if symbols.is_empty() {
@ -266,6 +269,7 @@ impl Compiler {
self.emit(Instruction::Import { self.emit(Instruction::Import {
name: module.clone(), name: module.clone(),
symbols: vec![], symbols: vec![],
level,
}); });
self.store_name(&module.clone()); self.store_name(&module.clone());
} else { } else {
@ -276,6 +280,7 @@ impl Compiler {
// from module import * // from module import *
self.emit(Instruction::ImportStar { self.emit(Instruction::ImportStar {
name: module.clone(), name: module.clone(),
level,
}); });
} else { } else {
// from module import symbol // from module import symbol
@ -292,6 +297,7 @@ impl Compiler {
self.emit(Instruction::Import { self.emit(Instruction::Import {
name: module.clone(), name: module.clone(),
symbols: symbols_strings, symbols: symbols_strings,
level,
}); });
names.iter().rev().for_each(|name| self.store_name(&name)); names.iter().rev().for_each(|name| self.store_name(&name));
} }