You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2019/02/06 16:39:59 UTC

[royale-compiler] 03/05: FunctionNode: fixed issue where local named functions in MXML were not emitted in JS (closes #76)

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 ad2e39d4e1ea129cd10557b877b5ae80a12928e6
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Feb 6 08:00:39 2019 -0800

    FunctionNode: fixed issue where local named functions in MXML were not emitted in JS (closes #76)
---
 .../compiler/internal/tree/as/FunctionNode.java    | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/FunctionNode.java b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/FunctionNode.java
index e765d7b..83cc6cc 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/FunctionNode.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/FunctionNode.java
@@ -165,6 +165,12 @@ public class FunctionNode extends BaseTypedDefinitionNode implements IFunctionNo
      * Save the problems until later if we were parsed from somewhere we don't have a problems collection
      */
     private Collection<ICompilerProblem> parseProblems;
+
+    /**
+     * Indicates whether we've called rememberLocalFunction() on the parent
+     * function yet (if a parent function even exists in the first place) -JT
+     */
+    private boolean isRemembered = false;
     
     //
     // NodeBase overrides
@@ -203,12 +209,24 @@ public class FunctionNode extends BaseTypedDefinitionNode implements IFunctionNo
     @Override
     protected void analyze(EnumSet<PostProcessStep> set, ASScope scope, Collection<ICompilerProblem> problems)
     {
-        if (set.contains(PostProcessStep.POPULATE_SCOPE))
+        if (!isRemembered)
         {
+            //previously, we remembered local functions only during
+            //POPULATE_SCOPE. however, in MXML, functions get created multiple
+            //times, and the second time around, analyze() is NOT called with
+            //POPULATE_SCOPE. this causes our function to be forgotten.
+            //better to check if we've remembered or not no matter which steps
+            //were passed in. -JT
             final IFunctionNode parentFunctionNode = (IFunctionNode)getAncestorOfType(IFunctionNode.class);
             if (parentFunctionNode != null)
+            {
+                isRemembered = true;
                 parentFunctionNode.rememberLocalFunction(this);
-        
+            }
+        }
+
+        if (set.contains(PostProcessStep.POPULATE_SCOPE))
+        {
             FunctionDefinition definition = buildDefinition();
             setDefinition(definition);