mirror of
https://github.com/RustPython/Parser.git
synced 2025-07-09 22:25:23 +00:00
Calculate import level at parsing
This commit is contained in:
parent
a6808efab7
commit
96e49f195d
2 changed files with 24 additions and 2 deletions
|
@ -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),
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue