make some method public and add some new methods so compilers can be invoked 
from FB


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

Branch: refs/heads/develop
Commit: 7f121cce75cb0df310877a135ccf9eeb7cb54836
Parents: b4da485
Author: Alex Harui <aha...@apache.org>
Authored: Wed Apr 2 23:04:10 2014 -0700
Committer: Alex Harui <aha...@apache.org>
Committed: Wed Apr 2 23:04:10 2014 -0700

----------------------------------------------------------------------
 .../org/apache/flex/compiler/clients/COMPC.java |   2 +-
 .../org/apache/flex/compiler/clients/MXMLC.java | 136 ++++++++++++++++++-
 2 files changed, 133 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7f121cce/compiler/src/org/apache/flex/compiler/clients/COMPC.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/clients/COMPC.java 
b/compiler/src/org/apache/flex/compiler/clients/COMPC.java
index ff1322d..66738c9 100644
--- a/compiler/src/org/apache/flex/compiler/clients/COMPC.java
+++ b/compiler/src/org/apache/flex/compiler/clients/COMPC.java
@@ -83,7 +83,7 @@ public class COMPC extends MXMLC
     private String swcOutputMessage;
     
     @Override
-    protected boolean configure(String[] args)
+    public boolean configure(String[] args)
     {
         return super.configure(args);
     }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/7f121cce/compiler/src/org/apache/flex/compiler/clients/MXMLC.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/clients/MXMLC.java 
b/compiler/src/org/apache/flex/compiler/clients/MXMLC.java
index e0d23e4..f019771 100644
--- a/compiler/src/org/apache/flex/compiler/clients/MXMLC.java
+++ b/compiler/src/org/apache/flex/compiler/clients/MXMLC.java
@@ -36,6 +36,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.output.CountingOutputStream;
 
 import org.apache.flex.compiler.Messages;
 import org.apache.flex.compiler.clients.problems.CompilerProblemCategorizer;
@@ -82,6 +83,7 @@ import org.apache.flex.compiler.targets.ITarget.TargetType;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IFileNode;
 import org.apache.flex.compiler.units.ICompilationUnit;
+import org.apache.flex.compiler.units.ICompilationUnit.UnitType;
 import org.apache.flex.swc.io.ISWFWriterFactory;
 import org.apache.flex.swf.Header;
 import org.apache.flex.swf.ISWF;
@@ -245,6 +247,71 @@ public class MXMLC
         return exitCode.code;
     }
     
+    /**
+     * Entry point for when you already have an MXML instance and just want to
+     * compile and not link. This is for FB integration, but other IDEs could
+     * use this too.
+     * 
+     * @param args Command line arguments.
+     * @param err An {@link OutputStream} to use instead of 
<code>System.err</code>.
+     * @return An exit code.
+     */
+    @SuppressWarnings("unused")
+    public int mainCompileOnly(final String[] args, OutputStream err)
+    {
+        if (err == null)
+            err = System.err;
+        
+        startTime = System.nanoTime();
+        
+        ExitCode exitCode = ExitCode.SUCCESS;
+        try
+        {
+            final boolean continueCompilation = configure(args);
+            boolean legacyOutput = config.useLegacyMessageFormat();
+            CompilerProblemCategorizer categorizer = null;
+            
+            if (legacyOutput)
+                categorizer = createProblemCategorizer();
+            
+            ProblemFormatter formatter = new 
WorkspaceProblemFormatter(workspace, categorizer); 
+            
+            ProblemPrinter printer = new ProblemPrinter(formatter, err);
+
+            if (continueCompilation)
+            {
+                compile(true); // skip linking
+                exitCode = printProblems(printer, legacyOutput);
+                reportTargetCompletion();
+            }
+            else if (problems.hasFilteredProblems())
+            {
+                printer.printProblems(problems.getFilteredProblems());
+                exitCode = ExitCode.FAILED_WITH_CONFIG_ERRORS;
+            }
+            else
+            {
+                exitCode = ExitCode.PRINT_HELP;
+            }
+        }
+        catch (Exception e)
+        {
+            (new PrintStream(err)).println(e.getMessage());
+            exitCode = ExitCode.FAILED_WITH_EXCEPTIONS;
+        }
+        finally
+        {
+            waitAndClose();
+            
+            if (Counter.COUNT_TOKENS || Counter.COUNT_NODES ||
+                Counter.COUNT_DEFINITIONS || Counter.COUNT_SCOPES)
+            {
+                Counter.getInstance().dumpCounts();
+            }
+        }
+        return exitCode.code;
+    }
+
     /** 
      * Print the problems in either the legacy format or the new format.
      * 
@@ -315,9 +382,9 @@ public class MXMLC
 
     protected Workspace workspace;
     protected FlexProject project;
-    protected Configuration config;
-    protected ProblemQuery problems;
-    protected ConfigurationBuffer configBuffer;
+    public Configuration config;
+    public ProblemQuery problems;
+    public ConfigurationBuffer configBuffer;
 
     protected Configurator projectConfigurator;
 
@@ -380,7 +447,7 @@ public class MXMLC
      * @param args command line arguments
      * @return True if mxmlc should continue with compilation.
      */
-    protected boolean configure(final String[] args)
+    public boolean configure(final String[] args)
     {
         projectConfigurator = createConfigurator();
         
@@ -529,6 +596,11 @@ public class MXMLC
      */
     protected boolean compile()
     {
+        return compile(false);
+    }
+    
+    private boolean compile(boolean skipLinking)
+    {
         boolean compilationSuccess = false;
         try
         {
@@ -548,6 +620,8 @@ public class MXMLC
             if (!config.getCreateTargetWithErrors() && problems.hasErrors())
                 return false;
 
+            if (skipLinking)
+                return true;
             final File outputFile = new File(getOutputFilePath());
             final int swfSize = writeSWF(swfTarget, outputFile);
             long endTime = System.nanoTime();
@@ -1025,4 +1099,58 @@ public class MXMLC
         return problems;
     }
 
+    public List<String> getSourceList()
+    {
+        ArrayList<String> list = new ArrayList<String>();
+        LinkedList<ICompilerProblem> problemList = new 
LinkedList<ICompilerProblem>();
+        try
+        {
+            ImmutableList<ICompilationUnit> units = 
target.getReachableCompilationUnits(problemList);
+            for (ICompilationUnit unit : units)
+            {
+                UnitType ut = unit.getCompilationUnitType();
+                if (ut == UnitType.AS_UNIT || ut == UnitType.MXML_UNIT)
+                {
+                    list.add(unit.getAbsoluteFilename());
+                }
+            }
+        }
+        catch (InterruptedException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        return list;
+    }
+    
+    public String getMainSource()
+    {
+        return mainCU.getAbsoluteFilename();
+    }
+    
+    public ISWF getSWFTarget()
+    {
+        return swfTarget;
+    }
+    
+    public int writeSWF(OutputStream outputStream)
+    {
+        
+        final Header.Compression compression = Header.decideCompression(
+                targetSettings.useCompression(), 
+                targetSettings.getSWFVersion(),
+                targetSettings.isDebugEnabled());
+        final ISWFWriterFactory writerFactory = 
SWFWriterAndSizeReporter.getSWFWriterFactory(
+                targetSettings.getSizeReport()); 
+        final ISWFWriter writer = writerFactory.createSWFWriter(swfTarget, 
compression, targetSettings.isDebugEnabled());
+        
+        // Write out the SWF, counting how many bytes were written.
+        final CountingOutputStream output =
+                new CountingOutputStream(outputStream);
+
+        writer.writeTo(output);
+        final int swfSize = output.getCount();
+        return swfSize;
+    }
 }

Reply via email to