allow use of @externs to generate typedefs from ActionScript

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

Branch: refs/heads/master
Commit: 2531a9c4c0fb8286c27dfd755c70d8271727cc58
Parents: eb2da04
Author: Alex Harui <[email protected]>
Authored: Thu Jan 19 09:27:54 2017 -0800
Committer: Alex Harui <[email protected]>
Committed: Thu Jan 19 09:28:16 2017 -0800

----------------------------------------------------------------------
 .../org/apache/flex/compiler/clients/COMPJSC.java  | 17 +++++++++++++----
 .../internal/codegen/js/JSSessionModel.java        |  2 ++
 .../compiler/internal/codegen/js/JSWriter.java     |  9 +++++++++
 .../codegen/js/flexjs/JSFlexJSEmitterTokens.java   |  1 +
 .../codegen/js/jx/PackageFooterEmitter.java        |  3 +++
 .../codegen/js/jx/PackageHeaderEmitter.java        | 15 +++++++++++++++
 6 files changed, 43 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java 
b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java
index 0d97e06..b208351 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java
@@ -20,6 +20,7 @@
 package org.apache.flex.compiler.clients;
 
 import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -43,6 +44,7 @@ import org.apache.flex.compiler.driver.js.IJSApplication;
 import org.apache.flex.compiler.exceptions.ConfigurationException;
 import org.apache.flex.compiler.exceptions.ConfigurationException.IOError;
 import 
org.apache.flex.compiler.exceptions.ConfigurationException.MustSpecifyTarget;
+import org.apache.flex.compiler.internal.codegen.js.JSWriter;
 import org.apache.flex.compiler.internal.driver.as.ASBackend;
 import org.apache.flex.compiler.internal.driver.js.amd.AMDBackend;
 import org.apache.flex.compiler.internal.driver.js.goog.GoogBackend;
@@ -201,6 +203,7 @@ public class COMPJSC extends MXMLJSC
                 String outputFolderName = getOutputFilePath();
                File swcFile = new File(outputFolderName);
                File jsOut = new File("js/out");
+               File externsOut = new File("externs");
                 ZipFile zipFile = null;
                ZipOutputStream zipOutputStream = null;
                String catalog = null;
@@ -308,9 +311,7 @@ public class COMPJSC extends MXMLJSC
                        }
                        else
                        {
-                               String outputClassFile = getOutputClassFile(
-                                       cu.getQualifiedNames().get(0), 
jsOut).getPath();
-                               System.out.println("Compiling file: " + 
outputClassFile);
+                               System.out.println("Compiling file: " + 
cu.getQualifiedNames().get(0));
                                
                                ICompilationUnit unit = cu;
        
@@ -328,8 +329,16 @@ public class COMPJSC extends MXMLJSC
                                            unit, false);
                                }
                                problems.addAll(errors);
+                               ByteArrayOutputStream temp = new 
ByteArrayOutputStream();
+                               writer.writeTo(temp);
+                               boolean isExterns = false;
+                               if (writer instanceof JSWriter)
+                                       isExterns = 
((JSWriter)writer).isExterns();
+                               String outputClassFile = getOutputClassFile(
+                                       cu.getQualifiedNames().get(0), 
isExterns ? externsOut : jsOut).getPath();
+                               System.out.println("Writing file: " + 
outputClassFile);         
                                zipOutputStream.putNextEntry(new 
ZipEntry(outputClassFile));
-                               writer.writeTo(zipOutputStream);
+                               temp.writeTo(zipOutputStream);
                             zipOutputStream.flush();
                                zipOutputStream.closeEntry();
                                writer.close();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
index 3964802..36d6881 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
@@ -77,6 +77,8 @@ public class JSSessionModel
     }
     private Stack<Context> stack = new Stack<Context>();
 
+    public boolean isExterns = false;
+
     public boolean inE4xFilter = false;
 
     private LinkedHashMap<String, PropertyNodes> propertyMap = new 
LinkedHashMap<String, PropertyNodes>();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
index 44c5f94..0eb6c9b 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
@@ -49,6 +49,13 @@ public class JSWriter implements IJSWriter
     @SuppressWarnings("unused")
     private boolean enableDebug;
 
+    private boolean isExterns = false;
+
+    public boolean isExterns()
+    {
+       return this.isExterns;
+    }
+    
     /**
      * Create a JSApplication writer.
      * 
@@ -91,6 +98,8 @@ public class JSWriter implements IJSWriter
 
         walker.visitCompilationUnit(compilationUnit);
 
+        isExterns = emitter.getModel().isExterns;
+        
         try
         {
             jsOut.write(emitter.postProcess(writer.toString()).getBytes());

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
index cff0a58..0a1d2d4 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
@@ -41,6 +41,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     QNAME("qName"),
     UNDERSCORE("_"),
     EMIT_COERCION("@flexjsemitcoercion"),
+    EXTERNS("@externs"),
     IGNORE_COERCION("@flexjsignorecoercion"),
     IGNORE_IMPORT("@flexjsignoreimport"),
     IGNORE_STRING_COERCION("@flexjsnoimplicitstringconversion"),

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index 57393e9..d2f53c5 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -175,6 +175,8 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
          // Removed this exclusion to support interface reflection (GD)
       //  if (!(tnode instanceof IInterfaceNode))
       //  {
+           if (!getEmitter().getModel().isExterns)
+           {
                    writeNewline();
                    writeNewline();
                    writeNewline();
@@ -191,6 +193,7 @@ public class PackageFooterEmitter extends JSSubEmitter 
implements
                    
write(getEmitter().formatQualifiedName(tnode.getQualifiedName()));
                    write(ASEmitterTokens.PAREN_CLOSE);
                    write(ASEmitterTokens.SEMICOLON);
+           }
        // }
 
            collectReflectionData(tnode);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2531a9c4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
index 805a6ee..73d3b80 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java
@@ -67,9 +67,22 @@ public class PackageHeaderEmitter extends JSSubEmitter 
implements
         ITypeDefinition type = EmitterUtils.findType(containedScope
                 .getAllLocalDefinitions());
         String qname = null;
+        boolean isExterns = false;
         if (type != null)
         {
             qname = type.getQualifiedName();
+            ITypeNode typeNode = type.getNode();
+            if (typeNode instanceof ClassNode)
+            {
+                ClassNode classNode = (ClassNode) typeNode;
+                ASDocComment asDoc = (ASDocComment) 
classNode.getASDocComment();
+                if (asDoc != null)
+                {
+                    String asDocString = asDoc.commentNoEnd();
+                    isExterns = 
asDocString.contains(JSFlexJSEmitterTokens.EXTERNS.getToken());
+                    getEmitter().getModel().isExterns = isExterns;
+                }
+            }
         }
         if (qname == null)
         {
@@ -119,6 +132,8 @@ public class PackageHeaderEmitter extends JSSubEmitter 
implements
         writeNewline(" * " + qname);
         writeNewline(" *");
         writeNewline(" * @fileoverview");
+        if (isExterns)
+               writeNewline(" * @externs");
         writeNewline(" *");
         // need to suppress access controls so access to protected/private 
from defineProperties
         // doesn't generate warnings.

Reply via email to