subdocuments need to have their object.defineproperties spit out in their own context
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/e22e7e14 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/e22e7e14 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/e22e7e14 Branch: refs/heads/develop Commit: e22e7e14b63613ecd1bafe778ae2a6251cb0b14b Parents: b3f143c Author: Alex Harui <[email protected]> Authored: Fri Jul 31 16:43:23 2015 -0700 Committer: Alex Harui <[email protected]> Committed: Fri Jul 31 16:43:23 2015 -0700 ---------------------------------------------------------------------- .../compiler/internal/codegen/as/ASEmitter.java | 5 +++ .../internal/codegen/js/JSSessionModel.java | 37 ++++++++++++++++++++ .../codegen/js/flexjs/JSFlexJSEmitter.java | 11 ++++++ .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 7 ++-- 4 files changed, 57 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e22e7e14/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java index d16081d..fa743c2 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java @@ -126,6 +126,11 @@ public class ASEmitter implements IASEmitter, IEmitter return builder; } + protected void setBuilder(StringBuilder sb) + { + builder = sb; + } + protected void flushBuilder() { setBufferWrite(false); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e22e7e14/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java index 8bb30b4..2809937 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java @@ -22,6 +22,7 @@ package org.apache.flex.compiler.internal.codegen.js; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Stack; import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.tree.as.IGetterNode; @@ -44,6 +45,16 @@ public class JSSessionModel public ISetterNode setter; } + private static class Context + { + public HashMap<String, PropertyNodes> propertyMap; + public List<String> interfacePropertyMap; + public HashMap<String, PropertyNodes> staticPropertyMap; + public ArrayList<String> bindableVars; + public IClassDefinition classDefinition; + } + private Stack<Context> stack = new Stack<Context>(); + private HashMap<String, PropertyNodes> propertyMap = new HashMap<String, PropertyNodes>(); private List<String> interfacePropertyMap = new ArrayList<String>(); @@ -64,6 +75,32 @@ public class JSSessionModel this.currentClass = currentClass; } + public void pushClass(IClassDefinition currentClass) + { + Context context = new Context(); + context.bindableVars = bindableVars; + context.interfacePropertyMap = interfacePropertyMap; + context.propertyMap = propertyMap; + context.staticPropertyMap = staticPropertyMap; + context.classDefinition = this.currentClass; + stack.push(context); + this.currentClass = currentClass; + bindableVars = new ArrayList<String>(); + staticPropertyMap = new HashMap<String, PropertyNodes>(); + interfacePropertyMap = new ArrayList<String>(); + propertyMap = new HashMap<String, PropertyNodes>(); + } + + public void popClass() + { + Context context = stack.pop(); + this.currentClass = context.classDefinition; + bindableVars = context.bindableVars; + staticPropertyMap = context.staticPropertyMap; + propertyMap = context.propertyMap; + interfacePropertyMap = context.interfacePropertyMap; + } + public HashMap<String, PropertyNodes> getPropertyMap() { return propertyMap; http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e22e7e14/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java index 7b9b10a..67f54ba 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java @@ -23,6 +23,7 @@ import java.io.FilterWriter; import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter; import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter; +import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.definitions.IPackageDefinition; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter; @@ -375,4 +376,14 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter { definePropertyFunctionEmitter.emit(node); } + + public String stringifyDefineProperties(IClassDefinition cdef) + { + setBufferWrite(true); + accessorEmitter.emit(cdef); + String result = getBuilder().toString(); + getBuilder().setLength(0); + setBufferWrite(false); + return result; + } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/e22e7e14/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java index daade3e..5d44b8a 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java @@ -269,8 +269,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements classDefinition = cdef; IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()) .getASEmitter(); - IClassDefinition oldThisClass = ((JSFlexJSEmitter) asEmitter).getModel().getCurrentClass(); - ((JSFlexJSEmitter) asEmitter).getModel().setCurrentClass(cdef); + ((JSFlexJSEmitter) asEmitter).getModel().pushClass(cdef); IASNode classNode = node.getContainedClassDefinitionNode(); // visit tags @@ -302,6 +301,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements emitBindingData(cname, cdef); + write(((JSFlexJSEmitter) asEmitter).stringifyDefineProperties(cdef)); + descriptorTree = oldDescriptorTree; propertiesTree = oldPropertiesTree; events = oldEvents; @@ -314,7 +315,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements idCounter = oldIdCounter; inMXMLContent = oldInMXMLContent; classDefinition = oldClassDef; - ((JSFlexJSEmitter) asEmitter).getModel().setCurrentClass(oldThisClass); + ((JSFlexJSEmitter) asEmitter).getModel().popClass(); }
