This is an automated email from the ASF dual-hosted git repository.

aharui pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9a1d1d6  fix nested states.  Fixes Fixes apache/royale-asjs#527
9a1d1d6 is described below

commit 9a1d1d6106ee1a9a45901427ae7df2ba3f1e1dc1
Author: Alex Harui <[email protected]>
AuthorDate: Thu Oct 24 10:46:59 2019 -0700

    fix nested states.  Fixes Fixes apache/royale-asjs#527
---
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     | 78 +++++++++++++++-------
 1 file changed, 55 insertions(+), 23 deletions(-)

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 430b7be..de59dc0 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
@@ -131,7 +131,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     private int bindingCounter;
 
     private boolean inMXMLContent;
-    private boolean inStatesOverride;
+    private Stack<IMXMLStateNode> inStatesOverride = new 
Stack<IMXMLStateNode>();
     private boolean makingSimpleArray;
     private boolean inStaticInitializer;
 
@@ -2117,9 +2117,12 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     @Override
     public void emitEventSpecifier(IMXMLEventSpecifierNode node)
     {
-       if (isStateDependent(node) && !inStatesOverride)
-               return;
-
+       IMXMLStateNode currentState = null;
+       if (!inStatesOverride.empty())
+               currentState = inStatesOverride.peek();
+        if (isStateDependent(node, currentState))
+            return;
+               
         IDefinition cdef = node.getDefinition();
 
         MXMLDescriptorSpecifier currentDescriptor = getCurrentDescriptor("i");
@@ -2140,7 +2143,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
 
            if (currentDescriptor != null)
                currentDescriptor.eventSpecifiers.add(eventSpecifier);
-           else if (!inStatesOverride) // in theory, if no currentdescriptor 
must be top tag event
+           else if (inStatesOverride.empty()) // in theory, if no 
currentdescriptor must be top tag event
                propertiesTree.eventSpecifiers.add(eventSpecifier);
         events.add(eventSpecifier);
     }
@@ -2148,7 +2151,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     @Override
     public void emitInstance(IMXMLInstanceNode node)
     {
-        if (isStateDependent(node) && !inStatesOverride)
+       IMXMLStateNode currentState = null;
+       if (!inStatesOverride.empty())
+               currentState = inStatesOverride.peek();
+        if (isStateDependent(node, currentState))
             return;
 
         ASTNodeID nodeID = node.getNodeID();
@@ -2233,12 +2239,13 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             List<IMXMLNode> snodes = 
classDefinitionNode.getNodesDependentOnState(stateNode.getStateName());
             if (snodes != null)
             {
-                for (int i=snodes.size()-1; i>=0; --i)
+               inStatesOverride.push(stateNode);
+                for (int i=0; i<snodes.size(); i++)
                 {
                     IMXMLNode inode = snodes.get(i);
                     if (inode.getNodeID() == ASTNodeID.MXMLInstanceID)
                     {
-                        emitInstanceOverride((IMXMLInstanceNode)inode);
+                        emitInstanceOverride((IMXMLInstanceNode)inode, 
stateNode);
                     }
                 }
                 // Next process the non-instance overrides dependent on this 
state.
@@ -2268,6 +2275,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                         }
                     }
                 }
+               inStatesOverride.pop();
             }
 
             moveUp(false, false);
@@ -2395,8 +2403,6 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
      */
     void emitEventOverride(IMXMLEventSpecifierNode eventNode)
     {
-        inStatesOverride = true;
-
         MXMLDescriptorSpecifier currentInstance = getCurrentDescriptor("ps");
         RoyaleProject project = (RoyaleProject) getMXMLWalker().getProject();
         Name eventOverride = project.getEventOverrideClassName();
@@ -2449,14 +2455,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                                eventHandler + 
ASEmitterTokens.SINGLE_QUOTE.getToken() +
                        ASEmitterTokens.PAREN_CLOSE.getToken();
         setEvent.propertySpecifiers.add(handler);
-
-        inStatesOverride = false;
     }
 
-    public void emitInstanceOverride(IMXMLInstanceNode instanceNode)
+    public void emitInstanceOverride(IMXMLInstanceNode instanceNode, 
IMXMLStateNode state)
     {
-        inStatesOverride = true;
-
         MXMLDescriptorSpecifier currentInstance = getCurrentDescriptor("ps");
         RoyaleProject project = (RoyaleProject) getMXMLWalker().getProject();
         Name instanceOverrideName = project.getInstanceOverrideClassName();
@@ -2558,7 +2560,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             if (sib == instanceNode)
                 break;
 
-            if (sib instanceof IMXMLInstanceNode && !isStateDependent(sib))
+            if (sib instanceof IMXMLInstanceNode && !isStateDependent(sib, 
state))
             {
                 prevStatelessSibling = sib;
             }
@@ -2588,8 +2590,6 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             rel.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + 
relativeToPropertyValue + ASEmitterTokens.SINGLE_QUOTE.getToken();
             addItems.propertySpecifiers.add(rel);
         }
-
-        inStatesOverride = false;
     }
 
     private String nameToString(Name name)
@@ -2601,18 +2601,41 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         else s = name.getBaseName();
         return s;
     }
+    
+    /**
+     * Determines whether a string matches a state's name or group name.
+     */
+    protected boolean inStateOrStateGroup(String name, IMXMLStateNode state)
+    {
+       if (state == null) return false;
+       
+       if (name.contentEquals(state.getStateName()))
+               return true;
+       
+       String[] groups = state.getStateGroups();
+       if (groups != null)
+       {
+               for (String s : groups)
+               {
+                       if (name.contentEquals(s))
+                               return true;
+               }
+       }
+       return false;
+    }
+    
     /**
      * Determines whether a node is state-dependent.
      * TODO: we should move to IMXMLNode
      */
-    protected boolean isStateDependent(IASNode node)
+    protected boolean isStateDependent(IASNode node, IMXMLStateNode 
currentState)
     {
         if (node instanceof IMXMLSpecifierNode)
         {
             String suffix = ((IMXMLSpecifierNode)node).getSuffix();
-            return suffix != null && suffix.length() > 0;
+            return suffix != null && suffix.length() > 0 && 
!inStateOrStateGroup(suffix, currentState);
         }
-        else if (isStateDependentInstance(node))
+        else if (isStateDependentInstance(node, currentState))
             return true;
         return false;
     }
@@ -2620,12 +2643,21 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     /**
      * Determines whether the geven node is an instance node, as is state 
dependent
      */
-    protected boolean isStateDependentInstance(IASNode node)
+    protected boolean isStateDependentInstance(IASNode node, IMXMLStateNode 
currentState)
     {
         if (node instanceof IMXMLInstanceNode)
         {
             String[] includeIn = ((IMXMLInstanceNode)node).getIncludeIn();
             String[] excludeFrom = ((IMXMLInstanceNode)node).getExcludeFrom();
+            if (includeIn != null && currentState != null)
+               for (String s : includeIn)
+                       if (inStateOrStateGroup(s, currentState)) return false;
+            if (excludeFrom != null && currentState != null)
+            {
+               for (String s : excludeFrom)
+                       if (inStateOrStateGroup(s, currentState)) return true;
+               return false;
+            }
             return includeIn != null || excludeFrom != null;
         }
         return false;
@@ -2661,7 +2693,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         if (isDataboundProp(node))
             return;
 
-        if (isStateDependent(node))
+        if (isStateDependent(node, null))
             return;
 
         IDefinition cdef = node.getDefinition();

Reply via email to