You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/12/23 08:40:51 UTC

[5/7] git commit: [flex-falcon] [refs/heads/develop] - fix binding for states

fix binding for states


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/5c41aef1
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/5c41aef1
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/5c41aef1

Branch: refs/heads/develop
Commit: 5c41aef1eb779b3a4665df1d6b6f24993ee37efa
Parents: 3fb1735
Author: Alex Harui <ah...@apache.org>
Authored: Sun Dec 21 07:30:56 2014 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Sun Dec 21 07:30:56 2014 -0800

----------------------------------------------------------------------
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java  | 108 +++++++++++++------
 .../mxml/flexjs/MXMLFlexJSEmitterTokens.java    |   2 +-
 2 files changed, 74 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/5c41aef1/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 4fadf08..ee62cdc 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
@@ -54,7 +54,6 @@ import org.apache.flex.compiler.internal.scopes.ASProjectScope;
 import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
 import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
 import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
-import org.apache.flex.compiler.internal.tree.mxml.MXMLDocumentNode;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -103,9 +102,11 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     private ArrayList<MXMLDescriptorSpecifier> allInstances = new ArrayList<MXMLDescriptorSpecifier>();
     private ArrayList<MXMLScriptSpecifier> scripts;
     //private ArrayList<MXMLStyleSpecifier> styles;
-
+    private IClassDefinition classDefinition;
+    
     private int eventCounter;
     private int idCounter;
+    private int bindingCounter;
 
     private boolean inMXMLContent;
     private boolean inStatesOverride;
@@ -176,9 +177,11 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
         eventCounter = 0;
         idCounter = 0;
-
+        bindingCounter = 0;
+        
         // visit MXML
         IClassDefinition cdef = node.getClassDefinition();
+        classDefinition = cdef;
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
         ((JSFlexJSEmitter) asEmitter).thisClass = cdef;
@@ -256,7 +259,9 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         idCounter = 0;
 
         // visit MXML
+        IClassDefinition oldClassDef = classDefinition;
         IClassDefinition cdef = node.getContainedClassDefinition();
+        classDefinition = cdef;
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
         ((JSFlexJSEmitter) asEmitter).thisClass = cdef;
@@ -302,6 +307,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         eventCounter = oldEventCounter;
         idCounter = oldIdCounter;
         inMXMLContent = oldInMXMLContent;
+        classDefinition = oldClassDef;
 
     }
 
@@ -737,6 +743,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         {
             s = getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)node);
         }
+        else if (node instanceof IdentifierNode)
+        {
+            s = ((IdentifierNode)node).getName();
+        }
         return s;
     }
     
@@ -920,6 +930,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 
     //--------------------------------------------------------------------------    
 
+    private HashMap<IMXMLEventSpecifierNode, String> eventHandlerNameMap = new HashMap<IMXMLEventSpecifierNode, String>();
+    
     @Override
     public void emitEventSpecifier(IMXMLEventSpecifierNode node)
     {
@@ -934,6 +946,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         eventSpecifier.type = node.getEventParameterDefinition()
                 .getTypeAsDisplayString();
 
+        eventHandlerNameMap.put(node, eventSpecifier.eventHandler);
+        
         IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
                 .getASEmitter();
 
@@ -1050,10 +1064,6 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
                 // Each one will generate code to push an IOverride instance.
                 for (IMXMLNode anode : snodes)
                 {
-                	// ToDo (erikdebruin): properly handle this type
-                    if (node instanceof IMXMLStateNode)
-                        continue;
-                    
                     switch (anode.getNodeID())
                     {
                         case MXMLPropertySpecifierID:
@@ -1063,12 +1073,12 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
                         }
                         case MXMLStyleSpecifierID:
                         {
-                            emitStyleOverride((IMXMLStyleSpecifierNode)node);
+                            emitStyleOverride((IMXMLStyleSpecifierNode)anode);
                             break;
                         }
                         case MXMLEventSpecifierID:
                         {
-                            emitEventOverride((IMXMLEventSpecifierNode)node);
+                            emitEventOverride((IMXMLEventSpecifierNode)anode);
                             break;
                         }
                         default:
@@ -1122,10 +1132,11 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         IASNode parentNode = propertyOrStyleNode.getParent();
         String id = parentNode instanceof IMXMLInstanceNode ?
                     ((IMXMLInstanceNode)parentNode).getEffectiveID() :
-                    "";
+                    null;
         
         String name = propertyOrStyleNode.getName();        
         
+        boolean valueIsDataBound = isDataBindingNode(propertyOrStyleNode.getChild(0));
         IMXMLInstanceNode propertyOrStyleValueNode = propertyOrStyleNode.getInstanceNode();
         
         MXMLDescriptorSpecifier setProp = new MXMLDescriptorSpecifier();
@@ -1133,15 +1144,19 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         setProp.name = nameToString(overrideName);
         setProp.parent = currentInstance;
         currentInstance.propertySpecifiers.add(setProp);
-            // Set its 'target' property to the id of the object
-            // whose property or style this override will set.
-        MXMLDescriptorSpecifier target = new MXMLDescriptorSpecifier();
-        target.isProperty = true;
-        target.name = "target";
-        target.parent = setProp;
-        target.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + id + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        setProp.propertySpecifiers.add(target);
-
+        
+        if (id != null)
+        {
+	            // Set its 'target' property to the id of the object
+	            // whose property or style this override will set.
+	        MXMLDescriptorSpecifier target = new MXMLDescriptorSpecifier();
+	        target.isProperty = true;
+	        target.name = "target";
+	        target.parent = setProp;
+	        target.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + id + ASEmitterTokens.SINGLE_QUOTE.getToken();
+	        setProp.propertySpecifiers.add(target);
+        }
+        
             // Set its 'name' property to the name of the property or style.
         MXMLDescriptorSpecifier pname = new MXMLDescriptorSpecifier();
         pname.isProperty = true;
@@ -1150,15 +1165,35 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         pname.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + name + ASEmitterTokens.SINGLE_QUOTE.getToken();
         setProp.propertySpecifiers.add(pname);
 
-            // Set its 'value' property to the value of the property or style.
-        MXMLDescriptorSpecifier value = new MXMLDescriptorSpecifier();
-        value.isProperty = true;
-        value.name = "value";
-        value.parent = setProp;
-        setProp.propertySpecifiers.add(value);
-        moveDown(false, null, value);
-        getMXMLWalker().walk(propertyOrStyleValueNode); // instance node
-        moveUp(false, false);
+        if (!valueIsDataBound)
+        {
+	            // Set its 'value' property to the value of the property or style.
+	        MXMLDescriptorSpecifier value = new MXMLDescriptorSpecifier();
+	        value.isProperty = true;
+	        value.name = "value";
+	        value.parent = setProp;
+	        setProp.propertySpecifiers.add(value);
+	        moveDown(false, null, value);
+	        getMXMLWalker().walk(propertyOrStyleValueNode); // instance node
+	        moveUp(false, false);
+        }
+        else
+        {
+            String overrideID = MXMLFlexJSEmitterTokens.BINDING_PREFIX.getToken() + bindingCounter++;
+	        setProp.id = overrideID;
+	        instances.add(setProp);
+	        BindingDatabase bd = BindingDatabase.bindingMap.get(classDefinition);
+	        Set<BindingInfo> bindingInfo = bd.getBindingInfo();
+	        IMXMLDataBindingNode bindingNode = (IMXMLDataBindingNode)propertyOrStyleNode.getChild(0);
+	        for (BindingInfo bi : bindingInfo)
+	        {
+	        	if (bi.node == bindingNode)
+	        	{
+	                bi.setDestinationString(overrideID + ".value");
+	                break;
+	        	}
+	        }
+        }
     }
         
     /**
@@ -1180,12 +1215,15 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         
         String name = eventNode.getName();
         
-        MXMLDocumentNode doc = (MXMLDocumentNode)eventNode.getAncestorOfType(MXMLDocumentNode.class);
-
-        Name eventHandler = doc.cdp.getEventHandlerName(eventNode);
+        String eventHandler = eventHandlerNameMap.get(eventNode);
+        if (eventHandler == null)
+        {
+        	emitEventSpecifier(eventNode);
+        	eventHandler = eventHandlerNameMap.get(eventNode);
+        }
 
         MXMLDescriptorSpecifier setEvent = new MXMLDescriptorSpecifier();
-        setEvent.isProperty = true;
+        setEvent.isProperty = false;
         setEvent.name = nameToString(eventOverride);
         setEvent.parent = currentInstance;
         currentInstance.propertySpecifiers.add(setEvent);
@@ -1198,7 +1236,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         target.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + id + ASEmitterTokens.SINGLE_QUOTE.getToken();
         setEvent.propertySpecifiers.add(target);
 
-        // Set its 'name' property to the name of the property or style.
+        // Set its 'name' property to the name of the event.
         MXMLDescriptorSpecifier pname = new MXMLDescriptorSpecifier();
         pname.isProperty = true;
         pname.name = "name";
@@ -1208,10 +1246,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         
         // Set its 'handlerFunction' property to the autogenerated event handler.
         MXMLDescriptorSpecifier handler = new MXMLDescriptorSpecifier();
-        handler.isProperty = false;
+        handler.isProperty = true;
         handler.name = "handlerFunction";
         handler.parent = setEvent;
-        handler.value = eventHandler.toString();
+        handler.value = ASEmitterTokens.THIS.getToken() + ASEmitterTokens.MEMBER_ACCESS.getToken() + eventHandler;
         setEvent.propertySpecifiers.add(handler);
         
     }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/5c41aef1/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitterTokens.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitterTokens.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitterTokens.java
index 8aa737b..88a1163 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitterTokens.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitterTokens.java
@@ -26,7 +26,7 @@ import org.apache.flex.compiler.codegen.IEmitterTokens;
  */
 public enum MXMLFlexJSEmitterTokens implements IEmitterTokens
 {
-    EVENT_PREFIX("$EH"), ID_PREFIX("$ID");
+    EVENT_PREFIX("$EH"), ID_PREFIX("$ID"), BINDING_PREFIX("$BID");
 
     private String token;