mirror of
https://github.com/RustPython/Parser.git
synced 2025-07-24 21:44:45 +00:00
compiler: impl syntax error detect for global kind
This commit fixes `test_global_parap_err_first` test in [test_syntax.py](https://github.com/RustPython/RustPython/blob/master/Lib/test/test_syntax.py#L678) and implement the other syntax errors detection as cpython 3.8 provided for global symbol. Below syntax error conditions are added. * name {} is parameter and global ```python >>>>> def test(a): ..... global a ..... SyntaxError: name 'a' is parameter and global at line 2 column 2 global a ``` * annotated name {} can't be global ```python >>>>> def test(): ..... a: int ..... global a ..... SyntaxError: annotated name 'a' can't be global at line 3 column 2 global a ``` * name {} is assigned to before global description ```python >>>>> a = 100 >>>>> def test(): ..... a = 10 ..... global a ..... SyntaxError: name 'a' is assigned to before global declaration at line 3 column 2 global a ``` * name {} is used prior to global declaration ```python >>>>> a = 10 >>>>> def test(): ..... print(a) ..... global a ..... SyntaxError: name 'a' is used prior to global declaration at line 3 column 2 global a ``` Signed-off-by: snowapril <sinjihng@gmail.com>
This commit is contained in:
parent
9b0a82aed3
commit
0383dede81
1 changed files with 22 additions and 1 deletions
|
@ -1120,12 +1120,33 @@ impl SymbolTableBuilder {
|
||||||
// Role already set..
|
// Role already set..
|
||||||
match role {
|
match role {
|
||||||
SymbolUsage::Global => {
|
SymbolUsage::Global => {
|
||||||
if !symbol.is_global() {
|
if symbol.is_parameter {
|
||||||
|
return Err(SymbolTableError {
|
||||||
|
error: format!("name '{}' is parameter and global", name),
|
||||||
|
location,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if symbol.is_referenced {
|
||||||
return Err(SymbolTableError {
|
return Err(SymbolTableError {
|
||||||
error: format!("name '{}' is used prior to global declaration", name),
|
error: format!("name '{}' is used prior to global declaration", name),
|
||||||
location,
|
location,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if symbol.is_annotated {
|
||||||
|
return Err(SymbolTableError {
|
||||||
|
error: format!("annotated name '{}' can't be global", name),
|
||||||
|
location,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if symbol.is_assigned {
|
||||||
|
return Err(SymbolTableError {
|
||||||
|
error: format!(
|
||||||
|
"name '{}' is assigned to before global declaration",
|
||||||
|
name
|
||||||
|
),
|
||||||
|
location,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SymbolUsage::Nonlocal => {
|
SymbolUsage::Nonlocal => {
|
||||||
if symbol.is_parameter {
|
if symbol.is_parameter {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue