You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2025/09/02 17:40:42 UTC
(royale-compiler) 03/03: MXMLComponentNode: fix null exception when fx:Component doesn't have a correct closing tag
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit c6f396bc31b6a122d7d6cfb93d84925035b4b603
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Tue Sep 2 10:17:32 2025 -0700
MXMLComponentNode: fix null exception when fx:Component doesn't have a correct closing tag
Instead, adds an MXMLSemanticProblem. This shouldn't be displayed to the user because the parsing problems will take precedence. However, if there's a weird edge case, it might, so at least there isn't a complete lack of an error.
---
.../internal/tree/mxml/MXMLComponentNode.java | 45 +++++++++++++---------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLComponentNode.java b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLComponentNode.java
index 8f4ee9124..9d40ad6ab 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLComponentNode.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/mxml/MXMLComponentNode.java
@@ -159,25 +159,34 @@ class MXMLComponentNode extends MXMLFactoryNode implements IMXMLComponentNode
ClassDefinition fxComponentClassDefinition =
fileScope.getClassDefinitionForComponentTag(tag);
- assert fxComponentClassDefinition != null : "MXMLScopeBuilder failed to build a class for an fx:Component";
-
- // attach scope with the component class definition node.
- TypeScope componentClassScope = (TypeScope)fxComponentClassDefinition.getContainedScope();
- containedClassDefinitionNode.setScope(componentClassScope); // TODO Move this logic to initializeFromTag().
-
- // Connect node to definitions and vice versa.
- containedClassDefinitionNode.setClassReference(project, tagDefinition); // TODO Move this logic to initializeFromTag().
- containedClassDefinitionNode.setClassDefinition(fxComponentClassDefinition); // TODO Move this logic to initializeFromTag().
-
- int nameStart = fxComponentClassDefinition.getNameStart();
- int nameEnd = fxComponentClassDefinition.getNameEnd();
- fxComponentClassDefinition.setNode(containedClassDefinitionNode);
- // TODO The above call is setting nameStart and nameEnd to -1
- // because the MXML class definition node doesn't have a name expression node.
- // We need to reset the correct nameStart and nameEnd.
- fxComponentClassDefinition.setNameLocation(nameStart, nameEnd);
+ if (fxComponentClassDefinition == null)
+ {
+ // MXMLScopeBuilder failed to build a class for an fx:Component
- containedClassDefinitionNode.initializeFromTag(builder, childTag);
+ // TODO Add a problem subclass for this.
+ ICompilerProblem problem = new MXMLSemanticProblem(tag);
+ builder.addProblem(problem);
+ }
+ else
+ {
+ // attach scope with the component class definition node.
+ TypeScope componentClassScope = (TypeScope)fxComponentClassDefinition.getContainedScope();
+ containedClassDefinitionNode.setScope(componentClassScope); // TODO Move this logic to initializeFromTag().
+
+ // Connect node to definitions and vice versa.
+ containedClassDefinitionNode.setClassReference(project, tagDefinition); // TODO Move this logic to initializeFromTag().
+ containedClassDefinitionNode.setClassDefinition(fxComponentClassDefinition); // TODO Move this logic to initializeFromTag().
+
+ int nameStart = fxComponentClassDefinition.getNameStart();
+ int nameEnd = fxComponentClassDefinition.getNameEnd();
+ fxComponentClassDefinition.setNode(containedClassDefinitionNode);
+ // TODO The above call is setting nameStart and nameEnd to -1
+ // because the MXML class definition node doesn't have a name expression node.
+ // We need to reset the correct nameStart and nameEnd.
+ fxComponentClassDefinition.setNameLocation(nameStart, nameEnd);
+
+ containedClassDefinitionNode.initializeFromTag(builder, childTag);
+ }
}
if (!handled)
{