You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/04/13 20:56:41 UTC
[49/51] [partial] git commit: [flex-falcon]
[refs/heads/feature/maven-migration-test] - - Check-In of the migrated
project to make error analysis easier
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/compiler/internal/as/codegen/UnknownTreePatternInputOutput.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/compiler/internal/as/codegen/UnknownTreePatternInputOutput.java b/compiler-build-tools/src/main/java/org/apache/flex/compiler/internal/as/codegen/UnknownTreePatternInputOutput.java
new file mode 100644
index 0000000..f551331
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/compiler/internal/as/codegen/UnknownTreePatternInputOutput.java
@@ -0,0 +1,306 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.internal.as.codegen;
+
+import java.io.PrintWriter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ext.DefaultHandler2;
+
+/**
+ * UnknownTreePatternInputOutput is a support class that reads
+ * an XML file with template data and populates a map of finding templates,
+ * and may also write this map out as Java code to be copied into
+ * the UnknownTreeHandler as hard-coded patterns.
+ */
+class UnknownTreePatternInputOutput extends DefaultHandler2
+{
+ /**
+ * The map of templates by node ID to read into.
+ */
+ Map<String, ArrayList<Template>> destination;
+
+ /**
+ * Package name to use. Hard-coded for now.
+ */
+ String packageName = "org.apache.flex.compiler.internal.as.codegen";
+
+ /**
+ * Class name to use. Also hard-coded.
+ */
+ String className = "UnknownTreeHandlerPatterns";
+
+ /**
+ * Emitter to use. Hard-coded.
+ */
+ String emitterName = "org.apache.flex.compiler.internal.as.codegen.CmcEmitter";
+
+ /**
+ * Load a map of templates from an XML file.
+ * @param pattern_file - the path of the XML pattern file.
+ * @param dest - the destination map.
+ */
+ boolean load(String pattern_file, Map<String, ArrayList<Template>> dest)
+ {
+ this.destination = dest;
+
+ try
+ {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setNamespaceAware(true);
+
+ SAXParser parser = factory.newSAXParser();
+ parser.parse( new java.io.FileInputStream(pattern_file), this);
+ return true;
+ }
+ catch ( Throwable load_failed )
+ {
+ System.err.println("Load of " + pattern_file + " failed!");
+ load_failed.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * This stack tracks UnknownTreeFindingTemplate objects from
+ * their startElement event to their endElement event;
+ * it's used to create the pattern/subpattern hierarchy.
+ */
+ Stack<Template> nodeStack = new Stack<Template>();
+
+ /**
+ * Create new UnknownTreeFindingTemplate objects in response to Pattern
+ * elements, and decode the Pattern's attributes.
+ */
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes)
+ {
+ if ( ! (localName.equals("Pattern")) )
+ {
+ if ( ! (localName.equals("SEW")) )
+ System.err.println("Unknown element " + localName);
+ return;
+ }
+
+ Template template = new Template();
+
+ for ( int index = 0; index < attributes.getLength(); index++)
+ {
+ String attr_name = attributes.getLocalName(index);
+ String attr_value = attributes.getValue(index);
+
+ if ( "ID".equals(attr_name) )
+ {
+ template.id = attr_value;
+ }
+ else if ( "cantHaveState".equals(attr_name) )
+ {
+ String state_id = "__" + attr_value + "_NT";
+ template.cantHaveState = state_id;
+ }
+ else if ( "mustHaveState".equals(attr_name) )
+ {
+ String state_id = "__" + attr_value + "_NT";
+ template.mustHaveState = state_id;
+ }
+ else if ( "problem".equals(attr_name) )
+ {
+ String class_name;
+ if ( attr_value.startsWith("org.apache.") )
+ class_name = attr_value;
+ else
+ class_name = "org.apache.flex.compiler.problems." + attr_value;
+ template.problemClass = class_name;
+ }
+ else if ( "nodeClass".equals(attr_name) )
+ {
+ String class_name;
+ if ( attr_value.startsWith("org.apache.") )
+ class_name = attr_value;
+ else
+ class_name = "org.apache.flex.compiler.internal.tree.as." + attr_value;
+ template.nodeClass = class_name;
+ }
+ else if ( "provisional".equals(attr_name) )
+ {
+ template.provisional = Boolean.valueOf(attr_value);
+ }
+ else
+ {
+ System.err.println("** Unknown attr name:" + attr_name);
+ }
+ }
+
+
+ // Top-level templates go into the map by node id;
+ // subpatterns get linked to their immediate parent.
+ if ( nodeStack.isEmpty() )
+ {
+ assert template.problemClass != null : "Top-level template " + template + " must have a problem class.";
+
+ if ( ! (destination.containsKey(template.id)) )
+ destination.put(template.id, new ArrayList<Template>());
+
+ destination.get(template.id).add(template);
+ }
+ else
+ {
+ Template base = nodeStack.peek();
+ if ( base.requiredSubtree == null )
+ base.requiredSubtree = template;
+ else
+ System.err.println("already has subtree: " + base);
+ }
+
+ this.nodeStack.push(template);
+ }
+
+ /**
+ * Maintain the UnknownTreeFindingTemplate stack.
+ */
+ @Override
+ public void endElement(String uri, String localName, String qName)
+ {
+ if ( localName.equals("Pattern") )
+ this.nodeStack.pop();
+ }
+
+ /**
+ * Load an XML file containing patterns and dump equivalent Java code to System.out.
+ */
+ public static void main(String[] argv)
+ throws Exception
+ {
+ if ( argv.length < 2 )
+ {
+ System.err.println("Usage: java org.apache.flex.compiler.internal.as.codegen.UnknownTreePatternInputOutput <xml pattern file> <destination java file>");
+ System.exit(1);
+ }
+
+ new UnknownTreePatternInputOutput().dumpTemplateData(argv[0], argv[1]);
+ }
+
+ PrintWriter output;
+
+ /**
+ * Read an XML file of patterns and dump the equivalent Java code to the target file.
+ * @param src_file_name - the path of the XML file.
+ * @param dest_file_name - the path of the output Java file.
+ */
+ void dumpTemplateData(String src_file_name, String dest_file_name)
+ throws Exception
+ {
+ if ( !load(src_file_name, new HashMap<String, ArrayList<Template>>()) )
+ return;
+
+ output = new PrintWriter(dest_file_name);
+
+ output.println("package " + this.packageName + ";");
+ output.println("import java.util.ArrayList;");
+ output.println("import java.util.HashMap;");
+ output.println("import java.util.Map;");
+ output.println("import org.apache.flex.compiler.tree.ASTNodeID;");
+ output.println("import static org.apache.flex.compiler.tree.ASTNodeID.*;");
+ output.println("import " + this.emitterName + ";");
+ output.println();
+ output.println("public class " + this.className);
+ output.println("{");
+ output.println();
+ output.println(" // Patterns generated " + new java.util.Date().toString() + " from " + src_file_name.replaceAll("\\\\", "/"));
+ output.println(" public static Map<ASTNodeID, ArrayList<UnknownTreeFinding.Template> > allTemplates = new HashMap<ASTNodeID, ArrayList<UnknownTreeFinding.Template>>();");
+
+ output.println(" static");
+ output.println(" {");
+
+ for ( String id: destination.keySet() )
+ {
+ String templates_name = "templates_for_" + id;
+ output.printf(" ArrayList<UnknownTreeFinding.Template> %s = allTemplates.get(%s);%n", templates_name, id);
+ output.printf(" if ( %s == null ) {%n", templates_name);
+ output.printf(" %s = new ArrayList<UnknownTreeFinding.Template>();%n", templates_name);
+ output.printf(" allTemplates.put(%s, %s);%n", id, templates_name);
+ output.printf(" }%n");
+
+ for ( Template templ: destination.get(id) )
+ {
+ output.printf(" {%n");
+ dumpTemplate(templ, "current_template");
+ output.printf(" %s.add(current_template);%n", templates_name);
+ output.printf(" }%n");
+ }
+ }
+ output.println(" }");
+ output.println("}");
+ output.close();
+ }
+
+ /**
+ * Recursively dump a template.
+ * @param templ - the template to dump.
+ * @param var_name - the name by which this template will be known
+ * in the output Java code. As this routine recurses, it builds
+ * successively longer variable names.
+ */
+ void dumpTemplate(Template templ, String var_name)
+ {
+ output.printf(" UnknownTreeFinding.Template %s = new UnknownTreeFinding.Template();%n", var_name);
+ output.printf(" %s.id = %s;%n", var_name, templ.id);
+ if ( templ.problemClass != null )
+ output.printf(" %s.problemClass = %s.class;%n", var_name, templ.problemClass);
+ if ( templ.nodeClass != null )
+ output.printf(" %s.nodeClass = %s.class;%n", var_name, templ.nodeClass);
+ if ( templ.mustHaveState != null )
+ output.printf(" %s.mustHaveState = CmcEmitter.%s;%n", var_name, templ.mustHaveState);
+ if ( templ.cantHaveState != null )
+ output.printf(" %s.cantHaveState = CmcEmitter.%s;%n", var_name, templ.cantHaveState);
+ output.printf(" %s.provisional = %s;%n", var_name, templ.provisional);
+
+ if ( templ.requiredSubtree != null )
+ {
+ String subtemp_name = var_name + "_subtempl";
+ dumpTemplate(templ.requiredSubtree, subtemp_name);
+ output.printf(" %s.requiredSubtree = %s;%n", var_name, subtemp_name);
+ }
+ }
+
+ /**
+ * Build-time representation of a UnknownTreeFinding.Template object.
+ */
+ private static class Template
+ {
+ String id = "UnknownID";
+
+ String problemClass;
+ String nodeClass;
+ String mustHaveState;
+ String cantHaveState;
+ Boolean provisional = Boolean.FALSE;
+
+ Template requiredSubtree;
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/BaseProblemGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/BaseProblemGeneratorMojo.java b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/BaseProblemGeneratorMojo.java
index 04929a5..f0c29ca 100644
--- a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/BaseProblemGeneratorMojo.java
+++ b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/BaseProblemGeneratorMojo.java
@@ -50,6 +50,7 @@ public abstract class BaseProblemGeneratorMojo extends AbstractMojo
abstract protected File getInputDirectory();
abstract protected File getOutputDirectory();
abstract protected String getOutputFile();
+ abstract protected void clean(File outputFile) throws MojoExecutionException;
public void execute() throws MojoExecutionException
{
@@ -61,12 +62,8 @@ public abstract class BaseProblemGeneratorMojo extends AbstractMojo
}
}
- // If the file already exists, delete it before generating output.
- if(generatedFile.exists()) {
- if(!generatedFile.delete()) {
- throw new MojoExecutionException("Could not clear previously created file: " + generatedFile.getPath());
- }
- }
+ // Give the generator a chance to clean up.
+ clean(generatedFile);
try {
PrintWriter writer = new PrintWriter(new FileWriter(generatedFile, true));
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemEnumGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemEnumGeneratorMojo.java b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemEnumGeneratorMojo.java
index 77c3d1c..b8d1fae 100644
--- a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemEnumGeneratorMojo.java
+++ b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemEnumGeneratorMojo.java
@@ -149,4 +149,14 @@ public class ProblemEnumGeneratorMojo
return "PROBLEM_" + problemTypeName;
}
+ @Override
+ protected void clean(File outputFile) throws MojoExecutionException {
+ // If the file already exists, delete it before generating output.
+ if(outputFile.exists()) {
+ if(!outputFile.delete()) {
+ throw new MojoExecutionException("Could not clear previously created file: " + outputFile.getPath());
+ }
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemResourceBundleGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemResourceBundleGeneratorMojo.java b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemResourceBundleGeneratorMojo.java
index a240c0c..fd97798 100644
--- a/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemResourceBundleGeneratorMojo.java
+++ b/compiler-build-tools/src/main/java/org/apache/flex/compiler/tools/problems/ProblemResourceBundleGeneratorMojo.java
@@ -16,6 +16,7 @@
package org.apache.flex.compiler.tools.problems;
+import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@@ -98,4 +99,9 @@ public class ProblemResourceBundleGeneratorMojo
return "";
}
+ @Override
+ protected void clean(File outputFile) throws MojoExecutionException {
+ // TODO: Clear all the content after: "# Messages for Compiler problems are written below by ProblemLocalizer."
+ }
+
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/AntTestAdapter.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/AntTestAdapter.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/AntTestAdapter.java
new file mode 100644
index 0000000..cd3cb4f
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/AntTestAdapter.java
@@ -0,0 +1,115 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Created by christoferdutz on 23.02.16.
+ */
+public class AntTestAdapter implements ITestAdapter {
+
+ private static EnvProperties env = EnvProperties.initiate();
+
+ private static final File PLAYERGLOBAL_SWC = new File(FilenameNormalization.normalize(env.FPSDK + "\\" + env.FPVER + "\\playerglobal.swc"));
+ // The Ant script for compiler.tests copies a standalone player to the temp directory.
+ private static final File FLASHPLAYER = new File(FilenameNormalization.normalize(env.FDBG));
+
+ private static final File LIBS_ROOT = new File(FilenameNormalization.normalize(env.SDK + "\\frameworks\\libs"));
+ private static final File RESOURCE_BUNDLES_ROOT = new File(FilenameNormalization.normalize(env.SDK + "\\frameworks\\locale\\en_US"));
+
+ @Override
+ public String getTempDir() {
+ return FilenameNormalization.normalize("temp"); // ensure this exists
+ }
+
+ @Override
+ public List<File> getLibraries(boolean withFlex) {
+ // Do some checks if all needed environment variables are set.
+ if (withFlex) {
+ assertNotNull("Environment variable FLEX_HOME is not set", env.SDK);
+ }
+ assertNotNull("Environment variable PLAYERGLOBAL_HOME is not set", env.FPSDK);
+
+ // Create a list of libs needed to compile.
+ List<File> libraries = new ArrayList<File>();
+ libraries.add(getPlayerglobal());
+ if (withFlex)
+ {
+ libraries.add(getFlexArtifact("framework"));
+ libraries.add(getFlexArtifact("rpc"));
+ libraries.add(getFlexArtifact("spark"));
+ }
+ return libraries;
+ }
+
+ @Override
+ public File getPlayerglobal() {
+ return PLAYERGLOBAL_SWC;
+ }
+
+ @Override
+ public File getFlashplayerDebugger() {
+ return FLASHPLAYER;
+ }
+
+ @Override
+ public String getFlexManifestPath(String type) {
+ return env.SDK + "\\frameworks\\" + type + "-manifest.xml";
+ }
+
+ @Override
+ public File getFlexArtifact(String artifactName) {
+ return getLib(artifactName);
+ }
+
+ @Override
+ public File getFlexArtifactResourceBundle(String artifactName) {
+ return getResourceBundle(artifactName);
+ }
+
+ @Override
+ public String getFlexJsManifestPath(String type) {
+ return null;
+ }
+
+ @Override
+ public File getFlexJSArtifact(String artifactName) {
+ return null;
+ }
+
+ @Override
+ public File getUnitTestBaseDir() {
+ return new File("test-files");
+ }
+
+ private File getLib(String artifactId) {
+ return new File(LIBS_ROOT, artifactId + ".swc");
+ }
+
+ private File getResourceBundle(String artifactId) {
+ return new File(RESOURCE_BUNDLES_ROOT, artifactId + "_rb.swc");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/EnvProperties.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/EnvProperties.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/EnvProperties.java
new file mode 100644
index 0000000..be22fee
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/EnvProperties.java
@@ -0,0 +1,149 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+
+
+/**
+ * EnvProperties checks in following order for a value.
+ *
+ * 1) unittest.properties
+ * 2) environment variables
+ * 3) for key FLEX_HOME & PLAYERGLOBAL_HOME sets a default value.
+ */
+public class EnvProperties {
+
+ /**
+ * FLEX_HOME
+ */
+ public String SDK;
+
+ /**
+ * TLF_HOME
+ */
+ public String TLF;
+
+ /**
+ * PLAYERGLOBAL_HOME
+ */
+ public String FPSDK;
+
+ /**
+ * AIR_HOME
+ */
+ public String AIRSDK;
+
+ /**
+ * FLASHPLAYER_DEBUGGER
+ */
+ public String FDBG;
+
+ /**
+ * ASJS_HOME
+ */
+ public String ASJS;
+
+ /**
+ * PLAYERGLOBAL_VERSION
+ */
+ public String FPVER;
+
+
+ private static EnvProperties env;
+
+ public static EnvProperties initiate() {
+ if(env == null) {
+ env = new EnvProperties();
+ env.setup();
+ }
+ return env;
+ }
+
+ private void setup()
+ {
+ String prefix = "";
+ Properties p = new Properties();
+ String envFileName = FilenameNormalization.normalize("../env.properties");
+ try {
+ File f = new File(envFileName);
+ if (f.exists())
+ {
+ p.load(new FileInputStream( f ));
+ prefix = "env.";
+ }
+ } catch (FileNotFoundException e) {
+ System.out.println(envFileName + " not found");
+ try {
+ File f = new File("unittest.properties");
+ p.load(new FileInputStream( f ));
+ } catch (FileNotFoundException e1) {
+ System.out.println("unittest.properties not found");
+ } catch (IOException e1) {
+ // Ignore
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+
+ SDK = p.getProperty(prefix + "FLEX_HOME", System.getenv("FLEX_HOME"));
+ if(SDK == null)
+ {
+ SDK = FilenameNormalization.normalize("../../flex-sdk");
+ File mxmlc = new File(SDK + "/lib/mxmlc.jar");
+ if (!mxmlc.exists())
+ SDK = FilenameNormalization.normalize("../compiler/generated/dist/sdk");
+ }
+ System.out.println("environment property - FLEX_HOME = " + SDK);
+
+ FPSDK = p.getProperty(prefix + "PLAYERGLOBAL_HOME", System.getenv("PLAYERGLOBAL_HOME"));
+ if(FPSDK == null)
+ FPSDK = FilenameNormalization.normalize("../compiler/generated/dist/sdk/frameworks/libs/player");
+ System.out.println("environment property - PLAYERGLOBAL_HOME = " + FPSDK);
+
+ FPVER = p.getProperty(prefix + "PLAYERGLOBAL_VERSION", System.getenv("PLAYERGLOBAL_VERSION"));
+ if (FPVER == null)
+ FPVER = "11.1";
+ System.out.println("environment property - PLAYERGLOBAL_VERSION = " + FPVER);
+
+ TLF = p.getProperty(prefix + "TLF_HOME", System.getenv("TLF_HOME"));
+ if (TLF == null)
+ {
+ TLF = FilenameNormalization.normalize("../../flex-tlf");
+ }
+ System.out.println("environment property - TLF_HOME = " + TLF);
+
+ AIRSDK = p.getProperty(prefix + "AIR_HOME", System.getenv("AIR_HOME"));
+ System.out.println("environment property - AIR_HOME = " + AIRSDK);
+
+ FDBG = p.getProperty(prefix + "FLASHPLAYER_DEBUGGER", System.getenv("FLASHPLAYER_DEBUGGER"));
+ System.out.println("environment property - FLASHPLAYER_DEBUGGER = " + FDBG);
+
+ ASJS = p.getProperty(prefix + "ASJS_HOME", System.getenv("ASJS_HOME"));
+ if (ASJS == null)
+ ASJS = FilenameNormalization.normalize("../../flex-asjs");
+ System.out.println("environment property - ASJS_HOME = " + ASJS);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/FilenameNormalization.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/FilenameNormalization.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/FilenameNormalization.java
new file mode 100644
index 0000000..7ef5e68
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/FilenameNormalization.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+import java.io.File;
+
+import org.apache.commons.io.FilenameUtils;
+
+/**
+ * Utility class to normalize filenames. All Files entering the driver
+ * should be run through this class
+ */
+public class FilenameNormalization
+{
+ /**
+ * Normalizes an array of files.
+ *
+ * @see #normalize(File)
+ * @param files Array of files to normalize.
+ * @return Array of normalized files.
+ */
+ public static File[] normalize(File[] files)
+ {
+ File[] result = new File[files.length];
+ for (int i = 0; i < files.length; ++i)
+ {
+ result[i] = normalize(files[i]);
+ }
+ return result;
+ }
+
+ /**
+ * Normalize a {@link File}. This method normalizes the case of the file path
+ * characters and then calls {@link FilenameUtils#normalize(String)}.
+ * @see FilenameUtils#normalize(String)
+ * @param f A file.
+ * @return The normalized File.
+ */
+ public static File normalize(File f)
+ {
+ String caseNormalizedAbsPath = f.getAbsolutePath();
+ return new File(FilenameUtils.normalize(caseNormalizedAbsPath));
+ }
+
+ /**
+ * Normalize a {@link String}. This method normalizes the case of the file
+ * path characters and then calls {@link FilenameUtils#normalize(String)}.
+ *
+ * @see FilenameUtils#normalize(String)
+ * @param path The fiel path.
+ * @return The normalized String. If the given path is already normalized,
+ * the original string object will be returned.
+ */
+ public static String normalize(String path)
+ {
+ File f = new File(path);
+ String caseNormalizedAbsPath = f.getAbsolutePath();
+ String normalized = FilenameUtils.normalize(caseNormalizedAbsPath);
+
+ if (normalized == null)
+ return path;
+
+ // If the path is already normalized, return the original string object
+ // to prevent duplicated string objects.
+ if (normalized.equals(path))
+ return path;
+ else
+ return normalized;
+ }
+
+ /**
+ * Determines whether a file path is in normalized form.
+ *
+ * @param path A file path.
+ */
+ public static boolean isNormalized(String path)
+ {
+ String normalizedPath = normalize(path);
+ return normalizedPath.equals(path);
+ }
+
+ /**
+ * Get the normalized file path of a Java {@link File} object.
+ *
+ * @param file File object.
+ * @return Normalized file path.
+ */
+ public static String normalizeFileToPath(File file)
+ {
+ return normalize(file.getAbsolutePath());
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/ITestAdapter.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/ITestAdapter.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/ITestAdapter.java
new file mode 100644
index 0000000..5f35557
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/ITestAdapter.java
@@ -0,0 +1,50 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by christoferdutz on 23.02.16.
+ */
+public interface ITestAdapter {
+
+ String getTempDir();
+
+ List<File> getLibraries(boolean withFlex);
+
+ File getPlayerglobal();
+
+ File getFlashplayerDebugger();
+
+ String getFlexManifestPath(String type);
+
+ File getFlexArtifact(String artifactName);
+
+ File getFlexArtifactResourceBundle(String artifactName);
+
+ String getFlexJsManifestPath(String type);
+
+ File getFlexJSArtifact(String artifactName);
+
+ File getUnitTestBaseDir();
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/MavenTestAdapter.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/MavenTestAdapter.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/MavenTestAdapter.java
new file mode 100644
index 0000000..457249d
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/MavenTestAdapter.java
@@ -0,0 +1,208 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.ArchiveException;
+import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.archivers.ArchiveStreamFactory;
+import org.apache.commons.io.FilenameUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+
+/**
+ * Created by christoferdutz on 23.02.16.
+ */
+public class MavenTestAdapter implements ITestAdapter {
+
+ private static final int KILOBYTE = 1024;
+ private static final int MEGABYTE = KILOBYTE * 1024;
+ private static final int BUFFER_MAX = MEGABYTE;
+
+ @Override
+ public String getTempDir() {
+ File tempDir = new File("target/surefire-temp");
+ if(!tempDir.exists()) {
+ if(!tempDir.mkdirs()) {
+ throw new RuntimeException("Could not create temp dir at: " + tempDir.getAbsolutePath());
+ }
+ }
+ return tempDir.getPath();
+ }
+
+ @Override
+ public List<File> getLibraries(boolean withFlex) {
+ List<File> libs = new ArrayList<File>();
+ libs.add(getPlayerglobal());
+ if(withFlex) {
+ String flexVersion = System.getProperty("flexVersion");
+ libs.add(getDependency("org.apache.flex.framework", "framework", flexVersion, "swc", null));
+ libs.add(getDependency("org.apache.flex.framework", "rpc", flexVersion, "swc", null));
+ libs.add(getDependency("org.apache.flex.framework", "spark", flexVersion, "swc", null));
+ }
+ return libs;
+ }
+
+ @Override
+ public File getPlayerglobal() {
+ return getDependency("com.adobe.flash.framework", "playerglobal",
+ System.getProperty("flashVersion"), "swc", null);
+ }
+
+ @Override
+ public File getFlashplayerDebugger() {
+ // TODO: If the archive isn't unpacked, unpack it.
+ // TODO: Return a reference to the player debugger executable, depending on the current platform.
+ String FLASHPLAYER_DEBUGGER = System.getProperty("FLASHPLAYER_DEBUGGER", null);
+ if(FLASHPLAYER_DEBUGGER == null || FLASHPLAYER_DEBUGGER.length() == 0) {
+ throw new RuntimeException("You have to specify the location of the flash debug player executable.");
+ }
+ return new File(FLASHPLAYER_DEBUGGER);
+ /*return getDependency("com.adobe.flash.runtime", "player-debugger",
+ System.getProperty("flashVersion"), "zip", null);*/
+ }
+
+ @Override
+ public String getFlexManifestPath(String type) {
+ File configsZip = getDependency("org.apache.flex.framework", "framework",
+ System.getProperty("flexVersion"), "zip", "configs");
+ File frameworkDir = configsZip.getParentFile();
+ File unpackedConfigsDir = new File(frameworkDir, "configs_zip");
+ // If the directory doesn't exist, we have to create it by unpacking the zip archive.
+ // This is identical behaviour to Flexmojos, which does the same thing.
+ if(!unpackedConfigsDir.exists()) {
+ unpackFrameworkConfigs(configsZip, unpackedConfigsDir);
+ }
+ return new File(unpackedConfigsDir, type + "-manifest.xml").getPath();
+ }
+
+ @Override
+ public File getFlexArtifact(String artifactName) {
+ String flexVersion = System.getProperty("flexVersion");
+ return getDependency("org.apache.flex.framework", artifactName, flexVersion, "swc", null);
+ }
+
+ @Override
+ public File getFlexArtifactResourceBundle(String artifactName) {
+ String flexVersion = System.getProperty("flexVersion");
+ return getDependency("org.apache.flex.framework", artifactName, flexVersion, "rb.swc", "en_US");
+ }
+
+ @Override
+ public String getFlexJsManifestPath(String type) {
+ File configsZip = getDependency("org.apache.flex.framework.flexjs", "framework",
+ System.getProperty("flexJsVersion"), "zip", "configs");
+ File frameworkDir = configsZip.getParentFile();
+ File unpackedConfigsDir = new File(frameworkDir, "configs_zip");
+ // If the directory doesn't exist, we have to create it by unpacking the zip archive.
+ // This is identical behaviour to Flexmojos, which does the same thing.
+ if(!unpackedConfigsDir.exists()) {
+ unpackFrameworkConfigs(configsZip, unpackedConfigsDir);
+ }
+ return new File(unpackedConfigsDir, type + "-manifest.xml").getPath();
+ }
+
+ @Override
+ public File getFlexJSArtifact(String artifactName) {
+ String flexJsVersion = System.getProperty("flexJsVersion");
+ return getDependency("org.apache.flex.framework.flexjs", artifactName, flexJsVersion, "swc", null);
+ }
+
+ @Override
+ public File getUnitTestBaseDir() {
+ return new File(FilenameUtils.normalize("target/test-classes"));
+ }
+
+ private File getDependency(String groupId, String artifactId, String version, String type, String classifier) {
+ String dependencyPath = System.getProperty("mavenLocalRepoDir") + File.separator +
+ groupId.replaceAll("\\.", Matcher.quoteReplacement(File.separator)) + File.separator + artifactId + File.separator + version +
+ File.separator + artifactId + "-" + version + ((classifier != null) ? "-" + classifier : "") + "." +
+ type;
+ File dependency = new File(dependencyPath);
+ if(!dependency.exists()) {
+ throw new RuntimeException("Could not read SWC dependency at " + dependency.getAbsolutePath());
+ }
+ return dependency;
+ }
+
+ private void unpackFrameworkConfigs(File configZip, File outputDirectory) {
+ final byte[] data = new byte[BUFFER_MAX];
+ ArchiveInputStream archiveInputStream = null;
+ ArchiveEntry entry;
+ try {
+ archiveInputStream = new ArchiveStreamFactory().createArchiveInputStream(
+ new BufferedInputStream(new FileInputStream(configZip)));
+ if(!outputDirectory.exists() && !outputDirectory.mkdirs()) {
+ throw new RuntimeException("Could not create output directory for config zip at " +
+ outputDirectory.getPath());
+ }
+ while ((entry = archiveInputStream.getNextEntry()) != null) {
+ final File outputFile = new File(outputDirectory, entry.getName());
+
+ // Entry is a directory.
+ if (entry.isDirectory()) {
+ if (!outputFile.exists()) {
+ if(!outputFile.mkdirs()) {
+ throw new RuntimeException(
+ "Could not create output directory " + outputFile.getAbsolutePath());
+ }
+ }
+ }
+
+ // Entry is a file.
+ else {
+ final FileOutputStream fos = new FileOutputStream(outputFile);
+ BufferedOutputStream dest = null;
+ try {
+ dest = new BufferedOutputStream(fos, BUFFER_MAX);
+
+ int count;
+ while ((count = archiveInputStream.read(data, 0, BUFFER_MAX)) != -1) {
+ dest.write(data, 0, count);
+ }
+ } finally {
+ if(dest != null) {
+ dest.flush();
+ dest.close();
+ }
+ }
+ }
+ }
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException("Error unpacking resources", e);
+ } catch (IOException e) {
+ throw new RuntimeException("Error unpacking resources", e);
+ } catch (ArchiveException e) {
+ throw new RuntimeException("Error unpacking resources", e);
+ } finally {
+ if(archiveInputStream != null) {
+ try {
+ archiveInputStream.close();
+ } catch(Exception e) {
+ // Ignore...
+ }
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-build-tools/src/main/java/org/apache/flex/utils/TestAdapterFactory.java
----------------------------------------------------------------------
diff --git a/compiler-build-tools/src/main/java/org/apache/flex/utils/TestAdapterFactory.java b/compiler-build-tools/src/main/java/org/apache/flex/utils/TestAdapterFactory.java
new file mode 100644
index 0000000..ccdb0c2
--- /dev/null
+++ b/compiler-build-tools/src/main/java/org/apache/flex/utils/TestAdapterFactory.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.utils;
+
+/**
+ * Created by christoferdutz on 10.03.16.
+ */
+public class TestAdapterFactory {
+
+ private static final ITestAdapter adapter =
+ System.getProperty("buildType", "Ant").equals("Maven") ?
+ new MavenTestAdapter() : new AntTestAdapter();
+
+ /**
+ * Depending on the "buildType" system-property, create the corresponding test-adapter
+ * Make the AntTestAdapter the default.
+ *
+ * @return test adapter instance for the given type of build.
+ */
+ public static ITestAdapter getTestAdapter() {
+ return adapter;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jburg-types/src/main/java/org/apache/flex/compiler/internal/as/codegen/IASNodeAdapter.java
----------------------------------------------------------------------
diff --git a/compiler-jburg-types/src/main/java/org/apache/flex/compiler/internal/as/codegen/IASNodeAdapter.java b/compiler-jburg-types/src/main/java/org/apache/flex/compiler/internal/as/codegen/IASNodeAdapter.java
new file mode 100644
index 0000000..d35f2a4
--- /dev/null
+++ b/compiler-jburg-types/src/main/java/org/apache/flex/compiler/internal/as/codegen/IASNodeAdapter.java
@@ -0,0 +1,74 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.internal.as.codegen;
+
+import jburg.burg.emitlangs.EmitLang;
+import jburg.burg.inode.InodeAdapter;
+import jburg.burg.inode.InodeAdapter2;
+
+/**
+ * IASNodeAdapter generates method calls into
+ * a BURM to access properties of an IASNode.
+ */
+public class IASNodeAdapter implements InodeAdapter
+{
+ /**
+ * @return true if the adapter can handle this type of inode.
+ */
+ public boolean accept(String inodeClassName)
+ {
+ return "IASNode".equals(inodeClassName);
+ }
+
+ /**
+ * Generate an expression to fetch a node's child count.
+ * @param node_path - the code generator's path to the node.
+ * @param emitter - the compiler-compiler's code emitter.
+ * @return said expression.
+ */
+ public String genGetArity(String node_path, EmitLang emitter)
+ {
+ return emitter.genCallMethod("SemanticUtils", "getChildCount", new String[] { node_path } );
+ }
+
+ /**
+ * Generate an expression to fetch a node's Nth child.
+ * @param node_path - the code generator's path to the node.
+ * @param index - the index expression.
+ * @param emitter - the compiler-compiler's code emitter.
+ * @return said expression.
+ */
+ public String genGetNthChild(String node_path, String index, EmitLang emitter)
+ {
+ return emitter.genCallMethod("SemanticUtils", "getNthChild", new String[] { node_path, index } );
+ }
+
+ /**
+ * Generate an expression to fetch a node's node ID.
+ * @param node_path - the code generator's path to the node.
+ * @param emitter - the compiler-compiler's code emitter.
+ * @return said expression.
+ */
+ public String genGetOperator(String node_path, EmitLang emitter)
+ {
+ return emitter.genCallMethod(node_path, "getNodeID", null);
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/asjsc
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/asjsc b/compiler-jx/src/assembly/scripts/asjsc
new file mode 100755
index 0000000..6c65155
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/asjsc
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+################################################################################
+##
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+################################################################################
+
+
+#
+# mxmlc shell script to launch falcon-mxmlc.jar on OSX, Unix, or Cygwin.
+# In Windows Command Prompt, use mxmlc.bat instead.
+#
+
+if [ "x${FALCON_HOME}" = "x" ]
+then
+ SCRIPT_HOME=`dirname "$0"`
+ FALCON_HOME=${SCRIPT_HOME}/../../compiler
+fi
+
+echo Using Falcon codebase: $FALCON_HOME
+
+if [ "x${FLEX_HOME}" = "x" ]
+then
+ FLEX_HOME=${FALCON_HOME}/generated/dist/sdk
+fi
+echo Using Flex SDK: $FLEX_HOME
+
+case `uname` in
+ CYGWIN*)
+ OS="Windows"
+ ;;
+ *)
+ OS=Unix
+esac
+
+D32=''
+
+if [ $OS = "Windows" ]; then
+
+ FALCON_HOME=`cygpath -m $FALCON_HOME`
+ FLEX_HOME=`cygpath -m $FLEX_HOME`
+
+elif [ $OS = "Unix" ]; then
+
+ check64="`java -version 2>&1 | grep -i 64-Bit`"
+ isOSX="`uname | grep -i Darwin`"
+ javaVersion="`java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}'`"
+
+ if [ "$isOSX" != "" -a "$HOSTTYPE" = "x86_64" -a "$check64" != "" -a "$javaVersion" = "1.6" ]; then
+ D32='-d32'
+ fi
+fi
+
+VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false "
+
+java $VMARGS $D32 $SETUP_SH_VMARGS -Dflexcompiler="$FALCON_HOME" -Dflexlib="$FLEX_HOME/frameworks" -jar "$SCRIPT_HOME/../lib/mxmlc.jar" +flexlib="$FLEX_HOME/frameworks" -external-library-path="$SCRIPT_HOME/../libs/JS.swc" "$@"
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/asjsc.bat
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/asjsc.bat b/compiler-jx/src/assembly/scripts/asjsc.bat
new file mode 100644
index 0000000..041fbcf
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/asjsc.bat
@@ -0,0 +1,29 @@
+@echo off
+
+rem
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+rem
+
+rem
+rem mxmlc.bat script to launch falcon-mxmlc.jar in Windows Command Prompt.
+rem On OSX, Unix, or Cygwin, use the mxmlc shell script instead.
+rem
+
+if "x%FALCON_HOME%"=="x" (set FALCON_HOME=%~dp0..) else echo Using Falcon codebase: %FALCON_HOME%
+
+if "x%FLEX_HOME%"=="x" (set FLEX_HOME=%~dp0..) else echo Using Flex SDK: %FLEX_HOME%
+
+@java -Dsun.io.useCanonCaches=false -Xms32m -Xmx512m -Dflexcompiler="%FALCON_HOME%" -Dflexlib="%FLEX_HOME%\frameworks" -jar "%FALCON_HOME%\lib\mxmlc.jar" -external-library-path="%FALCON_HOME%\libs\JS.swc" %*
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/compc
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/compc b/compiler-jx/src/assembly/scripts/compc
new file mode 100755
index 0000000..bb48e71
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/compc
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+################################################################################
+##
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+################################################################################
+
+
+#
+# mxmlc shell script to launch falcon-mxmlc.jar on OSX, Unix, or Cygwin.
+# In Windows Command Prompt, use mxmlc.bat instead.
+#
+
+if [ "x${FALCON_HOME}" = "x" ]
+then
+ SCRIPT_HOME=`dirname "$0"`
+ FALCON_HOME=${SCRIPT_HOME}/../../compiler
+fi
+
+echo Using Falcon codebase: $FALCON_HOME
+
+if [ "x${FLEX_HOME}" = "x" ]
+then
+ FLEX_HOME=${FALCON_HOME}/generated/dist/sdk
+fi
+echo Using Flex SDK: $FLEX_HOME
+
+case `uname` in
+ CYGWIN*)
+ OS="Windows"
+ ;;
+ *)
+ OS=Unix
+esac
+
+D32=''
+
+if [ $OS = "Windows" ]; then
+
+ FALCON_HOME=`cygpath -m $FALCON_HOME`
+ FLEX_HOME=`cygpath -m $FLEX_HOME`
+
+elif [ $OS = "Unix" ]; then
+
+ check64="`java -version 2>&1 | grep -i 64-Bit`"
+ isOSX="`uname | grep -i Darwin`"
+ javaVersion="`java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}'`"
+
+ if [ "$isOSX" != "" -a "$HOSTTYPE" = "x86_64" -a "$check64" != "" -a "$javaVersion" = "1.6" ]; then
+ D32='-d32'
+ fi
+fi
+
+VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false "
+
+java $VMARGS $D32 $SETUP_SH_VMARGS -Dflexcompiler="$FALCON_HOME" -Dflexlib="$FLEX_HOME/frameworks" -jar "$SCRIPT_HOME/../lib/compc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/compc.bat
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/compc.bat b/compiler-jx/src/assembly/scripts/compc.bat
new file mode 100644
index 0000000..6626760
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/compc.bat
@@ -0,0 +1,29 @@
+@echo off
+
+rem
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+rem
+
+rem
+rem mxmlc.bat script to launch falcon-mxmlc.jar in Windows Command Prompt.
+rem On OSX, Unix, or Cygwin, use the mxmlc shell script instead.
+rem
+
+if "x%FALCON_HOME%"=="x" (set FALCON_HOME=%~dp0..) else echo Using Falcon codebase: %FALCON_HOME%
+
+if "x%FLEX_HOME%"=="x" (set FLEX_HOME=%~dp0..) else echo Using Flex SDK: %FLEX_HOME%
+
+@java -Dsun.io.useCanonCaches=false -Xms32m -Xmx512m -Dflexcompiler="%FALCON_HOME%" -Dflexlib="%FLEX_HOME%\frameworks" -jar "%FALCON_HOME%\lib\mxmlc.jar" %*
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/mxmlc
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/mxmlc b/compiler-jx/src/assembly/scripts/mxmlc
new file mode 100755
index 0000000..9218961
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/mxmlc
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+################################################################################
+##
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+################################################################################
+
+
+#
+# mxmlc shell script to launch falcon-mxmlc.jar on OSX, Unix, or Cygwin.
+# In Windows Command Prompt, use mxmlc.bat instead.
+#
+
+if [ "x${FALCON_HOME}" = "x" ]
+then
+ SCRIPT_HOME=`dirname "$0"`
+ FALCON_HOME=${SCRIPT_HOME}/../../compiler
+fi
+
+echo Using Falcon codebase: $FALCON_HOME
+
+if [ "x${FLEX_HOME}" = "x" ]
+then
+ FLEX_HOME=${FALCON_HOME}/generated/dist/sdk
+fi
+echo Using Flex SDK: $FLEX_HOME
+
+case `uname` in
+ CYGWIN*)
+ OS="Windows"
+ ;;
+ *)
+ OS=Unix
+esac
+
+D32=''
+
+if [ $OS = "Windows" ]; then
+
+ FALCON_HOME=`cygpath -m $FALCON_HOME`
+ FLEX_HOME=`cygpath -m $FLEX_HOME`
+
+elif [ $OS = "Unix" ]; then
+
+ check64="`java -version 2>&1 | grep -i 64-Bit`"
+ isOSX="`uname | grep -i Darwin`"
+ javaVersion="`java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}'`"
+
+ if [ "$isOSX" != "" -a "$HOSTTYPE" = "x86_64" -a "$check64" != "" -a "$javaVersion" = "1.6" ]; then
+ D32='-d32'
+ fi
+fi
+
+VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false "
+
+java $VMARGS $D32 $SETUP_SH_VMARGS -Dflexcompiler="$FALCON_HOME" -Dflexlib="$FLEX_HOME/frameworks" -jar "$SCRIPT_HOME/../lib/mxmlc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/assembly/scripts/mxmlc.bat
----------------------------------------------------------------------
diff --git a/compiler-jx/src/assembly/scripts/mxmlc.bat b/compiler-jx/src/assembly/scripts/mxmlc.bat
new file mode 100644
index 0000000..6626760
--- /dev/null
+++ b/compiler-jx/src/assembly/scripts/mxmlc.bat
@@ -0,0 +1,29 @@
+@echo off
+
+rem
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements. See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License. You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+rem
+
+rem
+rem mxmlc.bat script to launch falcon-mxmlc.jar in Windows Command Prompt.
+rem On OSX, Unix, or Cygwin, use the mxmlc shell script instead.
+rem
+
+if "x%FALCON_HOME%"=="x" (set FALCON_HOME=%~dp0..) else echo Using Falcon codebase: %FALCON_HOME%
+
+if "x%FLEX_HOME%"=="x" (set FLEX_HOME=%~dp0..) else echo Using Flex SDK: %FLEX_HOME%
+
+@java -Dsun.io.useCanonCaches=false -Xms32m -Xmx512m -Dflexcompiler="%FALCON_HOME%" -Dflexlib="%FLEX_HOME%\frameworks" -jar "%FALCON_HOME%\lib\mxmlc.jar" %*
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/com/google/javascript/jscomp/FlexJSDiagnosticGroups.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/FlexJSDiagnosticGroups.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/FlexJSDiagnosticGroups.java
new file mode 100644
index 0000000..5b77b44
--- /dev/null
+++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/FlexJSDiagnosticGroups.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.google.javascript.jscomp;
+
+/**
+ * Custom DiagnosticGroups allow @suppress directives to disable
+ * certain warnings while letting other warnings in the group
+ * show.
+ */
+public class FlexJSDiagnosticGroups {
+
+ /**
+ * Flex ItemRenderer Factories store the constructor in a variable
+ * resulting in this warning.
+ */
+ public static final DiagnosticGroup FLEXJS_NOT_A_CONSTRUCTOR =
+ DiagnosticGroups.registerGroup("flexjsNotAConstructor",
+ TypeCheck.NOT_A_CONSTRUCTOR);
+
+ /**
+ * Flex code calls super.methodName from functions other than
+ * overrides of the methodName.
+ */
+ public static final DiagnosticGroup FLEXJS_SUPER_CALL_TO_DIFFERENT_NAME =
+ DiagnosticGroups.registerGroup("flexjsSuperCallToDifferentName",
+ ProcessClosurePrimitives.BASE_CLASS_ERROR);
+ /*
+ public static final DiagnosticGroup FLEXJS_REFERENCE_BEFORE_DECLARE =
+ DiagnosticGroups.registerGroup("flexjsReferenceBeforeDeclare",
+ VariableReferenceCheck.UNDECLARED_REFERENCE);
+ */
+
+ /**
+ * Flex code won't always generate a goog.requires for types only used
+ * in JSDoc annotations, but the compiler complains.
+ */
+ public static final DiagnosticGroup FLEXJS_UNKNOWN_JSDOC_TYPE_NAME =
+ DiagnosticGroups.registerGroup("flexjsUnknownJSDocTypeName",
+ RhinoErrorReporter.TYPE_PARSE_ERROR);
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/com/google/javascript/jscomp/JXCompilerOptions.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/JXCompilerOptions.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/JXCompilerOptions.java
new file mode 100644
index 0000000..c31c46d
--- /dev/null
+++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/JXCompilerOptions.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.google.javascript.jscomp;
+
+public class JXCompilerOptions extends CompilerOptions
+{
+
+ private static final long serialVersionUID = 2021530437904249081L;
+
+ public JXCompilerOptions()
+ {
+ super();
+
+ declaredGlobalExternsOnWindow = false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java b/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
new file mode 100644
index 0000000..5470f47
--- /dev/null
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
@@ -0,0 +1,107 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.asdoc.flexjs;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.flex.compiler.asdoc.IASDocComment;
+import org.apache.flex.compiler.asdoc.IASDocTag;
+
+import antlr.Token;
+
+public class ASDocComment implements IASDocComment
+{
+
+ public ASDocComment(Token t)
+ {
+ token = t;
+ }
+
+ Token token;
+
+ public String commentNoEnd()
+ {
+ String s = token.getText();
+ String[] lines = s.split("\n");
+ StringBuilder sb = new StringBuilder();
+ int n = lines.length;
+ if (n == 1)
+ {
+ int c = lines[0].indexOf("*/");
+ if (c != -1)
+ lines[0] = lines[0].substring(0, c);
+ }
+ sb.append(lines[0]);
+ sb.append("\n");
+ for (int i = 1; i < n - 1; i++)
+ {
+ String line = lines[i];
+ int star = line.indexOf("*");
+ sb.append(" ");
+ if (star > -1)
+ sb.append(line.substring(star));
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public String getDescription()
+ {
+ return null;
+ }
+
+ @Override
+ public void compile()
+ {
+ }
+
+ @Override
+ public boolean hasTag(String name)
+ {
+ return false;
+ }
+
+ @Override
+ public IASDocTag getTag(String name)
+ {
+ return null;
+ }
+
+ @Override
+ public Map<String, List<IASDocTag>> getTags()
+ {
+ return null;
+ }
+
+ @Override
+ public Collection<IASDocTag> getTagsByName(String string)
+ {
+ return null;
+ }
+
+ @Override
+ public void paste(IASDocComment source)
+ {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/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
new file mode 100644
index 0000000..b3b9c64
--- /dev/null
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/COMPJSC.java
@@ -0,0 +1,430 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.clients;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.flex.compiler.codegen.as.IASWriter;
+import org.apache.flex.compiler.driver.IBackend;
+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.JSSharedData;
+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;
+import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSSWCBackend;
+import org.apache.flex.compiler.internal.driver.mxml.jsc.MXMLJSCJSSWCBackend;
+import org.apache.flex.compiler.internal.driver.mxml.vf2js.MXMLVF2JSSWCBackend;
+import org.apache.flex.compiler.internal.projects.CompilerProject;
+import org.apache.flex.compiler.internal.targets.FlexJSSWCTarget;
+import org.apache.flex.compiler.internal.targets.JSTarget;
+import org.apache.flex.compiler.problems.ICompilerProblem;
+import org.apache.flex.compiler.problems.InternalCompilerProblem;
+import org.apache.flex.compiler.problems.UnableToBuildSWFProblem;
+import org.apache.flex.compiler.targets.ITarget.TargetType;
+import org.apache.flex.compiler.targets.ITargetSettings;
+import org.apache.flex.compiler.units.ICompilationUnit;
+
+/**
+ * @author Erik de Bruin
+ * @author Michael Schmalle
+ */
+public class COMPJSC extends MXMLJSC
+{
+ /*
+ * Exit code enumerations.
+ */
+ static enum ExitCode
+ {
+ SUCCESS(0),
+ PRINT_HELP(1),
+ FAILED_WITH_PROBLEMS(2),
+ FAILED_WITH_EXCEPTIONS(3),
+ FAILED_WITH_CONFIG_PROBLEMS(4);
+
+ ExitCode(int code)
+ {
+ this.code = code;
+ }
+
+ final int code;
+ }
+
+ @Override
+ public String getName()
+ {
+ return FLEX_TOOL_COMPC;
+ }
+
+ @Override
+ public int execute(String[] args)
+ {
+ return staticMainNoExit(args);
+ }
+
+ /**
+ * Java program entry point.
+ *
+ * @param args command line arguments
+ */
+ public static void main(final String[] args)
+ {
+ int exitCode = staticMainNoExit(args);
+ System.exit(exitCode);
+ }
+
+ /**
+ * Entry point for the {@code <compc>} Ant task.
+ *
+ * @param args Command line arguments.
+ * @return An exit code.
+ */
+ public static int staticMainNoExit(final String[] args)
+ {
+ long startTime = System.nanoTime();
+
+ IBackend backend = new ASBackend();
+ for (String s : args)
+ {
+ if (s.contains("-js-output-type"))
+ {
+ jsOutputType = JSOutputType.fromString(s.split("=")[1]);
+
+ switch (jsOutputType)
+ {
+ case AMD:
+ backend = new AMDBackend();
+ break;
+
+ case JSC:
+ backend = new MXMLJSCJSSWCBackend();
+ break;
+
+ case FLEXJS:
+ case FLEXJS_DUAL:
+ backend = new MXMLFlexJSSWCBackend();
+ break;
+
+ case GOOG:
+ backend = new GoogBackend();
+ break;
+
+ case VF2JS:
+ backend = new MXMLVF2JSSWCBackend();
+ break;
+
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+ }
+
+ final COMPJSC mxmlc = new COMPJSC(backend);
+ final List<ICompilerProblem> problems = new ArrayList<ICompilerProblem>();
+ final int exitCode = mxmlc.mainNoExit(args, problems, true);
+
+ long endTime = System.nanoTime();
+ JSSharedData.instance.stdout((endTime - startTime) / 1e9 + " seconds");
+
+ return exitCode;
+ }
+
+ public COMPJSC(IBackend backend)
+ {
+ super(backend);
+ }
+
+ /**
+ * Main body of this program. This method is called from the public static
+ * method's for this program.
+ *
+ * @return true if compiler succeeds
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ @Override
+ protected boolean compile()
+ {
+ boolean compilationSuccess = false;
+
+ try
+ {
+ project.getSourceCompilationUnitFactory().addHandler(asFileHandler);
+
+ if (setupTargetFile())
+ buildArtifact();
+
+ if (jsTarget != null)
+ {
+ Collection<ICompilerProblem> errors = new ArrayList<ICompilerProblem>();
+ Collection<ICompilerProblem> warnings = new ArrayList<ICompilerProblem>();
+
+ if (!config.getCreateTargetWithErrors())
+ {
+ problems.getErrorsAndWarnings(errors, warnings);
+ if (errors.size() > 0)
+ return false;
+ }
+
+ File outputFolder = new File(getOutputFilePath());
+
+ Set<String> externs = config.getExterns();
+ Collection<ICompilationUnit> roots = ((FlexJSSWCTarget)target).getReachableCompilationUnits(errors);
+ Collection<ICompilationUnit> reachableCompilationUnits = project.getReachableCompilationUnitsInSWFOrder(roots);
+ for (final ICompilationUnit cu : reachableCompilationUnits)
+ {
+ ICompilationUnit.UnitType cuType = cu.getCompilationUnitType();
+
+ if (cuType == ICompilationUnit.UnitType.AS_UNIT
+ || cuType == ICompilationUnit.UnitType.MXML_UNIT)
+ {
+ String symbol = cu.getQualifiedNames().get(0);
+ if (externs.contains(symbol)) continue;
+
+ final File outputClassFile = getOutputClassFile(
+ cu.getQualifiedNames().get(0), outputFolder);
+
+ System.out.println("Compiling file: " + outputClassFile);
+
+ ICompilationUnit unit = cu;
+
+ IASWriter writer;
+ if (cuType == ICompilationUnit.UnitType.AS_UNIT)
+ {
+ writer = JSSharedData.backend.createWriter(project,
+ (List<ICompilerProblem>) errors, unit,
+ false);
+ }
+ else
+ {
+ writer = JSSharedData.backend.createMXMLWriter(
+ project, (List<ICompilerProblem>) errors,
+ unit, false);
+ }
+ problems.addAll(errors);
+ BufferedOutputStream out = new BufferedOutputStream(
+ new FileOutputStream(outputClassFile));
+ writer.writeTo(out);
+ out.flush();
+ out.close();
+ writer.close();
+ }
+ }
+
+ compilationSuccess = true;
+ }
+ }
+ catch (Exception e)
+ {
+ final ICompilerProblem problem = new InternalCompilerProblem(e);
+ problems.add(problem);
+ }
+
+ return compilationSuccess;
+ }
+
+ /**
+ * Build target artifact.
+ *
+ * @throws InterruptedException threading error
+ * @throws IOException IO error
+ * @throws ConfigurationException
+ */
+ @Override
+ protected void buildArtifact() throws InterruptedException, IOException,
+ ConfigurationException
+ {
+ jsTarget = buildJSTarget();
+ }
+
+ private IJSApplication buildJSTarget() throws InterruptedException,
+ FileNotFoundException, ConfigurationException
+ {
+ final List<ICompilerProblem> problemsBuildingSWF = new ArrayList<ICompilerProblem>();
+
+ final IJSApplication app = buildApplication(project,
+ config.getMainDefinition(), null, problemsBuildingSWF);
+ problems.addAll(problemsBuildingSWF);
+ if (app == null)
+ {
+ ICompilerProblem problem = new UnableToBuildSWFProblem(
+ getOutputFilePath());
+ problems.add(problem);
+ }
+
+ return app;
+ }
+
+ /**
+ * Replaces FlexApplicationProject::buildSWF()
+ *
+ * @param applicationProject
+ * @param rootClassName
+ * @param problems
+ * @return
+ * @throws InterruptedException
+ */
+
+ private IJSApplication buildApplication(CompilerProject applicationProject,
+ String rootClassName, ICompilationUnit mainCU,
+ Collection<ICompilerProblem> problems) throws InterruptedException,
+ ConfigurationException, FileNotFoundException
+ {
+ Collection<ICompilerProblem> fatalProblems = applicationProject.getFatalProblems();
+ if (!fatalProblems.isEmpty())
+ {
+ problems.addAll(fatalProblems);
+ return null;
+ }
+
+ return ((JSTarget) target).build(mainCU, problems);
+ }
+
+ /**
+ * Get the output file path. If {@code -output} is specified, use its value;
+ * otherwise, use the same base name as the target file.
+ *
+ * @return output file path
+ */
+ private String getOutputFilePath()
+ {
+ if (config.getOutput() == null)
+ {
+ final String extension = "." + JSSharedData.OUTPUT_EXTENSION;
+ return FilenameUtils.removeExtension(config.getTargetFile()).concat(
+ extension);
+ }
+ else
+ {
+ String outputFolderName = config.getOutput();
+ if (outputFolderName.endsWith(".swc"))
+ {
+ File outputFolder = new File(outputFolderName);
+ outputFolderName = outputFolder.getParent();
+ }
+ return outputFolderName;
+ }
+ }
+
+ /**
+ * Get the output class file. This includes the (sub)directory in which the
+ * original class file lives. If the directory structure doesn't exist, it
+ * is created.
+ *
+ * @author Erik de Bruin
+ * @param qname
+ * @param outputFolder
+ * @return output class file path
+ */
+ private File getOutputClassFile(String qname, File outputFolder)
+ {
+ String[] cname = qname.split("\\.");
+ String sdirPath = outputFolder + File.separator;
+ if (cname.length > 0)
+ {
+ for (int i = 0, n = cname.length - 1; i < n; i++)
+ {
+ sdirPath += cname[i] + File.separator;
+ }
+
+ File sdir = new File(sdirPath);
+ if (!sdir.exists())
+ sdir.mkdirs();
+
+ qname = cname[cname.length - 1];
+ }
+
+ return new File(sdirPath + qname + "." + JSSharedData.OUTPUT_EXTENSION);
+ }
+
+ /**
+ * Mxmlc uses target file as the main compilation unit and derive the output
+ * SWF file name from this file.
+ *
+ * @return true if successful, false otherwise.
+ * @throws InterruptedException
+ */
+ @Override
+ protected boolean setupTargetFile() throws InterruptedException
+ {
+ config.getTargetFile();
+
+ ITargetSettings settings = getTargetSettings();
+ if (settings != null)
+ project.setTargetSettings(settings);
+ else
+ return false;
+
+ target = JSSharedData.backend.createTarget(project,
+ getTargetSettings(), null);
+
+ return true;
+ }
+
+ private ITargetSettings getTargetSettings()
+ {
+ if (targetSettings == null)
+ targetSettings = projectConfigurator.getTargetSettings(getTargetType());
+
+ if (targetSettings == null)
+ problems.addAll(projectConfigurator.getConfigurationProblems());
+
+ return targetSettings;
+ }
+
+ /**
+ * Validate target file.
+ *
+ * @throws MustSpecifyTarget
+ * @throws IOError
+ */
+ @Override
+ protected void validateTargetFile() throws ConfigurationException
+ {
+
+ }
+
+ protected String getProgramName()
+ {
+ return "compc";
+ }
+
+ protected boolean isCompc()
+ {
+ return true;
+ }
+
+ @Override
+ protected TargetType getTargetType()
+ {
+ return TargetType.SWC;
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/EXTERNC.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/EXTERNC.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/EXTERNC.java
new file mode 100644
index 0000000..ed96162
--- /dev/null
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/EXTERNC.java
@@ -0,0 +1,216 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.clients;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.flex.compiler.config.Configurator;
+import org.apache.flex.compiler.internal.codegen.externals.emit.ReferenceEmitter;
+import org.apache.flex.compiler.internal.codegen.externals.pass.ReferenceCompiler;
+import org.apache.flex.compiler.internal.codegen.externals.reference.ReferenceModel;
+import org.apache.flex.compiler.internal.codegen.js.JSSharedData;
+import org.apache.flex.compiler.problems.ICompilerProblem;
+import org.apache.flex.compiler.targets.ITarget.TargetType;
+
+import com.google.javascript.jscomp.Result;
+import org.apache.flex.tools.FlexTool;
+
+/**
+ * @author Michael Schmalle
+ */
+public class EXTERNC implements FlexTool
+{
+ static enum ExitCode
+ {
+ SUCCESS(0),
+ PRINT_HELP(1),
+ FAILED_WITH_PROBLEMS(2),
+ FAILED_WITH_EXCEPTIONS(3),
+ FAILED_WITH_CONFIG_PROBLEMS(4);
+
+ ExitCode(int code)
+ {
+ this.code = code;
+ }
+
+ final int code;
+ }
+
+ protected Configurator projectConfigurator;
+ private ExternCConfiguration configuration;
+ private ReferenceModel model;
+ private ReferenceCompiler compiler;
+ private ReferenceEmitter emitter;
+
+ public ReferenceModel getModel()
+ {
+ return model;
+ }
+
+ public ReferenceCompiler getCompiler()
+ {
+ return compiler;
+ }
+
+ public ReferenceEmitter getEmitter()
+ {
+ return emitter;
+ }
+
+ public EXTERNC()
+ {
+ }
+
+ public EXTERNC(ExternCConfiguration configuration)
+ {
+ configure(configuration);
+ }
+
+ public void configure(String[] args)
+ {
+ projectConfigurator = createConfigurator();
+ projectConfigurator.setConfiguration(args, "external", false);
+ projectConfigurator.getTargetSettings(TargetType.SWC);
+ configure((ExternCConfiguration) projectConfigurator.getConfiguration());
+ }
+
+ public void configure(ExternCConfiguration configuration)
+ {
+ this.configuration = configuration;
+
+ model = new ReferenceModel(configuration);
+ compiler = new ReferenceCompiler(model);
+ emitter = new ReferenceEmitter(model);
+ }
+
+ /**
+ * Create a new Configurator. This method may be overridden to allow
+ * Configurator subclasses to be created that have custom configurations.
+ *
+ * @return a new instance or subclass of {@link Configurator}.
+ */
+ protected Configurator createConfigurator()
+ {
+ return new Configurator(ExternCConfiguration.class);
+ }
+
+ /**
+ * Java program entry point.
+ *
+ * @param args command line arguments
+ */
+ public static void main(final String[] args)
+ {
+ int exitCode = staticMainNoExit(args);
+ System.exit(exitCode);
+ }
+
+ /**
+ * Entry point for the <code>externc</code>.
+ *
+ * @param args Command line arguments.
+ * @return An exit code.
+ */
+ public static int staticMainNoExit(final String[] args)
+ {
+ long startTime = System.nanoTime();
+
+ final EXTERNC compiler = new EXTERNC();
+ compiler.configure(args);
+ final Set<ICompilerProblem> problems = new HashSet<ICompilerProblem>();
+ final int exitCode = compiler.mainNoExit(args, problems, true);
+
+ long endTime = System.nanoTime();
+ JSSharedData.instance.stdout((endTime - startTime) / 1e9 + " seconds");
+
+ return exitCode;
+ }
+
+ public int mainNoExit(final String[] args, Set<ICompilerProblem> problems,
+ Boolean printProblems)
+ {
+ int exitCode = -1;
+
+ try
+ {
+ cleanOutput();
+ compile();
+ emit();
+ }
+ catch (IOException e)
+ {
+ JSSharedData.instance.stderr(e.toString());
+ }
+ finally
+ {
+ if (problems != null && !problems.isEmpty())
+ {
+ if (printProblems)
+ {
+ }
+ }
+ }
+
+ return exitCode;
+ }
+
+ public void cleanOutput() throws IOException
+ {
+ FileUtils.deleteDirectory(configuration.getAsRoot());
+ }
+
+ public void emit() throws IOException
+ {
+ emitter.emit();
+ }
+
+ public Result compile() throws IOException
+ {
+ return compiler.compile();
+ }
+
+ @Override
+ public String getName() {
+ // TODO: Change this to a flex-tool-api constant ...
+ return "EXTERNC";
+ }
+
+ @Override
+ public int execute(String[] args) {
+ EXTERNC generator = new EXTERNC();
+ generator.configure(args);
+ try {
+ generator.cleanOutput();
+ /*Result result =*/ generator.compile();
+ // We ignore errors for now ... they seem to be normal.
+ /*if(result.errors.length > 0) {
+ return 1;
+ }*/
+ generator.emit();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return 0;
+ }
+
+}