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 9f86cdc12bdd29aa19fc6ebbb516c6f337194b03 Author: Josh Tynjala <[email protected]> AuthorDate: Mon Nov 20 15:01:12 2023 -0800 ClassEmitter, InterfaceEmitter: extract some of the branches into separate methods to help readability --- .../internal/codegen/js/jx/ClassEmitter.java | 237 +++++++++++---------- .../internal/codegen/js/jx/InterfaceEmitter.java | 158 +++++++------- 2 files changed, 209 insertions(+), 186 deletions(-) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java index 97e84701d..b3f2def6e 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java @@ -32,9 +32,7 @@ import org.apache.royale.compiler.definitions.INamespaceDefinition; import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter; import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; -import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleDocEmitter; import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter; -import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterTokens; import org.apache.royale.compiler.internal.codegen.js.utils.DocEmitterUtils; import org.apache.royale.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.royale.compiler.internal.projects.RoyaleJSProject; @@ -99,125 +97,18 @@ public class ClassEmitter extends JSSubEmitter implements IFunctionDefinition ctorDefinition = definition.getConstructor(); - // look for force-linking pattern in scope block node - int childNodeCount = node.getChildCount(); - for (int i = 0; i < childNodeCount; i++) - { - IASNode child = node.getChild(i); - if (child.getNodeID() == ASTNodeID.BlockID) - { - int blockNodeCount = child.getChildCount(); - for (int j = 0; j < blockNodeCount - 1; j++) - { - IASNode blockChild = child.getChild(j); - if (blockChild.getNodeID() == ASTNodeID.ImportID) - { - IASNode afterChild = child.getChild(j + 1); - if (afterChild.getNodeID() == ASTNodeID.IdentifierID) - { - IDefinition def = ((IdentifierNode)afterChild).resolve(project); - if (def instanceof IClassDefinition) - { - fjs.usedNames.add(def.getQualifiedName()); - } - } - } - } - break; - } - } + collectUsedNames(node); // Static-only (Singleton) classes may not have a constructor if (ctorDefinition != null) { - IFunctionNode ctorNode = (IFunctionNode) ctorDefinition.getNode(); - if (ctorNode != null) - { - // constructor - getEmitter().emitMethod(ctorNode); - write(ASEmitterTokens.SEMICOLON); - } - else - { - String qname = definition.getQualifiedName(); - if (qname != null && !qname.equals("")) - { - if (fjs.getModel().isExterns && definition.getBaseName().equals(qname)) - { - writeToken(ASEmitterTokens.VAR); - } - write(getEmitter().formatQualifiedName(qname)); - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.FUNCTION); - write(ASEmitterTokens.PAREN_OPEN); - write(ASEmitterTokens.PAREN_CLOSE); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.BLOCK_OPEN); - writeNewline(); - fjs.emitComplexInitializers(node); - write(ASEmitterTokens.BLOCK_CLOSE); - write(ASEmitterTokens.SEMICOLON); - } - } + emitConstructor(ctorDefinition, definition, node); } IDefinitionNode[] dnodes = node.getAllMemberNodes(); for (IDefinitionNode dnode : dnodes) { - if (dnode.getNodeID() == ASTNodeID.VariableID) - { - writeNewline(); - writeNewline(); - writeNewline(); - getEmitter().emitField((IVariableNode) dnode); - startMapping(dnode, dnode); - write(ASEmitterTokens.SEMICOLON); - endMapping(dnode); - } - else if (dnode.getNodeID() == ASTNodeID.FunctionID) - { - if (!((IFunctionNode) dnode).isConstructor()) - { - writeNewline(); - writeNewline(); - writeNewline(); - getEmitter().emitMethod((IFunctionNode) dnode); - write(ASEmitterTokens.SEMICOLON); - if (getModel().defaultXMLNamespaceActive) { - getModel().registerDefaultXMLNamespace((FunctionScope) ((IFunctionNode) dnode).getScopedNode().getScope(), null); - } - } - } - else if (dnode.getNodeID() == ASTNodeID.GetterID - || dnode.getNodeID() == ASTNodeID.SetterID) - { - //writeNewline(); - //writeNewline(); - //writeNewline(); - fjs.emitAccessors((IAccessorNode) dnode); - //this shouldn't write anything, just set up - //a data structure for emitASGettersAndSetters - //write(ASEmitterTokens.SEMICOLON); - } - else if (dnode.getNodeID() == ASTNodeID.BindableVariableID) - { - writeNewline(); - writeNewline(); - writeNewline(); - getEmitter().emitField((IVariableNode) dnode); - startMapping(dnode, dnode); - write(ASEmitterTokens.SEMICOLON); - endMapping(dnode); - } else if (dnode.getNodeID() == ASTNodeID.NamespaceID) { - writeNewline(); - writeNewline(); - writeNewline(); - getEmitter().emitNamespace((INamespaceNode) dnode); - startMapping(dnode, dnode); - write(ASEmitterTokens.SEMICOLON); - endMapping(dnode); - } + emitMember(dnode); } fjs.getBindableEmitter().emit(definition); @@ -302,4 +193,126 @@ public class ClassEmitter extends JSSubEmitter implements if (wroteOne) writeNewline(); } + + private void emitConstructor(IFunctionDefinition ctorDefinition, IClassDefinition definition, IClassNode node) { + JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter(); + IFunctionNode ctorNode = (IFunctionNode) ctorDefinition.getNode(); + if (ctorNode != null) + { + // constructor + getEmitter().emitMethod(ctorNode); + write(ASEmitterTokens.SEMICOLON); + } + else + { + String qname = definition.getQualifiedName(); + if (qname != null && !qname.equals("")) + { + if (fjs.getModel().isExterns && definition.getBaseName().equals(qname)) + { + writeToken(ASEmitterTokens.VAR); + } + write(getEmitter().formatQualifiedName(qname)); + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.FUNCTION); + write(ASEmitterTokens.PAREN_OPEN); + write(ASEmitterTokens.PAREN_CLOSE); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.BLOCK_OPEN); + writeNewline(); + fjs.emitComplexInitializers(node); + write(ASEmitterTokens.BLOCK_CLOSE); + write(ASEmitterTokens.SEMICOLON); + } + } + } + + private void collectUsedNames(IClassNode node) { + JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter(); + // look for force-linking pattern in scope block node + int childNodeCount = node.getChildCount(); + for (int i = 0; i < childNodeCount; i++) + { + IASNode child = node.getChild(i); + if (child.getNodeID() == ASTNodeID.BlockID) + { + int blockNodeCount = child.getChildCount(); + for (int j = 0; j < blockNodeCount - 1; j++) + { + IASNode blockChild = child.getChild(j); + if (blockChild.getNodeID() == ASTNodeID.ImportID) + { + IASNode afterChild = child.getChild(j + 1); + if (afterChild.getNodeID() == ASTNodeID.IdentifierID) + { + IDefinition def = ((IdentifierNode)afterChild).resolve(getWalker().getProject()); + if (def instanceof IClassDefinition) + { + fjs.usedNames.add(def.getQualifiedName()); + } + } + } + } + break; + } + } + } + + private void emitMember(IDefinitionNode dnode) { + JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter(); + if (dnode.getNodeID() == ASTNodeID.VariableID) + { + writeNewline(); + writeNewline(); + writeNewline(); + getEmitter().emitField((IVariableNode) dnode); + startMapping(dnode, dnode); + write(ASEmitterTokens.SEMICOLON); + endMapping(dnode); + } + else if (dnode.getNodeID() == ASTNodeID.FunctionID) + { + if (!((IFunctionNode) dnode).isConstructor()) + { + writeNewline(); + writeNewline(); + writeNewline(); + getEmitter().emitMethod((IFunctionNode) dnode); + write(ASEmitterTokens.SEMICOLON); + if (getModel().defaultXMLNamespaceActive) { + getModel().registerDefaultXMLNamespace((FunctionScope) ((IFunctionNode) dnode).getScopedNode().getScope(), null); + } + } + } + else if (dnode.getNodeID() == ASTNodeID.GetterID + || dnode.getNodeID() == ASTNodeID.SetterID) + { + //writeNewline(); + //writeNewline(); + //writeNewline(); + fjs.emitAccessors((IAccessorNode) dnode); + //this shouldn't write anything, just set up + //a data structure for emitASGettersAndSetters + //write(ASEmitterTokens.SEMICOLON); + } + else if (dnode.getNodeID() == ASTNodeID.BindableVariableID) + { + writeNewline(); + writeNewline(); + writeNewline(); + getEmitter().emitField((IVariableNode) dnode); + startMapping(dnode, dnode); + write(ASEmitterTokens.SEMICOLON); + endMapping(dnode); + } else if (dnode.getNodeID() == ASTNodeID.NamespaceID) { + writeNewline(); + writeNewline(); + writeNewline(); + getEmitter().emitNamespace((INamespaceNode) dnode); + startMapping(dnode, dnode); + write(ASEmitterTokens.SEMICOLON); + endMapping(dnode); + } + } } diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/InterfaceEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/InterfaceEmitter.java index cab1d554c..cb9550162 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/InterfaceEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/InterfaceEmitter.java @@ -28,7 +28,6 @@ import org.apache.royale.compiler.internal.codegen.js.JSEmitterTokens; import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter; import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleDocEmitter; import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter; -import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterTokens; import org.apache.royale.compiler.internal.tree.as.TypedExpressionNode; import org.apache.royale.compiler.projects.ICompilerProject; import org.apache.royale.compiler.tree.ASTNodeID; @@ -60,90 +59,101 @@ public class InterfaceEmitter extends JSSubEmitter implements String qname = node.getQualifiedName(); if (qname != null && !qname.equals("")) { - write(getEmitter().formatQualifiedName(qname)); - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.FUNCTION); - write(ASEmitterTokens.PAREN_OPEN); - write(ASEmitterTokens.PAREN_CLOSE); - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.BLOCK_OPEN); - writeNewline(); - write(ASEmitterTokens.BLOCK_CLOSE); - write(ASEmitterTokens.SEMICOLON); + emitConstructor(qname); } - - JSRoyaleDocEmitter doc = (JSRoyaleDocEmitter) getEmitter().getDocEmitter(); final IDefinitionNode[] members = node.getAllMemberDefinitionNodes(); for (IDefinitionNode mnode : members) { - boolean isAccessor = mnode.getNodeID() == ASTNodeID.GetterID - || mnode.getNodeID() == ASTNodeID.SetterID; + emitMember(mnode, node); + } + fjs.getPackageFooterEmitter().emitClassInfo(node); + } - String memberName = mnode.getQualifiedName(); - if (!isAccessor - || !getModel().getInterfacePropertyMap().contains(memberName)) - { - writeNewline(); + private void emitConstructor(String qname) { + write(getEmitter().formatQualifiedName(qname)); + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.FUNCTION); + write(ASEmitterTokens.PAREN_OPEN); + write(ASEmitterTokens.PAREN_CLOSE); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.BLOCK_OPEN); + writeNewline(); + write(ASEmitterTokens.BLOCK_CLOSE); + write(ASEmitterTokens.SEMICOLON); + } - if (isAccessor) - { - IAccessorNode accessor = (IAccessorNode)mnode; - String propType = accessor.getVariableType(); - IExpressionNode typeNode = accessor.getVariableTypeNode(); - ITypeDefinition typeDef = typeNode.resolveType(project); - String packageName = typeDef.getPackageName(); - packageName = project.getActualPackageName(packageName); - if (typeNode instanceof TypedExpressionNode) { - propType = "Vector.<" + - JSRoyaleDocEmitter.convertASTypeToJSType( - ((TypedExpressionNode)typeNode).getTypeNode().resolveType(project).getQualifiedName(), - "") - +">"; - packageName = ""; - } - write(JSDocEmitterTokens.JSDOC_OPEN); - write(ASEmitterTokens.SPACE); - fjs.getDocEmitter().emitType(propType, packageName); - write(ASEmitterTokens.SPACE); - write(JSDocEmitterTokens.JSDOC_CLOSE); - } - else - { - doc.emitMethodDoc((IFunctionNode)mnode, project); - } - write(getEmitter().formatQualifiedName(qname)); - write(ASEmitterTokens.MEMBER_ACCESS); - write(JSEmitterTokens.PROTOTYPE); - write(ASEmitterTokens.MEMBER_ACCESS); - write(memberName); - - if (isAccessor - && !getModel().getInterfacePropertyMap() - .contains(memberName)) - { - getModel().getInterfacePropertyMap().add(memberName); - } - else - { - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - write(ASEmitterTokens.FUNCTION); - - fjs.emitParameters(((IFunctionNode) mnode) - .getParametersContainerNode()); - - write(ASEmitterTokens.SPACE); - write(ASEmitterTokens.BLOCK_OPEN); - writeNewline(); - write(ASEmitterTokens.BLOCK_CLOSE); + private void emitMember(IDefinitionNode mnode, IInterfaceNode node) { + JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter(); + JSRoyaleDocEmitter doc = (JSRoyaleDocEmitter) getEmitter().getDocEmitter(); + + String qname = node.getQualifiedName(); + + boolean isAccessor = mnode.getNodeID() == ASTNodeID.GetterID + || mnode.getNodeID() == ASTNodeID.SetterID; + + String memberName = mnode.getQualifiedName(); + if (!isAccessor + || !getModel().getInterfacePropertyMap().contains(memberName)) + { + writeNewline(); + + if (isAccessor) + { + IAccessorNode accessor = (IAccessorNode)mnode; + String propType = accessor.getVariableType(); + IExpressionNode typeNode = accessor.getVariableTypeNode(); + ITypeDefinition typeDef = typeNode.resolveType(getWalker().getProject()); + String packageName = typeDef.getPackageName(); + packageName = getWalker().getProject().getActualPackageName(packageName); + if (typeNode instanceof TypedExpressionNode) { + propType = "Vector.<" + + JSRoyaleDocEmitter.convertASTypeToJSType( + ((TypedExpressionNode)typeNode).getTypeNode().resolveType(getWalker().getProject()).getQualifiedName(), + "") + +">"; + packageName = ""; } + write(JSDocEmitterTokens.JSDOC_OPEN); + write(ASEmitterTokens.SPACE); + fjs.getDocEmitter().emitType(propType, packageName); + write(ASEmitterTokens.SPACE); + write(JSDocEmitterTokens.JSDOC_CLOSE); + } + else + { + doc.emitMethodDoc((IFunctionNode)mnode, getWalker().getProject()); + } + write(getEmitter().formatQualifiedName(qname)); + write(ASEmitterTokens.MEMBER_ACCESS); + write(JSEmitterTokens.PROTOTYPE); + write(ASEmitterTokens.MEMBER_ACCESS); + write(memberName); + + if (isAccessor + && !getModel().getInterfacePropertyMap() + .contains(memberName)) + { + getModel().getInterfacePropertyMap().add(memberName); + } + else + { + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(ASEmitterTokens.FUNCTION); + + fjs.emitParameters(((IFunctionNode) mnode) + .getParametersContainerNode()); - write(ASEmitterTokens.SEMICOLON); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.BLOCK_OPEN); + writeNewline(); + write(ASEmitterTokens.BLOCK_CLOSE); } + + write(ASEmitterTokens.SEMICOLON); } - fjs.getPackageFooterEmitter().emitClassInfo(node); } }
