Browse Source

GDScript: Fix broken export group annotations

Danil Alexeev 2 years ago
parent
commit
1d68ce2cce
2 changed files with 12 additions and 4 deletions
  1. 5 1
      modules/gdscript/gdscript_analyzer.cpp
  2. 7 3
      modules/gdscript/gdscript_parser.cpp

+ 5 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -1062,7 +1062,7 @@ void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class, co
 		resolve_class_body(base_class, p_class);
 	}
 
-	// Do functions and properties now.
+	// Do functions, properties, and groups now.
 	for (int i = 0; i < p_class->members.size(); i++) {
 		GDScriptParser::ClassNode::Member member = p_class->members[i];
 		if (member.type == GDScriptParser::ClassNode::Member::FUNCTION) {
@@ -1102,6 +1102,10 @@ void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class, co
 					resolve_function_body(member.variable->setter);
 				}
 			}
+		} else if (member.type == GDScriptParser::ClassNode::Member::GROUP) {
+			// Apply annotation (`@export_{category,group,subgroup}`).
+			resolve_annotation(member.annotation);
+			member.annotation->apply(parser, nullptr);
 		}
 	}
 

+ 7 - 3
modules/gdscript/gdscript_parser.cpp

@@ -840,14 +840,19 @@ void GDScriptParser::parse_class_body(bool p_is_multiline) {
 			case GDScriptTokenizer::Token::ANNOTATION: {
 				advance();
 
-				// Check for class-level annotations.
+				// Check for standalone and class-level annotations.
 				AnnotationNode *annotation = parse_annotation(AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL);
 				if (annotation != nullptr) {
 					if (annotation->applies_to(AnnotationInfo::STANDALONE)) {
 						if (previous.type != GDScriptTokenizer::Token::NEWLINE) {
 							push_error(R"(Expected newline after a standalone annotation.)");
 						}
-						head->annotations.push_back(annotation);
+						if (annotation->name == "@export_category" || annotation->name == "@export_group" || annotation->name == "@export_subgroup") {
+							current_class->add_member_group(annotation);
+						} else {
+							// For potential non-group standalone annotations.
+							push_error(R"(Unexpected standalone annotation in class body.)");
+						}
 					} else {
 						annotation_stack.push_back(annotation);
 					}
@@ -3849,7 +3854,6 @@ bool GDScriptParser::export_group_annotations(const AnnotationNode *p_annotation
 		} break;
 	}
 
-	current_class->add_member_group(annotation);
 	return true;
 }