diff options
author | Yakov Borevich <j.borevich@gmail.com> | 2016-05-30 18:22:34 +0300 |
---|---|---|
committer | Yakov Borevich <j.borevich@gmail.com> | 2016-05-30 18:22:34 +0300 |
commit | 9e86b2714faa295df6c0dd8be207862ef0c67c0e (patch) | |
tree | 7fad77bfdf8252909f7d76aadf1885e8dec1e3f6 | |
parent | 8a70c6eaf1f7a1ceae94edf68103526d0fcdf22a (diff) |
[GDScript] Redefine var results in an error
Error rised if redefine
- function argument
- for-loop argument
- local-scope var
Affects #3730
-rw-r--r-- | modules/gdscript/gd_parser.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index 9e90027a70..901a458179 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -1538,6 +1538,24 @@ void GDParser::_parse_block(BlockNode *p_block,bool p_static) { } StringName n = tokenizer->get_token_identifier(); tokenizer->advance(); + if (current_function){ + for (int i=0;i<current_function->arguments.size();i++){ + if (n == current_function->arguments[i]){ + _set_error("Variable '"+String(n)+"' already defined in the scope (at line: "+itos(current_function->line)+")."); + return; + } + } + } + BlockNode *check_block = p_block; + while (check_block){ + for (int i=0;i<check_block->variables.size();i++){ + if (n == check_block->variables[i]){ + _set_error("Variable '"+String(n)+"' already defined in the scope (at line: "+itos(check_block->variable_lines[i])+")."); + return; + } + } + check_block = check_block->parent_block; + } p_block->variables.push_back(n); //line? p_block->variable_lines.push_back(tokenizer->get_token_line()); @@ -1796,7 +1814,14 @@ void GDParser::_parse_block(BlockNode *p_block,bool p_static) { } current_block=cf_for->body; + + // this is for checking variable for redefining + // inside this _parse_block + cf_for->body->variables.push_back(id->name); + cf_for->body->variable_lines.push_back(id->line); _parse_block(cf_for->body,p_static); + cf_for->body->variables.remove(0); + cf_for->body->variable_lines.remove(0); current_block=p_block; if (error_set) |