ソースを参照

GDScript: Remove function of `continue` for match statement

The keyword is confusing and rarely is used in the intended way. It is
removed now in favor of a future feature (pattern guards) to avoid
breaking compatibility later.
George Marques 2 年 前
コミット
9462ae4783

+ 0 - 28
modules/gdscript/gdscript_byte_codegen.cpp

@@ -1543,28 +1543,6 @@ void GDScriptByteCodeGenerator::write_endwhile() {
 	current_breaks_to_patch.pop_back();
 }
 
-void GDScriptByteCodeGenerator::start_match() {
-	match_continues_to_patch.push_back(List<int>());
-}
-
-void GDScriptByteCodeGenerator::start_match_branch() {
-	// Patch continue statements.
-	for (const int &E : match_continues_to_patch.back()->get()) {
-		patch_jump(E);
-	}
-	match_continues_to_patch.pop_back();
-	// Start a new list for next branch.
-	match_continues_to_patch.push_back(List<int>());
-}
-
-void GDScriptByteCodeGenerator::end_match() {
-	// Patch continue statements.
-	for (const int &E : match_continues_to_patch.back()->get()) {
-		patch_jump(E);
-	}
-	match_continues_to_patch.pop_back();
-}
-
 void GDScriptByteCodeGenerator::write_break() {
 	append_opcode(GDScriptFunction::OPCODE_JUMP);
 	current_breaks_to_patch.back()->get().push_back(opcodes.size());
@@ -1576,12 +1554,6 @@ void GDScriptByteCodeGenerator::write_continue() {
 	append(continue_addrs.back()->get());
 }
 
-void GDScriptByteCodeGenerator::write_continue_match() {
-	append_opcode(GDScriptFunction::OPCODE_JUMP);
-	match_continues_to_patch.back()->get().push_back(opcodes.size());
-	append(0);
-}
-
 void GDScriptByteCodeGenerator::write_breakpoint() {
 	append_opcode(GDScriptFunction::OPCODE_BREAKPOINT);
 }

+ 0 - 5
modules/gdscript/gdscript_byte_codegen.h

@@ -113,7 +113,6 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
 	List<int> ternary_jump_skip_pos;
 
 	List<List<int>> current_breaks_to_patch;
-	List<List<int>> match_continues_to_patch;
 
 	void add_stack_identifier(const StringName &p_id, int p_stackpos) {
 		if (locals.size() > max_locals) {
@@ -496,12 +495,8 @@ public:
 	virtual void start_while_condition() override;
 	virtual void write_while(const Address &p_condition) override;
 	virtual void write_endwhile() override;
-	virtual void start_match() override;
-	virtual void start_match_branch() override;
-	virtual void end_match() override;
 	virtual void write_break() override;
 	virtual void write_continue() override;
-	virtual void write_continue_match() override;
 	virtual void write_breakpoint() override;
 	virtual void write_newline(int p_line) override;
 	virtual void write_return(const Address &p_return_value) override;

+ 0 - 4
modules/gdscript/gdscript_codegen.h

@@ -148,12 +148,8 @@ public:
 	virtual void start_while_condition() = 0; // Used to allow a jump to the expression evaluation.
 	virtual void write_while(const Address &p_condition) = 0;
 	virtual void write_endwhile() = 0;
-	virtual void start_match() = 0;
-	virtual void start_match_branch() = 0;
-	virtual void end_match() = 0;
 	virtual void write_break() = 0;
 	virtual void write_continue() = 0;
-	virtual void write_continue_match() = 0;
 	virtual void write_breakpoint() = 0;
 	virtual void write_newline(int p_line) = 0;
 	virtual void write_return(const Address &p_return_value) = 0;

+ 1 - 10
modules/gdscript/gdscript_compiler.cpp

@@ -1679,7 +1679,6 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui
 			case GDScriptParser::Node::MATCH: {
 				const GDScriptParser::MatchNode *match = static_cast<const GDScriptParser::MatchNode *>(s);
 
-				gen->start_match();
 				codegen.start_block();
 
 				// Evaluate the match expression.
@@ -1718,7 +1717,6 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui
 
 					const GDScriptParser::MatchBranchNode *branch = match->branches[j];
 
-					gen->start_match_branch(); // Need so lower level code can patch 'continue' jumps.
 					codegen.start_block(); // Create an extra block around for binds.
 
 					// Add locals in block before patterns, so temporaries don't use the stack address for binds.
@@ -1756,8 +1754,6 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui
 				for (int j = 0; j < match->branches.size(); j++) {
 					gen->write_endif();
 				}
-
-				gen->end_match();
 			} break;
 			case GDScriptParser::Node::IF: {
 				const GDScriptParser::IfNode *if_n = static_cast<const GDScriptParser::IfNode *>(s);
@@ -1845,12 +1841,7 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui
 				gen->write_break();
 			} break;
 			case GDScriptParser::Node::CONTINUE: {
-				const GDScriptParser::ContinueNode *cont = static_cast<const GDScriptParser::ContinueNode *>(s);
-				if (cont->is_for_match) {
-					gen->write_continue_match();
-				} else {
-					gen->write_continue();
-				}
+				gen->write_continue();
 			} break;
 			case GDScriptParser::Node::RETURN: {
 				const GDScriptParser::ReturnNode *return_n = static_cast<const GDScriptParser::ReturnNode *>(s);

+ 1 - 19
modules/gdscript/gdscript_parser.cpp

@@ -1806,11 +1806,10 @@ GDScriptParser::BreakNode *GDScriptParser::parse_break() {
 
 GDScriptParser::ContinueNode *GDScriptParser::parse_continue() {
 	if (!can_continue) {
-		push_error(R"(Cannot use "continue" outside of a loop or pattern matching block.)");
+		push_error(R"(Cannot use "continue" outside of a loop.)");
 	}
 	current_suite->has_continue = true;
 	ContinueNode *cont = alloc_node<ContinueNode>();
-	cont->is_for_match = is_continue_match;
 	complete_extents(cont);
 	end_statement(R"("continue")");
 	return cont;
@@ -1836,12 +1835,10 @@ GDScriptParser::ForNode *GDScriptParser::parse_for() {
 	// Save break/continue state.
 	bool could_break = can_break;
 	bool could_continue = can_continue;
-	bool was_continue_match = is_continue_match;
 
 	// Allow break/continue.
 	can_break = true;
 	can_continue = true;
-	is_continue_match = false;
 
 	SuiteNode *suite = alloc_node<SuiteNode>();
 	if (n_for->variable) {
@@ -1859,7 +1856,6 @@ GDScriptParser::ForNode *GDScriptParser::parse_for() {
 	// Reset break/continue state.
 	can_break = could_break;
 	can_continue = could_continue;
-	is_continue_match = was_continue_match;
 
 	return n_for;
 }
@@ -1996,13 +1992,6 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() {
 		return nullptr;
 	}
 
-	// Save continue state.
-	bool could_continue = can_continue;
-	bool was_continue_match = is_continue_match;
-	// Allow continue for match.
-	can_continue = true;
-	is_continue_match = true;
-
 	SuiteNode *suite = alloc_node<SuiteNode>();
 	if (branch->patterns.size() > 0) {
 		for (const KeyValue<StringName, IdentifierNode *> &E : branch->patterns[0]->binds) {
@@ -2015,10 +2004,6 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() {
 	branch->block = parse_suite("match pattern block", suite);
 	complete_extents(branch);
 
-	// Restore continue state.
-	can_continue = could_continue;
-	is_continue_match = was_continue_match;
-
 	return branch;
 }
 
@@ -2177,12 +2162,10 @@ GDScriptParser::WhileNode *GDScriptParser::parse_while() {
 	// Save break/continue state.
 	bool could_break = can_break;
 	bool could_continue = can_continue;
-	bool was_continue_match = is_continue_match;
 
 	// Allow break/continue.
 	can_break = true;
 	can_continue = true;
-	is_continue_match = false;
 
 	n_while->loop = parse_suite(R"("while" block)");
 	n_while->loop->is_loop = true;
@@ -2191,7 +2174,6 @@ GDScriptParser::WhileNode *GDScriptParser::parse_while() {
 	// Reset break/continue state.
 	can_break = could_break;
 	can_continue = could_continue;
-	is_continue_match = was_continue_match;
 
 	return n_while;
 }

+ 0 - 2
modules/gdscript/gdscript_parser.h

@@ -758,7 +758,6 @@ public:
 	};
 
 	struct ContinueNode : public Node {
-		bool is_for_match = false;
 		ContinueNode() {
 			type = CONTINUE;
 		}
@@ -1254,7 +1253,6 @@ private:
 	bool panic_mode = false;
 	bool can_break = false;
 	bool can_continue = false;
-	bool is_continue_match = false; // Whether a `continue` will act on a `match`.
 	List<bool> multiline_stack;
 
 	ClassNode *head = nullptr;

+ 0 - 2
modules/gdscript/tests/scripts/parser/features/match.gd

@@ -3,8 +3,6 @@ func test():
 	match i:
 		"Hello":
 			print("hello")
-			# This will fall through to the default case below.
-			continue
 		"Good bye":
 			print("bye")
 		_:

+ 0 - 1
modules/gdscript/tests/scripts/parser/features/match.out

@@ -1,4 +1,3 @@
 GDTEST_OK
 hello
-default
 This will match

+ 3 - 4
modules/gdscript/tests/scripts/parser/features/nested_match.gd

@@ -8,11 +8,10 @@ func test():
 				1234:
 					print("2")
 					match number:
-						1234:
-							print("3")
-							continue
+						4321:
+							print("Should not be printed")
 						_:
-							print("Should also be printed")
+							print("3")
 							match number:
 								1234:
 									print("4")

+ 0 - 1
modules/gdscript/tests/scripts/parser/features/nested_match.out

@@ -2,7 +2,6 @@ GDTEST_OK
 1
 2
 3
-Should also be printed
 4
 5
 6