瀏覽代碼

GDScript: Forbid invalid identifiers in match bindings

Also forbid shadowing a variable from an upper scope.
George Marques 7 年之前
父節點
當前提交
abbdb9d951
共有 1 個文件被更改,包括 12 次插入4 次删除
  1. 12 4
      modules/gdscript/gdscript_parser.cpp

+ 12 - 4
modules/gdscript/gdscript_parser.cpp

@@ -2024,12 +2024,20 @@ GDScriptParser::PatternNode *GDScriptParser::_parse_pattern(bool p_static) {
 		// bind
 		// bind
 		case GDScriptTokenizer::TK_PR_VAR: {
 		case GDScriptTokenizer::TK_PR_VAR: {
 			tokenizer->advance();
 			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->pt_type = GDScriptParser::PatternNode::PT_BIND;
 			pattern->bind = tokenizer->get_token_identifier();
 			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
 			// Create local variable for proper identifier detection later
 			LocalVarNode *lv = alloc_node<LocalVarNode>();
 			LocalVarNode *lv = alloc_node<LocalVarNode>();