MXMLRoyaleEmitter: fix null exceptions when emitter encounters variables or functions without a type declaration
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index 4034a5f..ce5b260 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -53,7 +53,6 @@
import org.apache.royale.compiler.constants.IASLanguageConstants;
import org.apache.royale.compiler.definitions.IClassDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
-import org.apache.royale.compiler.definitions.IFunctionDefinition;
import org.apache.royale.compiler.definitions.INamespaceDefinition;
import org.apache.royale.compiler.definitions.ITypeDefinition;
import org.apache.royale.compiler.internal.as.codegen.InstructionListNode;
@@ -1251,8 +1250,13 @@
varData.add(data);
data.name = varNode.getName();
data.isStatic = varNode.hasModifier(ASModifier.STATIC);
- String qualifiedTypeName = varNode.getVariableTypeNode().resolveType(getMXMLWalker().getProject()).getQualifiedName();
- data.type = (qualifiedTypeName);
+ String qualifiedTypeName = "*";
+ IExpressionNode variableTypeNode = varNode.getVariableTypeNode();
+ if (variableTypeNode != null)
+ {
+ qualifiedTypeName = variableTypeNode.resolveType(getMXMLWalker().getProject()).getQualifiedName();
+ }
+ data.type = qualifiedTypeName;
IMetaTagsNode metaData = varNode.getMetaTags();
if (metaData != null)
{
@@ -1337,7 +1341,11 @@
data.name = methodNode.getName();
String qualifiedTypeName = methodNode.getReturnType();
if (!(qualifiedTypeName.equals("") || qualifiedTypeName.equals("void"))) {
- qualifiedTypeName = methodNode.getReturnTypeNode().resolveType(fjs).getQualifiedName();;
+ IExpressionNode returnTypeNode = methodNode.getReturnTypeNode();
+ if (returnTypeNode != null)
+ {
+ qualifiedTypeName = returnTypeNode.resolveType(fjs).getQualifiedName();;
+ }
}
data.type = qualifiedTypeName;
data.declaredBy = cdef.getQualifiedName();
@@ -1432,14 +1440,31 @@
data.isStatic = accessorNode.hasModifier(ASModifier.STATIC);
if (p.getter != null)
{
- data.type = p.getter.getReturnTypeNode().resolveType(fjs).getQualifiedName();
- if (p.setter !=null) {
+ String returnType = "*";
+ IExpressionNode returnTypeNode = p.getter.getReturnTypeNode();
+ if (returnTypeNode != null)
+ {
+ returnType = returnTypeNode.resolveType(fjs).getQualifiedName();
+ }
+ data.type = returnType;
+ if (p.setter != null)
+ {
data.access = "readwrite";
- } else data.access = "readonly";
+ }
+ else
+ {
+ data.access = "readonly";
+ }
}
else
{
- data.type = p.setter.getVariableTypeNode().resolveType(fjs).getQualifiedName();
+ String returnType = "*";
+ IExpressionNode variableTypeNode = p.setter.getVariableTypeNode();
+ if (variableTypeNode != null)
+ {
+ returnType = variableTypeNode.resolveType(fjs).getQualifiedName();
+ }
+ data.type = returnType;
data.access = "writeonly";
}
@@ -2174,7 +2199,13 @@
bindableVarInfo.metaTags = tags;
}
- bindableVarInfo.type = variableNode.getVariableTypeNode().resolveType(getMXMLWalker().getProject()).getQualifiedName();
+ String bindableVarType = "*";
+ IExpressionNode variableTypeNode = variableNode.getVariableTypeNode();
+ if (variableTypeNode != null)
+ {
+ bindableVarType = variableTypeNode.resolveType(getMXMLWalker().getProject()).getQualifiedName();
+ }
+ bindableVarInfo.type = bindableVarType;
((JSRoyaleEmitter) asEmitter).getModel().getBindableVars().put(variableNode.getName(), bindableVarInfo);
}
}
@@ -3658,7 +3689,13 @@
write("_"); // use backing variable
write(ASEmitterTokens.SPACE);
writeToken(ASEmitterTokens.EQUAL);
- fjs.emitAssignmentCoercion(vnode, varnode.getVariableTypeNode().resolve(getMXMLWalker().getProject()));
+ IDefinition varTypeDef = null;
+ IExpressionNode variableTypeNode = varnode.getVariableTypeNode();
+ if (variableTypeNode != null)
+ {
+ varTypeDef = variableTypeNode.resolve(getMXMLWalker().getProject());
+ }
+ fjs.emitAssignmentCoercion(vnode, varTypeDef);
write(ASEmitterTokens.SEMICOLON);
}