Fix nonlocal checks

Related to #2189
This commit is contained in:
minoring 2020-09-05 22:11:16 +09:00
parent a251109090
commit de7396347f

View file

@ -954,10 +954,10 @@ impl SymbolTableBuilder {
// Some checks: // Some checks:
let containing = table.symbols.contains_key(name); let containing = table.symbols.contains_key(name);
if containing { if containing {
let symbol = table.symbols.get(name).unwrap();
// Role already set.. // Role already set..
match role { match role {
SymbolUsage::Global => { SymbolUsage::Global => {
let symbol = table.symbols.get(name).unwrap();
if let SymbolScope::Global = symbol.scope { if let SymbolScope::Global = symbol.scope {
// Ok // Ok
} else { } else {
@ -968,10 +968,33 @@ impl SymbolTableBuilder {
} }
} }
SymbolUsage::Nonlocal => { SymbolUsage::Nonlocal => {
return Err(SymbolTableError { if symbol.is_parameter {
error: format!("name '{}' is used prior to nonlocal declaration", name), return Err(SymbolTableError {
location, error: format!("name '{}' is parameter and nonlocal", name),
}) location,
});
}
if symbol.is_referenced {
return Err(SymbolTableError {
error: format!("name '{}' is used prior to nonlocal declaration", name),
location,
});
}
if symbol.is_annotated {
return Err(SymbolTableError {
error: format!("annotated name '{}' can't be nonlocal", name),
location,
});
}
if symbol.is_assigned {
return Err(SymbolTableError {
error: format!(
"name '{}' is assigned to before nonlocal declaration",
name
),
location,
});
}
} }
_ => { _ => {
// Ok? // Ok?