GDScript: Fix broken export group annotations
This commit is contained in:
parent
518b9e5801
commit
1d68ce2cce
2 changed files with 12 additions and 4 deletions
|
@ -1062,7 +1062,7 @@ void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class, co
|
||||||
resolve_class_body(base_class, p_class);
|
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++) {
|
for (int i = 0; i < p_class->members.size(); i++) {
|
||||||
GDScriptParser::ClassNode::Member member = p_class->members[i];
|
GDScriptParser::ClassNode::Member member = p_class->members[i];
|
||||||
if (member.type == GDScriptParser::ClassNode::Member::FUNCTION) {
|
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);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -840,14 +840,19 @@ void GDScriptParser::parse_class_body(bool p_is_multiline) {
|
||||||
case GDScriptTokenizer::Token::ANNOTATION: {
|
case GDScriptTokenizer::Token::ANNOTATION: {
|
||||||
advance();
|
advance();
|
||||||
|
|
||||||
// Check for class-level annotations.
|
// Check for standalone and class-level annotations.
|
||||||
AnnotationNode *annotation = parse_annotation(AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL);
|
AnnotationNode *annotation = parse_annotation(AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL);
|
||||||
if (annotation != nullptr) {
|
if (annotation != nullptr) {
|
||||||
if (annotation->applies_to(AnnotationInfo::STANDALONE)) {
|
if (annotation->applies_to(AnnotationInfo::STANDALONE)) {
|
||||||
if (previous.type != GDScriptTokenizer::Token::NEWLINE) {
|
if (previous.type != GDScriptTokenizer::Token::NEWLINE) {
|
||||||
push_error(R"(Expected newline after a standalone annotation.)");
|
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 {
|
} else {
|
||||||
annotation_stack.push_back(annotation);
|
annotation_stack.push_back(annotation);
|
||||||
}
|
}
|
||||||
|
@ -3849,7 +3854,6 @@ bool GDScriptParser::export_group_annotations(const AnnotationNode *p_annotation
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
current_class->add_member_group(annotation);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue