浏览代码

Merge pull request #4918 from jjay/f/error_on_redefine

Redefine var results in an error
Juan Linietsky 8 年之前
父节点
当前提交
7924f08a6a
共有 1 个文件被更改,包括 25 次插入0 次删除
  1. 25 0
      modules/gdscript/gd_parser.cpp

+ 25 - 0
modules/gdscript/gd_parser.cpp

@@ -1762,6 +1762,24 @@ void GDParser::_parse_block(BlockNode *p_block,bool p_static) {
 				}
 				}
 				StringName n = tokenizer->get_token_identifier();
 				StringName n = tokenizer->get_token_identifier();
 				tokenizer->advance();
 				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->variables.push_back(n); //line?
 				p_block->variable_lines.push_back(tokenizer->get_token_line());
 				p_block->variable_lines.push_back(tokenizer->get_token_line());
@@ -2079,7 +2097,14 @@ void GDParser::_parse_block(BlockNode *p_block,bool p_static) {
 				}
 				}
 
 
 				current_block=cf_for->body;
 				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);
 				_parse_block(cf_for->body,p_static);
+				cf_for->body->variables.remove(0);
+				cf_for->body->variable_lines.remove(0);
 				current_block=p_block;
 				current_block=p_block;
 
 
 				if (error_set)
 				if (error_set)