Browse Source

Merge pull request #105413 from HolonProduction/gdscript-recover-match

GDScript: Do phrase level recovery for match
Thaddeus Crews 3 months ago
parent
commit
ee82adcf04

+ 9 - 1
modules/gdscript/gdscript_parser.cpp

@@ -2421,8 +2421,16 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() {
 	}
 	}
 
 
 	if (!consume(GDScriptTokenizer::Token::COLON, vformat(R"(Expected ":"%s after "match" %s.)", has_guard ? "" : R"( or "when")", has_guard ? "pattern guard" : "patterns"))) {
 	if (!consume(GDScriptTokenizer::Token::COLON, vformat(R"(Expected ":"%s after "match" %s.)", has_guard ? "" : R"( or "when")", has_guard ? "pattern guard" : "patterns"))) {
+		branch->block = alloc_recovery_suite();
 		complete_extents(branch);
 		complete_extents(branch);
-		return nullptr;
+		// Consume the whole line and treat the next one as new match branch.
+		while (current.type != GDScriptTokenizer::Token::NEWLINE && !is_at_end()) {
+			advance();
+		}
+		if (!is_at_end()) {
+			advance();
+		}
+		return branch;
 	}
 	}
 
 
 	SuiteNode *suite = alloc_node<SuiteNode>();
 	SuiteNode *suite = alloc_node<SuiteNode>();

+ 8 - 0
modules/gdscript/gdscript_parser.h

@@ -1464,6 +1464,14 @@ private:
 		return node;
 		return node;
 	}
 	}
 
 
+	SuiteNode *alloc_recovery_suite() {
+		SuiteNode *suite = alloc_recovery_node<SuiteNode>();
+		suite->parent_block = current_suite;
+		suite->parent_function = current_function;
+		suite->is_in_loop = current_suite->is_in_loop;
+		return suite;
+	}
+
 	void clear();
 	void clear();
 	void push_error(const String &p_message, const Node *p_origin = nullptr);
 	void push_error(const String &p_message, const Node *p_origin = nullptr);
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_1.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "AUTO_TRANSLATE_MODE_INHERIT"},
+]

+ 7 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_1.gd

@@ -0,0 +1,7 @@
+extends Node
+
+var t
+
+func test():
+	match t:
+		AutoTranslateMode.➡

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_2.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "VALUE"},
+]

+ 11 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_2.gd

@@ -0,0 +1,11 @@
+extends Node
+
+enum TestEnum {
+    VALUE,
+}
+
+var t
+
+func test():
+	match t:
+		TestEnum.➡ where

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_3.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "VALUE"},
+]

+ 11 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_branch_3.gd

@@ -0,0 +1,11 @@
+extends Node
+
+enum TestEnum {
+    VALUE,
+}
+
+var t
+
+func test():
+	match t:
+		TestEnum.➡:

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_1.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "AUTO_TRANSLATE_MODE_INHERIT"},
+]

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_1.gd

@@ -0,0 +1,4 @@
+extends Node
+
+func test():
+	match AutoTranslateMode.➡

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_2.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "VALUE"},
+]

+ 8 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_2.gd

@@ -0,0 +1,8 @@
+extends Node
+
+enum TestEnum {
+    VALUE,
+}
+
+func test():
+	match TestEnum.➡:

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_3.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "AUTO_TRANSLATE_MODE_INHERIT"},
+]

+ 5 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_3.gd

@@ -0,0 +1,5 @@
+extends Node
+
+func test():
+	match AutoTranslateMode.➡:
+		pass

+ 4 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_4.cfg

@@ -0,0 +1,4 @@
+[output]
+include=[
+	{"display": "VALUE"},
+]

+ 9 - 0
modules/gdscript/tests/scripts/completion/enum_values_in_match/in_test_4.gd

@@ -0,0 +1,9 @@
+extends Node
+
+enum TestEnum {
+    VALUE,
+}
+
+func test():
+	match TestEnum.➡:
+		TestEnum