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 3046c63832f8fb88f6c95e3cac748acdd23c5042 Author: Josh Tynjala <[email protected]> AuthorDate: Mon Dec 21 10:49:49 2020 -0800 MXMLRoyaleEmitter: created an emitter interface for MXML specifiers so that their generated JS output may have different implementations --- .../compiler/codegen/mxml/js/IMXMLJSEmitter.java | 27 ++ .../royale/JSRoyaleBasicMXMLDescriptorEmitter.java | 312 +++++++++++++++++++++ .../internal/codegen/mxml/MXMLSubEmitter.java | 125 +++++++++ .../mxml/royale/MXMLDescriptorSpecifier.java | 282 ------------------- .../codegen/mxml/royale/MXMLEventSpecifier.java | 18 +- .../codegen/mxml/royale/MXMLNodeSpecifier.java | 114 -------- .../codegen/mxml/royale/MXMLRoyaleEmitter.java | 37 +-- 7 files changed, 485 insertions(+), 430 deletions(-) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/js/IMXMLJSEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/js/IMXMLJSEmitter.java new file mode 100644 index 0000000..4d4dde4 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/mxml/js/IMXMLJSEmitter.java @@ -0,0 +1,27 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.royale.compiler.codegen.mxml.js; + +import org.apache.royale.compiler.codegen.js.IMappingEmitter; +import org.apache.royale.compiler.codegen.mxml.IMXMLEmitter; + +public interface IMXMLJSEmitter extends IMXMLEmitter, IMappingEmitter { + +} diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java new file mode 100644 index 0000000..ea11bf7 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java @@ -0,0 +1,312 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.royale.compiler.internal.codegen.js.royale; + +import org.apache.royale.compiler.codegen.ISubEmitter; +import org.apache.royale.compiler.codegen.mxml.js.IMXMLJSEmitter; +import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; +import org.apache.royale.compiler.internal.codegen.mxml.MXMLSubEmitter; +import org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLDescriptorSpecifier; +import org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLEventSpecifier; + +public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter implements ISubEmitter<MXMLDescriptorSpecifier> +{ + public JSRoyaleBasicMXMLDescriptorEmitter(IMXMLJSEmitter emitter) + { + super(emitter); + } + + @Override + public void emit(MXMLDescriptorSpecifier root) + { + outputDescriptorSpecifier(root, true); + } + + //--------------------------------- + // writeSimpleDescriptor + //--------------------------------- + + protected void writeSimpleDescriptor(String name, String type, String value, + boolean writeNewline) + { + write(ASEmitterTokens.SINGLE_QUOTE); + write(name); + write(ASEmitterTokens.SINGLE_QUOTE); + writeDelimiter(writeNewline); + + if (type != null) + { + write(type); + writeDelimiter(writeNewline); + } + + write(value); + } + + //--------------------------------- + // writeDelimiter + //--------------------------------- + + protected void writeDelimiter(boolean writeNewline) + { + if (writeNewline) + writeNewline(ASEmitterTokens.COMMA); + else + writeToken(ASEmitterTokens.COMMA); + } + + //--------------------------------- + // outputDescriptorSpecifier + //--------------------------------- + + private void outputDescriptorSpecifier(MXMLDescriptorSpecifier root, boolean writeNewline) + { + if (root.isTopNode) + { + int count = 0; + for (MXMLDescriptorSpecifier md : root.propertySpecifiers) + { + if (md.name != null) + count++; + } + + write(count + ""); + writeNewline(ASEmitterTokens.COMMA); + } + + outputPropertySpecifiers(root, writeNewline); + + if (!root.isProperty) + { + outputStyleSpecifiers(root, writeNewline); + + // TODO (erikdebruin) not yet implemented in Royale + //outputEffectSpecifiers(writeNewline); + + outputEventSpecifiers(root, writeNewline); + + if (!root.isTopNode) + { + writeDelimiter(writeNewline); + + if (root.childrenSpecifier == null) + write(ASEmitterTokens.NULL); + else + outputChildren(root.childrenSpecifier, writeNewline); + } + + boolean isLastChild = root.parent != null + && root.parent.propertySpecifiers.indexOf(root) == root.parent.propertySpecifiers + .size() - 1; + + if (!isLastChild && !root.isTopNode) + writeDelimiter(writeNewline); + } + } + + //--------------------------------- + // outputPropertySpecifiers + //--------------------------------- + + private void outputPropertySpecifiers(MXMLDescriptorSpecifier root, boolean writeNewline) + { + MXMLDescriptorSpecifier model = null; // model goes first + MXMLDescriptorSpecifier beads = null; // beads go last + + for (MXMLDescriptorSpecifier md : root.propertySpecifiers) + { + if (md.name != null && md.name.equals("model")) + { + model = md; + break; + } + } + + if (model != null) + { + outputPropertySpecifier(model, writeNewline); + } + + for (MXMLDescriptorSpecifier md : root.propertySpecifiers) + { + if (md.name != null) + { + if (!md.name.equals("model") && !md.name.equals("beads")) + outputPropertySpecifier(md, writeNewline); + else if (md.name.equals("beads")) + beads = md; + } + } + + if (beads != null) + { + outputPropertySpecifier(beads, writeNewline); + } + } + + //--------------------------------- + // outputEventSpecifiers + //--------------------------------- + + private void outputEventSpecifiers(MXMLDescriptorSpecifier root, boolean writeNewline) + { + // number of events + int count = 0; + for (MXMLEventSpecifier me : root.eventSpecifiers) + { + if (me.name != null) + count++; + } + write(count + ""); + + for (MXMLEventSpecifier me : root.eventSpecifiers) + { + writeDelimiter(writeNewline); + outputEventSpecifier(me, writeNewline); + } + } + + //--------------------------------- + // outputStyleSpecifiers + //--------------------------------- + + private void outputStyleSpecifiers(MXMLDescriptorSpecifier root, boolean writeNewline) + { + // TODO (erikdebruin) not yet implemented in Royale + + write("0"); + writeDelimiter(writeNewline); + } + + //--------------------------------- + // outputPropertySpecifier + //--------------------------------- + + private void outputPropertySpecifier(MXMLDescriptorSpecifier specifier, boolean writeNewline) + { + write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); + write(specifier.name); + write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); + writeDelimiter(writeNewline); + + if (specifier.isProperty) + { + if (specifier.value != null) + { + write(ASEmitterTokens.TRUE); + writeDelimiter(writeNewline); + // need to do other escaping here? + // restrict="0-9.\" + if (specifier.value.endsWith("\\'") && !specifier.value.endsWith("\\\\'")) + { + specifier.value = specifier.value.substring(0, specifier.value.length() - 1) + "\\'"; + } + write(specifier.value); + } + else + { + write((specifier.hasArray) ? ASEmitterTokens.NULL : ASEmitterTokens.FALSE); + writeDelimiter(writeNewline); + write(ASEmitterTokens.SQUARE_OPEN); + indentPush(); + writeNewline(); + outputDescriptorSpecifier(specifier, writeNewline); + indentPop(); + writeNewline(); + write(ASEmitterTokens.SQUARE_CLOSE); + } + + if (specifier.parent != null) + writeDelimiter(writeNewline); + } + else + { + for (MXMLDescriptorSpecifier md : specifier.propertySpecifiers) + { + if (md.name != null && md.name.equals("mxmlContent")) + { + specifier.childrenSpecifier = md; + specifier.propertySpecifiers.remove(md); + break; + } + } + + if (specifier.id != null || specifier.effectiveId != null) + { + write(specifier.propertySpecifiers.size() + 1 + ""); + writeDelimiter(writeNewline); + String idPropName = (specifier.effectiveId != null) ? "_id" + : "id"; + writeSimpleDescriptor(idPropName, ASEmitterTokens.TRUE.getToken(), + ASEmitterTokens.SINGLE_QUOTE.getToken() + + ((specifier.id != null) ? specifier.id : specifier.effectiveId) + ASEmitterTokens.SINGLE_QUOTE.getToken(), + writeNewline); + + writeDelimiter(writeNewline); + } + else + { + write(specifier.propertySpecifiers.size() + ""); + writeDelimiter(writeNewline); + } + + outputDescriptorSpecifier(specifier, writeNewline); + } + } + + //--------------------------------- + // outputEventSpecifier + //--------------------------------- + + public void outputEventSpecifier(MXMLEventSpecifier specifier, boolean writeNewline) + { + String handler = ASEmitterTokens.THIS.getToken() + + ASEmitterTokens.MEMBER_ACCESS.getToken() + specifier.eventHandler; + if (MXMLEventSpecifier.nameMap.contains(specifier.name)) + specifier.name = specifier.name.toLowerCase(); + else if (specifier.name.equals("doubleClick")) + specifier.name = "dblclick"; + else if (specifier.name.equals("mouseWheel")) + specifier.name = "wheel"; + writeSimpleDescriptor(specifier.name, null, handler, writeNewline); + } + + //--------------------------------- + // outputChildren + //--------------------------------- + + private void outputChildren(MXMLDescriptorSpecifier children, boolean writeNewline) + { + write(ASEmitterTokens.SQUARE_OPEN.getToken()); + if(writeNewline) + { + indentPush(); + writeNewline(); + } + outputDescriptorSpecifier(children, writeNewline); + if(writeNewline) + { + indentPop(); + writeNewline(); + } + write(ASEmitterTokens.SQUARE_CLOSE.getToken()); + } + +} diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLSubEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLSubEmitter.java new file mode 100644 index 0000000..25d7ae2 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/MXMLSubEmitter.java @@ -0,0 +1,125 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.royale.compiler.internal.codegen.mxml; + +import org.apache.royale.compiler.codegen.IEmitterTokens; +import org.apache.royale.compiler.codegen.mxml.js.IMXMLJSEmitter; +import org.apache.royale.compiler.common.ISourceLocation; +import org.apache.royale.compiler.projects.ICompilerProject; +import org.apache.royale.compiler.visitor.IBlockWalker; + +public class MXMLSubEmitter { + private IMXMLJSEmitter emitter; + + protected IMXMLJSEmitter getEmitter() + { + return emitter; + } + + protected IBlockWalker getMXMLWalker() + { + return emitter.getMXMLWalker(); + } + + protected ICompilerProject getProject() + { + return emitter.getMXMLWalker().getProject(); + } + + public MXMLSubEmitter(IMXMLJSEmitter emitter) + { + this.emitter = emitter; + } + + protected void write(IEmitterTokens value) + { + emitter.write(value); + } + + protected void write(String value) + { + emitter.write(value); + } + + protected void writeToken(IEmitterTokens value) + { + emitter.writeToken(value); + } + + protected void writeToken(String value) + { + emitter.writeToken(value); + } + + protected void writeNewline() + { + emitter.writeNewline(); + } + + protected void writeNewline(IEmitterTokens value) + { + emitter.writeNewline(value); + } + + protected void writeNewline(String value) + { + emitter.writeNewline(value); + } + + protected void writeNewline(IEmitterTokens value, boolean pushIndent) + { + emitter.writeNewline(value, pushIndent); + } + + protected void writeNewline(String value, boolean pushIndent) + { + emitter.writeNewline(value, pushIndent); + } + + protected void indentPush() + { + emitter.indentPush(); + } + + protected void indentPop() + { + emitter.indentPop(); + } + + protected void startMapping(ISourceLocation node) + { + emitter.startMapping(node); + } + + protected void startMapping(ISourceLocation node, int line, int column) + { + emitter.startMapping(node, line, column); + } + + protected void startMapping(ISourceLocation node, ISourceLocation afterNode) + { + emitter.startMapping(node, afterNode); + } + + protected void endMapping(ISourceLocation node) + { + emitter.endMapping(node); + } +} diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLDescriptorSpecifier.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLDescriptorSpecifier.java index 2208f3a..617b4ed 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLDescriptorSpecifier.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLDescriptorSpecifier.java @@ -21,10 +21,6 @@ package org.apache.royale.compiler.internal.codegen.mxml.royale; import java.util.ArrayList; -import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; -import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; -import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterTokens; - /** * @author Erik de Bruin */ @@ -118,282 +114,4 @@ public class MXMLDescriptorSpecifier extends MXMLNodeSpecifier //--------------------------------- public MXMLDescriptorSpecifier parent; - - //--------------------------------- - // currentIndent - //--------------------------------- - - private int currentIndent = 0; - - //-------------------------------------------------------------------------- - // - // Methods - // - //-------------------------------------------------------------------------- - - //--------------------------------- - // indent - //--------------------------------- - - protected String getIndent() - { - return getIndent(currentIndent); - } - - protected String getIndent(int numIndent) - { - final StringBuilder sb = new StringBuilder(); - if (parent != null) - { - sb.append(parent.getIndent()); - } - for (int i = 0; i < numIndent; i++) - sb.append(JSRoyaleEmitterTokens.INDENT.getToken()); - return sb.toString(); - } - - public void indentPush() - { - currentIndent++; - } - - public void indentPop() - { - if (currentIndent > 0) - { - currentIndent--; - } - } - - @Override - protected void writeNewline() - { - write(ASEmitterTokens.NEW_LINE); - write(getIndent(currentIndent)); - } - - //--------------------------------- - // outputEventSpecifier - //--------------------------------- - - private void outputEventSpecifier(boolean writeNewline) - { - // number of events - int count = 0; - for (MXMLEventSpecifier me : eventSpecifiers) - { - if (me.name != null) - count++; - } - write(count + ""); - - for (MXMLEventSpecifier me : eventSpecifiers) - { - writeDelimiter(writeNewline); - write(me.output(writeNewline)); - } - } - - //--------------------------------- - // outputPropertySpecifier - //--------------------------------- - - private String outputPropertySpecifier(boolean writeNewline) - { - write((isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); - write(name); - write((isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); - writeDelimiter(writeNewline); - - if (isProperty) - { - if (value != null) - { - write(ASEmitterTokens.TRUE); - writeDelimiter(writeNewline); - // need to do other escaping here? - // restrict="0-9.\" - if (value.endsWith("\\'") && !value.endsWith("\\\\'")) - { - value = value.substring(0, value.length() - 1) + "\\'"; - } - write(value); - } - else - { - write((hasArray) ? ASEmitterTokens.NULL : ASEmitterTokens.FALSE); - writeDelimiter(writeNewline); - write(ASEmitterTokens.SQUARE_OPEN); - indentPush(); - writeNewline(); - output(writeNewline); - indentPop(); - writeNewline(); - write(ASEmitterTokens.SQUARE_CLOSE); - } - - if (parent != null) - writeDelimiter(writeNewline); - } - else - { - for (MXMLDescriptorSpecifier md : propertySpecifiers) - { - if (md.name != null && md.name.equals("mxmlContent")) - { - childrenSpecifier = md; - propertySpecifiers.remove(md); - break; - } - } - - if (id != null || effectiveId != null) - { - write(propertySpecifiers.size() + 1 + ""); - writeDelimiter(writeNewline); - String idPropName = (effectiveId != null) ? "_id" - : "id"; - writeSimpleDescriptor(idPropName, ASEmitterTokens.TRUE.getToken(), - ASEmitterTokens.SINGLE_QUOTE.getToken() - + ((id != null) ? id : effectiveId) + ASEmitterTokens.SINGLE_QUOTE.getToken(), - writeNewline); - - writeDelimiter(writeNewline); - } - else - { - write(propertySpecifiers.size() + ""); - writeDelimiter(writeNewline); - } - - output(writeNewline); - } - - return sb.toString(); - } - - //--------------------------------- - // outputStyleSpecifier - //--------------------------------- - - private void outputStyleSpecifier(boolean writeNewline) - { - // TODO (erikdebruin) not yet implemented in Royale - - write("0"); - writeDelimiter(writeNewline); - } - - //--------------------------------- - // output - //--------------------------------- - - @Override - public String output(boolean writeNewline) - { - if (isTopNode) - { - int count = 0; - for (MXMLDescriptorSpecifier md : propertySpecifiers) - { - if (md.name != null) - count++; - } - - write(count + ""); - writeNewline(ASEmitterTokens.COMMA); - } - - MXMLDescriptorSpecifier model = null; // model goes first - MXMLDescriptorSpecifier beads = null; // beads go last - - for (MXMLDescriptorSpecifier md : propertySpecifiers) - { - if (md.name != null && md.name.equals("model")) - { - model = md; - - break; - } - } - - if (model != null) - { - write(model.outputPropertySpecifier(writeNewline)); - } - - for (MXMLDescriptorSpecifier md : propertySpecifiers) - { - if (md.name != null) - { - if (!md.name.equals("model") && !md.name.equals("beads")) - write(md.outputPropertySpecifier(writeNewline)); - else if (md.name.equals("beads")) - beads = md; - } - } - - if (beads != null) - { - write(beads.outputPropertySpecifier(writeNewline)); - } - - if (!isProperty) - { - outputStyleSpecifier(writeNewline); - - // TODO (erikdebruin) not yet implemented in Royale - //outputEffectSpecifier(writeNewline); - - outputEventSpecifier(writeNewline); - - if (!isTopNode) - { - writeDelimiter(writeNewline); - - if (childrenSpecifier == null) - write(ASEmitterTokens.NULL); - else - outputChildren(childrenSpecifier, writeNewline); - } - - boolean isLastChild = parent != null - && parent.propertySpecifiers.indexOf(this) == parent.propertySpecifiers - .size() - 1; - - if (!isLastChild && !isTopNode) - writeDelimiter(writeNewline); - } - - return sb.toString(); - } - - private void outputChildren(MXMLDescriptorSpecifier children, boolean writeNewline) - { - write(ASEmitterTokens.SQUARE_OPEN.getToken()); - if(writeNewline) - { - indentPush(); - writeNewline(); - } - write(children.output(writeNewline)); - if(writeNewline) - { - indentPop(); - writeNewline(); - } - write(ASEmitterTokens.SQUARE_CLOSE.getToken()); - } - - public String outputStateDescriptors(boolean writeNewLine) - { - for (MXMLDescriptorSpecifier md : propertySpecifiers) - { - write(ASEmitterTokens.SQUARE_OPEN); - write(md.output(writeNewLine)); - write(ASEmitterTokens.SQUARE_CLOSE); - writeNewline(ASEmitterTokens.COMMA); - } - return sb.toString(); - } } diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLEventSpecifier.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLEventSpecifier.java index 4c0f777..1e9de21 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLEventSpecifier.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLEventSpecifier.java @@ -22,7 +22,6 @@ package org.apache.royale.compiler.internal.codegen.mxml.royale; import java.util.Arrays; import java.util.List; -import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.royale.compiler.tree.mxml.IMXMLEventSpecifierNode; /** @@ -48,7 +47,7 @@ public class MXMLEventSpecifier extends MXMLNodeSpecifier // //-------------------------------------------------------------------------- - static List<String> nameMap = Arrays.asList( + public static List<String> nameMap = Arrays.asList( "rollOver", "rollOut", "mouseDown", @@ -82,21 +81,6 @@ public class MXMLEventSpecifier extends MXMLNodeSpecifier // output //--------------------------------- - public String output(boolean writeNewline) - { - String handler = ASEmitterTokens.THIS.getToken() - + ASEmitterTokens.MEMBER_ACCESS.getToken() + eventHandler; - if (nameMap.contains(name)) - name = name.toLowerCase(); - else if (name.equals("doubleClick")) - name = "dblclick"; - else if (name.equals("mouseWheel")) - name = "wheel"; - writeSimpleDescriptor(name, null, handler, writeNewline); - - return sb.toString(); - } - public static String getJSEventName(String name) { if (nameMap.contains(name)) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLNodeSpecifier.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLNodeSpecifier.java index 62d4b6e..df66d69 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLNodeSpecifier.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLNodeSpecifier.java @@ -19,9 +19,6 @@ package org.apache.royale.compiler.internal.codegen.mxml.royale; -import org.apache.royale.compiler.codegen.IEmitterTokens; -import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; - /** * @author Erik de Bruin */ @@ -36,20 +33,7 @@ public class MXMLNodeSpecifier public MXMLNodeSpecifier() { - sb = new StringBuilder(); } - - //-------------------------------------------------------------------------- - // - // Variables - // - //-------------------------------------------------------------------------- - - //--------------------------------- - // sb - //--------------------------------- - - protected StringBuilder sb; //-------------------------------------------------------------------------- // @@ -74,102 +58,4 @@ public class MXMLNodeSpecifier //--------------------------------- public boolean valueNeedsQuotes; - - //-------------------------------------------------------------------------- - // - // Methods - // - //-------------------------------------------------------------------------- - - //--------------------------------- - // output - //--------------------------------- - - public String output(boolean writeNewline) - { - return ""; - } - - //--------------------------------- - // write - //--------------------------------- - - protected void write(IEmitterTokens value) - { - write(value.getToken()); - } - - protected void write(String value) - { - sb.append(value); - } - - //--------------------------------- - // writeDelimiter - //--------------------------------- - - protected void writeDelimiter(boolean writeNewline) - { - if (writeNewline) - writeNewline(ASEmitterTokens.COMMA); - else - writeToken(ASEmitterTokens.COMMA); - } - - //--------------------------------- - // writeNewline - //--------------------------------- - - protected void writeNewline(IEmitterTokens value) - { - writeNewline(value.getToken()); - } - - protected void writeNewline(String value) - { - write(value); - writeNewline(); - } - - protected void writeNewline() - { - write(ASEmitterTokens.NEW_LINE); - } - - //--------------------------------- - // writeSimpleDescriptor - //--------------------------------- - - protected void writeSimpleDescriptor(String name, String type, String value, - boolean writeNewline) - { - write(ASEmitterTokens.SINGLE_QUOTE); - write(name); - write(ASEmitterTokens.SINGLE_QUOTE); - writeDelimiter(writeNewline); - - if (type != null) - { - write(type); - writeDelimiter(writeNewline); - } - - write(value); - } - - //--------------------------------- - // writeToken - //--------------------------------- - - protected void writeToken(IEmitterTokens value) - { - writeToken(value.getToken()); - } - - protected void writeToken(String value) - { - write(value); - write(ASEmitterTokens.SPACE); - } - } 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 85a0032..820d26a 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 @@ -38,13 +38,13 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.royale.abc.ABCConstants; import org.apache.royale.abc.instructionlist.InstructionList; import org.apache.royale.abc.semantics.Instruction; -import org.apache.royale.abc.semantics.MethodInfo; import org.apache.royale.abc.semantics.Name; import org.apache.royale.abc.semantics.Namespace; import org.apache.royale.abc.semantics.OneOperandInstruction; +import org.apache.royale.compiler.codegen.ISubEmitter; import org.apache.royale.compiler.codegen.as.IASEmitter; import org.apache.royale.compiler.codegen.js.IJSEmitter; -import org.apache.royale.compiler.codegen.js.IMappingEmitter; +import org.apache.royale.compiler.codegen.mxml.js.IMXMLJSEmitter; import org.apache.royale.compiler.codegen.mxml.royale.IMXMLRoyaleEmitter; import org.apache.royale.compiler.common.ASModifier; import org.apache.royale.compiler.common.DependencyType; @@ -71,13 +71,13 @@ import org.apache.royale.compiler.internal.codegen.js.JSSessionModel.PropertyNod import org.apache.royale.compiler.internal.codegen.js.JSSessionModel.BindableVarInfo; 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.royale.JSRoyaleBasicMXMLDescriptorEmitter; import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogDocEmitter; import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.royale.compiler.internal.codegen.js.jx.BindableEmitter; import org.apache.royale.compiler.internal.codegen.js.jx.PackageFooterEmitter; import org.apache.royale.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.royale.compiler.internal.codegen.mxml.MXMLEmitter; -import org.apache.royale.compiler.internal.codegen.mxml.MXMLEmitterTokens; import org.apache.royale.compiler.internal.driver.js.royale.JSCSSCompilationSession; import org.apache.royale.compiler.internal.projects.RoyaleJSProject; import org.apache.royale.compiler.internal.projects.RoyaleProject; @@ -102,7 +102,6 @@ import org.apache.royale.compiler.tree.metadata.IMetaTagNode; import org.apache.royale.compiler.tree.metadata.IMetaTagsNode; import org.apache.royale.compiler.tree.mxml.*; import org.apache.royale.compiler.units.ICompilationUnit; -import org.apache.royale.compiler.utils.DefinitionUtils; import org.apache.royale.compiler.utils.NativeUtils; import org.apache.royale.compiler.visitor.mxml.IMXMLBlockWalker; import org.apache.royale.swc.ISWC; @@ -115,7 +114,7 @@ import com.google.debugging.sourcemap.FilePosition; * @author Erik de Bruin */ public class MXMLRoyaleEmitter extends MXMLEmitter implements - IMXMLRoyaleEmitter, IMappingEmitter + IMXMLRoyaleEmitter, IMXMLJSEmitter { // the instances in a container @@ -154,6 +153,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements private String interfaceList; private boolean emitExports = true; + private ISubEmitter<MXMLDescriptorSpecifier> mxmlDescriptorEmitter; + /** * This keeps track of the entries in our temporary array of * DeferredInstanceFromFunction objects that we CG to help with @@ -179,6 +180,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements { super(out); sourceMapMappings = new ArrayList<SourceMapMapping>(); + + mxmlDescriptorEmitter = new JSRoyaleBasicMXMLDescriptorEmitter(this); } @Override @@ -840,6 +843,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements descriptorTree = new ArrayList<MXMLDescriptorSpecifier>(); propertiesTree = new MXMLDescriptorSpecifier(); + propertiesTree.name = node.getQualifiedName(); events = new ArrayList<MXMLEventSpecifier>(); instances = new ArrayList<MXMLDescriptorSpecifier>(); @@ -1112,8 +1116,15 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements writeNewline(" * @type {Array}"); writeNewline(" */"); writeNewline("this.mxmlsd = " + ASEmitterTokens.SQUARE_OPEN.getToken()); - indentPush(); - write(root.outputStateDescriptors(false)); + indentPush(); + + for (MXMLDescriptorSpecifier md : root.propertySpecifiers) + { + write(ASEmitterTokens.SQUARE_OPEN); + mxmlDescriptorEmitter.emit(md); + write(ASEmitterTokens.SQUARE_CLOSE); + writeNewline(ASEmitterTokens.COMMA); + } write("null"); write(ASEmitterTokens.SQUARE_CLOSE); indentPop(); @@ -1141,11 +1152,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements MXMLDescriptorSpecifier root = propertiesTree; root.isTopNode = true; - for(int i = 0; i < getCurrentIndent(); i++) - { - root.indentPush(); - } - write(root.output(true)); + mxmlDescriptorEmitter.emit(root); indentPop(); writeNewline(); @@ -2205,11 +2212,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements indentPush(); writeNewline("var data = ["); - for(int i = 0; i < getCurrentIndent(); i++) - { - root.indentPush(); - } - write(root.output(true)); + mxmlDescriptorEmitter.emit(root); indentPop(); writeNewline();
