MemberAccessEmitter: improved detection of XMLish expressions to determine if dynamic-access-unknown-members is necessary (references #203)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 9f1c863..60bbe8c 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -523,9 +523,15 @@
IIdentifierNode identifierNode = (IIdentifierNode) node.getRightOperandNode();
IDefinition resolvedDefinition = identifierNode.resolve(getProject());
if (resolvedDefinition == null) {
+ emitDynamicAccess = true;
IExpressionNode expressionNode = node.getLeftOperandNode();
- while (true)
+ while (expressionNode != null)
{
+ ITypeDefinition expressionType = expressionNode.resolveType(getProject());
+ if (SemanticUtils.isXMLish(expressionType, getProject())) {
+ emitDynamicAccess = false;
+ break;
+ }
if (expressionNode instanceof IMemberAccessExpressionNode)
{
IMemberAccessExpressionNode memberAccess = (IMemberAccessExpressionNode) expressionNode;
@@ -538,13 +544,10 @@
}
else
{
+ expressionNode = null;
break;
}
}
- ITypeDefinition expressionType = expressionNode.resolveType(getProject());
- if (!SemanticUtils.isXMLish(expressionType, getProject())) {
- emitDynamicAccess = true;
- }
}
}
if (emitDynamicAccess)