diff options
author | George Marques <george@gmarqu.es> | 2018-08-21 13:38:18 -0300 |
---|---|---|
committer | George Marques <george@gmarqu.es> | 2018-08-21 13:38:18 -0300 |
commit | abbdb9d9514ff1299a3a7cec044eaf735273cad3 (patch) | |
tree | 9375373b70f93f56db0f7e9fe40f76e609bfd15c | |
parent | d97624e2954dc5180f2ae28d8aab9c8eaaff2954 (diff) |
GDScript: Forbid invalid identifiers in match bindings
Also forbid shadowing a variable from an upper scope.
-rw-r--r-- | modules/gdscript/gdscript_parser.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index bec314866d..841bb3e610 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -2024,12 +2024,20 @@ GDScriptParser::PatternNode *GDScriptParser::_parse_pattern(bool p_static) { // bind case GDScriptTokenizer::TK_PR_VAR: { tokenizer->advance(); + if (!tokenizer->is_token_literal()) { + _set_error("Expected identifier for binding variable name."); + return NULL; + } pattern->pt_type = GDScriptParser::PatternNode::PT_BIND; pattern->bind = tokenizer->get_token_identifier(); - // Check if binding is already used - if (current_block->variables.has(pattern->bind)) { - _set_error("Binding name of '" + pattern->bind.operator String() + "' was already used in the pattern."); - return NULL; + // Check if variable name is already used + BlockNode *bl = current_block; + while (bl) { + if (bl->variables.has(pattern->bind)) { + _set_error("Binding name of '" + pattern->bind.operator String() + "' is already declared in this scope."); + return NULL; + } + bl = bl->parent_block; } // Create local variable for proper identifier detection later LocalVarNode *lv = alloc_node<LocalVarNode>(); |