http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ExternCConfiguration.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ExternCConfiguration.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ExternCConfiguration.java new file mode 100644 index 0000000..7eea457 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ExternCConfiguration.java @@ -0,0 +1,357 @@ +/* + * + * 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.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.flex.compiler.config.Configuration; +import org.apache.flex.compiler.config.ConfigurationValue; +import org.apache.flex.compiler.exceptions.ConfigurationException.CannotOpen; +import org.apache.flex.compiler.exceptions.ConfigurationException.IncorrectArgumentCount; +import org.apache.flex.compiler.internal.codegen.externals.pass.ReferenceCompiler.ExternalFile; +import org.apache.flex.compiler.internal.codegen.externals.reference.BaseReference; +import org.apache.flex.compiler.internal.codegen.externals.reference.ClassReference; +import org.apache.flex.compiler.internal.codegen.externals.reference.FieldReference; +import org.apache.flex.compiler.internal.codegen.externals.reference.MemberReference; +import org.apache.flex.compiler.internal.config.annotations.Arguments; +import org.apache.flex.compiler.internal.config.annotations.Config; +import org.apache.flex.compiler.internal.config.annotations.InfiniteArguments; +import org.apache.flex.compiler.internal.config.annotations.Mapping; +import org.apache.flex.utils.FilenameNormalization; + +public class ExternCConfiguration extends Configuration +{ + private File jsRoot; + + private File asRoot; + + private File asClassRoot; + private File asInterfaceRoot; + private File asFunctionRoot; + private File asConstantRoot; + private File asTypeDefRoot; + + private List<ExternalFile> externals = new ArrayList<ExternalFile>(); + private List<ExternalFile> externalExterns = new ArrayList<ExternalFile>(); + + private List<String> classToFunctions = new ArrayList<String>(); + private List<ExcludedMember> excludesClass = new ArrayList<ExcludedMember>(); + private List<ExcludedMember> excludesField = new ArrayList<ExcludedMember>(); + private List<ExcludedMember> excludes = new ArrayList<ExcludedMember>(); + + public ExternCConfiguration() + { + } + + public File getAsRoot() + { + return asRoot; + } + + @Config + @Mapping("as-root") + public void setASRoot(ConfigurationValue cfgval, String filename) throws CannotOpen + { + setASRoot(new File(FilenameNormalization.normalize(getOutputPath(cfgval, filename)))); + } + + public void setASRoot(File file) + { + this.asRoot = file; + + asClassRoot = new File(asRoot, "classes"); + asInterfaceRoot = new File(asRoot, "interfaces"); + asFunctionRoot = new File(asRoot, "functions"); + asConstantRoot = new File(asRoot, "constants"); + asTypeDefRoot = new File(asRoot, "typedefs"); + } + + public File getAsClassRoot() + { + return asClassRoot; + } + + public File getAsInterfaceRoot() + { + return asInterfaceRoot; + } + + public File getAsFunctionRoot() + { + return asFunctionRoot; + } + + public File getAsConstantRoot() + { + return asConstantRoot; + } + + public File getAsTypeDefRoot() + { + return asTypeDefRoot; + } + + public Collection<ExternalFile> getExternals() + { + return externals; + } + + public Collection<ExternalFile> getExternalExterns() + { + return externalExterns; + } + + public boolean isClassToFunctions(String className) + { + return classToFunctions.contains(className); + } + + public void addClassToFunction(String className) + { + classToFunctions.add(className); + } + + public void addExternal(File file) throws IOException + { + if (!file.exists()) + throw new IOException(file.getAbsolutePath() + " does not exist."); + externals.add(new ExternalFile(file)); + } + + public void addExternal(String externalFile) throws IOException + { + addExternal(new File(FilenameNormalization.normalize(externalFile))); + } + + public void addExternalExtern(File file) throws IOException + { + if (!file.exists()) + throw new IOException(file.getAbsolutePath() + " does not exist."); + externalExterns.add(new ExternalFile(file)); + } + + public void addExternalExtern(String externalFile) throws IOException + { + addExternalExtern(new File(FilenameNormalization.normalize(externalFile))); + } + + @Config(allowMultiple = true) + @Mapping("class-to-function") + @Arguments(Arguments.CLASS) + public void setClassToFunctions(ConfigurationValue cfgval, List<String> values) throws IncorrectArgumentCount + { + addClassToFunction(values.get(0)); + } + + @Config(allowMultiple = true, isPath = true) + @Mapping("external") + @Arguments(Arguments.PATH_ELEMENT) + @InfiniteArguments + public void setExternal(ConfigurationValue cfgval, String[] vals) throws IOException, CannotOpen + { + for (String val : vals) + addExternal(resolvePathStrict(val, cfgval)); + } + + @Config(allowMultiple = true, isPath = true) + @Mapping("external-externs") + @Arguments(Arguments.PATH_ELEMENT) + @InfiniteArguments + public void setExternalExterns(ConfigurationValue cfgval, String[] vals) throws IOException, CannotOpen + { + for (String val : vals) + addExternalExtern(resolvePathStrict(val, cfgval)); + } + + public boolean isExternalExtern(BaseReference reference) + { + String sourceFileName = reference.getNode().getSourceFileName(); + for (ExternalFile file : externalExterns) + { + if (sourceFileName.equals("[" + file.getName() + "]")) + { + return true; + } + } + return false; + } + + public ExcludedMember isExcludedClass(ClassReference classReference) + { + for (ExcludedMember memeber : excludesClass) + { + if (memeber.isExcluded(classReference, null)) + return memeber; + } + return null; + } + + public ExcludedMember isExcludedMember(ClassReference classReference, + MemberReference memberReference) + { + if (memberReference instanceof FieldReference) + { + for (ExcludedMember memeber : excludesField) + { + if (memeber.isExcluded(classReference, memberReference)) + return memeber; + } + } + for (ExcludedMember memeber : excludes) + { + if (memeber.isExcluded(classReference, memberReference)) + return memeber; + } + return null; + } + + @Config(allowMultiple = true) + @Mapping("exclude") + @Arguments({"class", "name"}) + public void setExcludes(ConfigurationValue cfgval, List<String> values) throws IncorrectArgumentCount + { + final int size = values.size(); + if (size % 2 != 0) + throw new IncorrectArgumentCount(size + 1, size, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); + + for (int nameIndex = 0; nameIndex < size - 1; nameIndex += 2) + { + final String className = values.get(nameIndex); + final String name = values.get(nameIndex + 1); + addExclude(className, name); + } + } + + public void addExclude(String className, String name) + { + excludes.add(new ExcludedMember(className, name)); + } + + public void addExclude(String className, String name, String description) + { + excludes.add(new ExcludedMember(className, name, description)); + } + + @Config(allowMultiple = true) + @Mapping("field-exclude") + @Arguments({"class", "field"}) + public void setFieldExcludes(ConfigurationValue cfgval, List<String> values) throws IncorrectArgumentCount + { + final int size = values.size(); + if (size % 2 != 0) + throw new IncorrectArgumentCount(size + 1, size, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); + + for (int nameIndex = 0; nameIndex < size - 1; nameIndex += 2) + { + final String className = values.get(nameIndex); + final String fieldName = values.get(nameIndex + 1); + addFieldExclude(className, fieldName); + } + } + + public void addFieldExclude(String className, String fieldName) + { + excludesField.add(new ExcludedMember(className, fieldName, "")); + } + + @Config(allowMultiple = true) + @Mapping("class-exclude") + @Arguments("class") + public void setClassExcludes(ConfigurationValue cfgval, List<String> values) + { + for (String className : values) + addClassExclude(className); + } + public void addClassExclude(String className) + { + excludesClass.add(new ExcludedMember(className, null, "")); + } + + public File getJsRoot() + { + return jsRoot; + } + + @Config + @Mapping("js-root") + public void setJSRoot(ConfigurationValue cfgval, String filename) throws CannotOpen + { + this.jsRoot = new File(filename); + } + + + public static class ExcludedMember + { + private String className; + private String name; + private String description; + + public String getClassName() + { + return className; + } + + public String getName() + { + return name; + } + + public String getDescription() + { + return description; + } + + public ExcludedMember(String className, String name) + { + this.className = className; + this.name = name; + } + + public ExcludedMember(String className, String name, String description) + { + this.className = className; + this.name = name; + this.description = description; + } + + public boolean isExcluded(ClassReference classReference, + MemberReference memberReference) + { + if (memberReference == null) + { + return classReference.getQualifiedName().equals(className); + } + return classReference.getQualifiedName().equals(className) + && memberReference.getQualifiedName().equals(name); + } + + public void print(StringBuilder sb) + { + if (description != null) + sb.append("// " + description + "\n"); + sb.append("//"); + } + } + +}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/FlexJSToolGroup.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/FlexJSToolGroup.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/FlexJSToolGroup.java new file mode 100644 index 0000000..e99a5ab --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/FlexJSToolGroup.java @@ -0,0 +1,37 @@ +/* + * + * 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 org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSBackend; +import org.apache.flex.tools.AbstractFlexToolGroup; + +/** + * Created by christoferdutz on 10.11.14. + */ +public class FlexJSToolGroup extends AbstractFlexToolGroup { + + public FlexJSToolGroup() { + super("FlexJS"); + addFlexTool(new COMPJSC(new MXMLFlexJSBackend())); + addFlexTool(new MXMLJSC(new MXMLFlexJSBackend())); + addFlexTool(new EXTERNC()); + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSCompilerEntryPoint.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSCompilerEntryPoint.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSCompilerEntryPoint.java new file mode 100644 index 0000000..0ffa22e --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSCompilerEntryPoint.java @@ -0,0 +1,29 @@ +/* + * + * 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 org.apache.flex.compiler.problems.ICompilerProblem; + +import java.util.List; + +public interface JSCompilerEntryPoint { + public int mainNoExit(final String[] args, List<ICompilerProblem> problems, + Boolean printProblems); +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java new file mode 100644 index 0000000..3ce8665 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java @@ -0,0 +1,83 @@ +/* + * + * 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 org.apache.flex.compiler.config.Configuration; +import org.apache.flex.compiler.config.ConfigurationValue; +import org.apache.flex.compiler.exceptions.ConfigurationException; +import org.apache.flex.compiler.internal.config.annotations.Config; +import org.apache.flex.compiler.internal.config.annotations.Mapping; + +/** + * The {@link JSConfiguration} class holds all compiler arguments needed for + * compiling ActionScript to JavaScript. + * <p> + * Specific flags are implemented here for the configuration to be loaded by the + * configure() method of {@link MXMLJSC}. + * <p> + * This class inherits all compiler arguments from the MXMLC compiler. + * + * @author Michael Schmalle + */ +public class JSConfiguration extends Configuration +{ + public JSConfiguration() + { + } + + // + // 'js-output-type' + // + + private String jsOutputType = MXMLJSC.JSOutputType.FLEXJS.getText(); + + public String getJSOutputType() + { + return jsOutputType; + } + + @Config + @Mapping("js-output-type") + public void setJSOutputType(ConfigurationValue cv, String value) + throws ConfigurationException + { + jsOutputType = value; + } + + // + // 'source-map' + // + + private boolean sourceMap = false; + + public boolean getSourceMap() + { + return sourceMap; + } + + @Config + @Mapping("source-map") + public void setSourceMap(ConfigurationValue cv, boolean value) + throws ConfigurationException + { + sourceMap = value; + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java new file mode 100644 index 0000000..d324c9f --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java @@ -0,0 +1,847 @@ +/* + * + * 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.Collections; +import java.util.List; +import java.util.Set; + +import org.apache.commons.io.FilenameUtils; +import org.apache.flex.compiler.clients.problems.ProblemPrinter; +import org.apache.flex.compiler.clients.problems.ProblemQuery; +import org.apache.flex.compiler.clients.problems.ProblemQueryProvider; +import org.apache.flex.compiler.clients.problems.WorkspaceProblemFormatter; +import org.apache.flex.compiler.codegen.js.IJSPublisher; +import org.apache.flex.compiler.codegen.js.IJSWriter; +import org.apache.flex.compiler.config.Configuration; +import org.apache.flex.compiler.config.ConfigurationBuffer; +import org.apache.flex.compiler.config.Configurator; +import org.apache.flex.compiler.config.ICompilerSettingsConstants; +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.exceptions.ConfigurationException.OnlyOneSource; +import org.apache.flex.compiler.internal.codegen.js.JSSharedData; +import org.apache.flex.compiler.internal.config.FlashBuilderConfigurator; +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.js.goog.JSGoogConfiguration; +import org.apache.flex.compiler.internal.driver.js.jsc.JSCBackend; +import org.apache.flex.compiler.internal.driver.js.node.NodeBackend; +import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSBackend; +import org.apache.flex.compiler.internal.driver.mxml.vf2js.MXMLVF2JSBackend; +import org.apache.flex.compiler.internal.parsing.as.FlexJSASDocDelegate; +import org.apache.flex.compiler.internal.projects.CompilerProject; +import org.apache.flex.compiler.internal.projects.FlexJSProject; +import org.apache.flex.compiler.internal.projects.ISourceFileHandler; +import org.apache.flex.compiler.internal.targets.JSTarget; +import org.apache.flex.compiler.internal.units.ResourceModuleCompilationUnit; +import org.apache.flex.compiler.internal.units.SourceCompilationUnitFactory; +import org.apache.flex.compiler.internal.workspaces.Workspace; +import org.apache.flex.compiler.problems.ConfigurationProblem; +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.problems.UnexpectedExceptionProblem; +import org.apache.flex.compiler.projects.ICompilerProject; +import org.apache.flex.compiler.targets.ITarget; +import org.apache.flex.compiler.targets.ITarget.TargetType; +import org.apache.flex.compiler.targets.ITargetSettings; +import org.apache.flex.compiler.units.ICompilationUnit; +import org.apache.flex.tools.FlexTool; +import org.apache.flex.utils.ArgumentUtil; +import org.apache.flex.utils.FilenameNormalization; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; + +/** + * @author Erik de Bruin + * @author Michael Schmalle + */ +public class MXMLJSC implements JSCompilerEntryPoint, ProblemQueryProvider, + FlexTool +{ + @Override + public ProblemQuery getProblemQuery() + { + return problems; + } + + /* + * JS output type enumerations. + */ + public enum JSOutputType + { + AMD("amd"), + FLEXJS("flexjs"), + GOOG("goog"), + VF2JS("vf2js"), + FLEXJS_DUAL("flexjs_dual"), + JSC("jsc"), + NODE("node"); + + private String text; + + JSOutputType(String text) + { + this.text = text; + } + + public String getText() + { + return this.text; + } + + public static JSOutputType fromString(String text) + { + for (JSOutputType jsOutputType : JSOutputType.values()) + { + if (text.equalsIgnoreCase(jsOutputType.text)) + return jsOutputType; + } + return GOOG; + } + } + + /* + * Exit code enumerations. + */ + static enum ExitCode + { + SUCCESS(0), + PRINT_HELP(1), + FAILED_WITH_PROBLEMS(2), + FAILED_WITH_ERRORS(3), + FAILED_WITH_EXCEPTIONS(4), + FAILED_WITH_CONFIG_PROBLEMS(5); + + ExitCode(int code) + { + this.code = code; + } + + final int code; + } + + public static JSOutputType jsOutputType; + public static boolean keepASDoc; + + @Override + public String getName() + { + return FLEX_TOOL_MXMLC; + } + + @Override + public int execute(String[] args) + { + final List<ICompilerProblem> problems = new ArrayList<ICompilerProblem>(); + return mainNoExit(args, problems, true); + } + + /** + * 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(); + String jsOutputTypeString = ""; + for (String s : args) + { + String[] kvp = s.split("="); + + if (s.contains("-js-output-type")) + { + jsOutputTypeString = kvp[1]; + } + } + + if (jsOutputTypeString.equals("")) + { + jsOutputTypeString = JSOutputType.FLEXJS.getText(); + } + + jsOutputType = JSOutputType.fromString(jsOutputTypeString); + switch (jsOutputType) + { + case AMD: + backend = new AMDBackend(); + break; + case JSC: + backend = new JSCBackend(); + break; + case NODE: + backend = new NodeBackend(); + break; + case FLEXJS: + case FLEXJS_DUAL: + backend = new MXMLFlexJSBackend(); + break; + case GOOG: + backend = new GoogBackend(); + break; + case VF2JS: + backend = new MXMLVF2JSBackend(); + break; + // if you add a new js-output-type here, don't forget to also add it + // to flex2.tools.MxmlJSC in flex-compiler-oem for IDE support + } + + final MXMLJSC mxmlc = new MXMLJSC(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; + } + + protected Workspace workspace; + protected FlexJSProject project; + + protected ProblemQuery problems; + protected ISourceFileHandler asFileHandler; + protected Configuration config; + protected Configurator projectConfigurator; + private ConfigurationBuffer configBuffer; + private ICompilationUnit mainCU; + protected ITarget target; + protected ITargetSettings targetSettings; + protected IJSApplication jsTarget; + private IJSPublisher jsPublisher; + + public MXMLJSC(IBackend backend) + { + JSSharedData.backend = backend; + workspace = new Workspace(); + workspace.setASDocDelegate(new FlexJSASDocDelegate()); + project = new FlexJSProject(workspace); + problems = new ProblemQuery(); // this gets replaced in configure(). Do we need it here? + JSSharedData.OUTPUT_EXTENSION = backend.getOutputExtension(); + JSSharedData.workspace = workspace; + asFileHandler = backend.getSourceFileHandlerInstance(); + } + + @Override + public int mainNoExit(final String[] args, List<ICompilerProblem> problems, + Boolean printProblems) + { + int exitCode = -1; + try + { + exitCode = _mainNoExit(ArgumentUtil.fixArgs(args), problems); + } + catch (Exception e) + { + JSSharedData.instance.stderr(e.toString()); + } + finally + { + if (problems != null && !problems.isEmpty()) + { + if (printProblems) + { + final WorkspaceProblemFormatter formatter = new WorkspaceProblemFormatter( + workspace); + final ProblemPrinter printer = new ProblemPrinter(formatter); + printer.printProblems(problems); + } + } + } + return exitCode; + } + + /** + * Entry point that doesn't call <code>System.exit()</code>. This is for + * unit testing. + * + * @param args command line arguments + * @return exit code + */ + private int _mainNoExit(final String[] args, + List<ICompilerProblem> outProblems) + { + ExitCode exitCode = ExitCode.SUCCESS; + try + { + String[] adjustedArgs = args; + + if (jsOutputType != null) + { + switch (jsOutputType) + { + case VF2JS: + boolean isFlashBuilderProject = useFlashBuilderProjectFiles(args); + + if (isFlashBuilderProject) + { + adjustedArgs = FlashBuilderConfigurator.computeFlashBuilderArgs( + adjustedArgs, getTargetType().getExtension()); + } + + //String projectFilePath = adjustedArgs[adjustedArgs.length - 1]; + // + //String newProjectFilePath = VF2JSProjectUtils + // .createTempProject(projectFilePath, + // isFlashBuilderProject); + // + //adjustedArgs[adjustedArgs.length - 1] = newProjectFilePath; + + break; + default: + break; + } + } + + final boolean continueCompilation = configure(adjustedArgs); + + // ToDo (erikdebruin): use JSSharedData for globals ... + keepASDoc = ((JSGoogConfiguration) config).getKeepASDoc(); + + if (outProblems != null && !config.isVerbose()) + JSSharedData.STDOUT = JSSharedData.STDERR = null; + + if (continueCompilation) + { + project.setProblems(problems.getProblems()); + compile(); + if (problems.hasFilteredProblems()) + { + if (problems.hasErrors()) + exitCode = ExitCode.FAILED_WITH_ERRORS; + else + exitCode = ExitCode.FAILED_WITH_PROBLEMS; + } + } + else if (problems.hasFilteredProblems()) + { + exitCode = ExitCode.FAILED_WITH_CONFIG_PROBLEMS; + } + else + { + exitCode = ExitCode.PRINT_HELP; + } + } + catch (Exception e) + { + if (outProblems == null) + JSSharedData.instance.stderr(e.getMessage()); + else + { + final ICompilerProblem unexpectedExceptionProblem = new UnexpectedExceptionProblem( + e); + problems.add(unexpectedExceptionProblem); + } + exitCode = ExitCode.FAILED_WITH_EXCEPTIONS; + } + finally + { + waitAndClose(); + + if (outProblems != null && problems.hasFilteredProblems()) + { + for (ICompilerProblem problem : problems.getFilteredProblems()) + { + outProblems.add(problem); + } + } + } + return exitCode.code; + } + + /** + * 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 + */ + protected boolean compile() + { + boolean compilationSuccess = false; + + try + { + project.getSourceCompilationUnitFactory().addHandler(asFileHandler); + + if (!setupTargetFile()) + return false; + + buildArtifact(); + + if (jsTarget != null) + { + List<ICompilerProblem> errors = new ArrayList<ICompilerProblem>(); + List<ICompilerProblem> warnings = new ArrayList<ICompilerProblem>(); + + if (!config.getCreateTargetWithErrors()) + { + problems.getErrorsAndWarnings(errors, warnings); + if (errors.size() > 0) + return false; + } + + jsPublisher = (IJSPublisher) JSSharedData.backend.createPublisher( + project, errors, config); + + File outputFolder = jsPublisher.getOutputFolder(); + + ArrayList<ICompilationUnit> roots = new ArrayList<ICompilationUnit>(); + roots.add(mainCU); + Set<ICompilationUnit> incs = target.getIncludesCompilationUnits(); + roots.addAll(incs); + List<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) + { + final File outputClassFile = getOutputClassFile( + cu.getQualifiedNames().get(0), outputFolder); + + System.out.println("Compiling file: " + outputClassFile); + + ICompilationUnit unit = cu; + + IJSWriter writer; + if (cuType == ICompilationUnit.UnitType.AS_UNIT) + { + writer = (IJSWriter) JSSharedData.backend.createWriter(project, + errors, unit, false); + } + else + { + writer = (IJSWriter) JSSharedData.backend.createMXMLWriter( + project, errors, unit, false); + } + + BufferedOutputStream out = new BufferedOutputStream( + new FileOutputStream(outputClassFile)); + + File outputSourceMapFile = null; + if (project.config.getSourceMap()) + { + outputSourceMapFile = getOutputSourceMapFile( + cu.getQualifiedNames().get(0), outputFolder); + } + + writer.writeTo(out, outputSourceMapFile); + out.flush(); + out.close(); + writer.close(); + } + } + + if (jsPublisher != null) + { + compilationSuccess = jsPublisher.publish(problems); + } + else + { + 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 + */ + protected void buildArtifact() throws InterruptedException, IOException, + ConfigurationException + { + jsTarget = buildJSTarget(); + } + + private IJSApplication buildJSTarget() throws InterruptedException, + FileNotFoundException, ConfigurationException + { + final List<ICompilerProblem> problemsBuildingSWF = new ArrayList<ICompilerProblem>(); + + project.mainCU = mainCU; + final IJSApplication app = buildApplication(project, + config.getMainDefinition(), mainCU, 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 + return config.getOutput(); + } + + /** + * @author Erik de Bruin + * + * 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. + * + * @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); + } + + /** + * @param qname + * @param outputFolder + * @return output source map file path + */ + private File getOutputSourceMapFile(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 + ".map"); + } + + /** + * 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 OnlyOneSource + * @throws InterruptedException + */ + protected boolean setupTargetFile() throws InterruptedException + { + final String mainFileName = config.getTargetFile(); + + final String normalizedMainFileName = FilenameNormalization.normalize(mainFileName); + + final SourceCompilationUnitFactory compilationUnitFactory = project.getSourceCompilationUnitFactory(); + + File normalizedMainFile = new File(normalizedMainFileName); + if (compilationUnitFactory.canCreateCompilationUnit(normalizedMainFile)) + { + project.addIncludeSourceFile(normalizedMainFile); + + final List<String> sourcePath = config.getCompilerSourcePath(); + String mainQName = null; + if (sourcePath != null && !sourcePath.isEmpty()) + { + for (String path : sourcePath) + { + final String otherPath = new File(path).getAbsolutePath(); + if (mainFileName.startsWith(otherPath)) + { + mainQName = mainFileName.substring(otherPath.length() + 1); + mainQName = mainQName.replaceAll("\\\\", "/"); + mainQName = mainQName.replaceAll("\\/", "."); + if (mainQName.endsWith(".as")) + mainQName = mainQName.substring(0, + mainQName.length() - 3); + break; + } + } + } + + if (mainQName == null) + mainQName = FilenameUtils.getBaseName(mainFileName); + + Collection<ICompilationUnit> mainFileCompilationUnits = workspace.getCompilationUnits( + normalizedMainFileName, project); + + mainCU = Iterables.getOnlyElement(mainFileCompilationUnits); + + config.setMainDefinition(mainQName); + } + + Preconditions.checkNotNull(mainCU, + "Main compilation unit can't be null"); + + ITargetSettings settings = getTargetSettings(); + if (settings != null) + project.setTargetSettings(settings); + + target = JSSharedData.backend.createTarget(project, + getTargetSettings(), null); + + return true; + } + + private ITargetSettings getTargetSettings() + { + if (targetSettings == null) + targetSettings = projectConfigurator.getTargetSettings(null); + + return targetSettings; + } + + /** + * 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 JSSharedData.backend.createConfigurator(); + } + + /** + * Load configurations from all the sources. + * + * @param args command line arguments + * @return True if mxmlc should continue with compilation. + */ + protected boolean configure(final String[] args) + { + project.getSourceCompilationUnitFactory().addHandler(asFileHandler); + projectConfigurator = createConfigurator(); + + try + { + if (useFlashBuilderProjectFiles(args) + && !jsOutputType.equals(JSOutputType.VF2JS)) + { + projectConfigurator.setConfiguration( + FlashBuilderConfigurator.computeFlashBuilderArgs(args, + getTargetType().getExtension()), + ICompilerSettingsConstants.FILE_SPECS_VAR); + } + else + { + projectConfigurator.setConfiguration(args, + ICompilerSettingsConstants.FILE_SPECS_VAR); + } + + projectConfigurator.applyToProject(project); + problems = new ProblemQuery( + projectConfigurator.getCompilerProblemSettings()); + + project.config = (JSGoogConfiguration)projectConfigurator.getConfiguration(); + config = projectConfigurator.getConfiguration(); + configBuffer = projectConfigurator.getConfigurationBuffer(); + problems.addAll(projectConfigurator.getConfigurationProblems()); + + if (configBuffer.getVar("version") != null) //$NON-NLS-1$ + return false; + + if (problems.hasErrors()) + return false; + + validateTargetFile(); + return true; + } + catch (ConfigurationException e) + { + final ICompilerProblem problem = new ConfigurationProblem(e); + problems.add(problem); + return false; + } + catch (Exception e) + { + final ICompilerProblem problem = new ConfigurationProblem(null, -1, + -1, -1, -1, e.getMessage()); + problems.add(problem); + return false; + } + finally + { + if (config == null) + { + config = new Configuration(); + configBuffer = new ConfigurationBuffer(Configuration.class, + Configuration.getAliases()); + } + } + } + + private boolean useFlashBuilderProjectFiles(String[] args) + { + for (String arg : args) + { + if (arg.equals("-fb") + || arg.equals("-use-flashbuilder-project-files")) + return true; + } + return false; + } + + protected TargetType getTargetType() + { + return TargetType.SWF; + } + + /** + * Validate target file. + * + * @throws MustSpecifyTarget + * @throws IOError + */ + protected void validateTargetFile() throws ConfigurationException + { + if (mainCU instanceof ResourceModuleCompilationUnit) + return; //when compiling a Resource Module, no target file is defined. + + final String targetFile = config.getTargetFile(); + if (targetFile == null) + throw new ConfigurationException.MustSpecifyTarget(null, null, -1); + + final File file = new File(targetFile); + if (!file.exists()) + throw new ConfigurationException.IOError(targetFile); + } + + /** + * Wait till the workspace to finish compilation and close. + */ + protected void waitAndClose() + { + workspace.startIdleState(); + try + { + workspace.close(); + } + finally + { + workspace.endIdleState(Collections.<ICompilerProject, Set<ICompilationUnit>> emptyMap()); + } + } + + /** + * Force terminate the compilation process. + */ + protected void close() + { + workspace.close(); + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/clients/VF2JSToolGroup.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/VF2JSToolGroup.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/VF2JSToolGroup.java new file mode 100644 index 0000000..07cb796 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/VF2JSToolGroup.java @@ -0,0 +1,35 @@ +/* + * + * 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 org.apache.flex.tools.AbstractFlexToolGroup; + +/** + * Created by christoferdutz on 10.11.14. + */ +public class VF2JSToolGroup extends AbstractFlexToolGroup { + + public VF2JSToolGroup() { + super("VF2JS"); +// addFlexTool(new COMPJSC(new MXMLVF2JSBackend())); +// addFlexTool(new MXMLJSC(new MXMLVF2JSBackend())); + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IASGlobalFunctionConstants.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IASGlobalFunctionConstants.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IASGlobalFunctionConstants.java new file mode 100644 index 0000000..6d0106e --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IASGlobalFunctionConstants.java @@ -0,0 +1,92 @@ +/* + * + * 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.codegen; + +/** + * AS3 language global functions, such as Array, encodeURI, isNaN etc. + * + * @author Erik de Bruin + */ +public interface IASGlobalFunctionConstants +{ + static final String Array = "Array"; + static final String Boolean = "Boolean"; + static final String decodeURI = "decodeURI"; + static final String decodeURIComponent = "decodeURIComponent"; + static final String encodeURI = "encodeURI"; + static final String encodeURIComponent = "encodeURIComponent"; + static final String escape = "escape"; + static final String _int = "int"; + static final String isFinite = "isFinite"; + static final String isNaN = "isNaN"; + static final String isXMLName = "isXMLName"; + static final String Number = "Number"; + static final String Object = "Object"; + static final String parseFloat = "parseFloat"; + static final String parseInt = "parseInt"; + static final String String = "String"; + static final String trace = "trace"; + static final String uint = "uint"; + static final String unescape = "unescape"; + static final String Vector = "Vector"; + static final String XML = "XML"; + static final String XMLList = "XMLList"; + + /** + * An enumeration of core built-in functions. + */ + public static enum BuiltinType + { + ARRAY(IASGlobalFunctionConstants.Array), BOOLEAN( + IASGlobalFunctionConstants.Boolean), DECODEURI( + IASGlobalFunctionConstants.decodeURI), DECODEURICOMPONENT( + IASGlobalFunctionConstants.decodeURIComponent), ENCODEURI( + IASGlobalFunctionConstants.encodeURI), ENCODEURICOMPONENT( + IASGlobalFunctionConstants.encodeURIComponent), ESCAPE( + IASGlobalFunctionConstants.escape), INT( + IASGlobalFunctionConstants._int), ISFINITE( + IASGlobalFunctionConstants.isFinite), ISNAN( + IASGlobalFunctionConstants.isNaN), ISXMLNAME( + IASGlobalFunctionConstants.isXMLName), NUMBER( + IASGlobalFunctionConstants.Number), OBJECT( + IASGlobalFunctionConstants.Object), PARSEFLOAT( + IASGlobalFunctionConstants.parseFloat), PARSEINT( + IASGlobalFunctionConstants.parseInt), STRING( + IASGlobalFunctionConstants.String), TRACE( + IASGlobalFunctionConstants.trace), UINT( + IASGlobalFunctionConstants.uint), UNESCAPE( + IASGlobalFunctionConstants.unescape), VECTOR( + IASGlobalFunctionConstants.Vector), XML( + IASGlobalFunctionConstants.XML), XMLLIST( + IASGlobalFunctionConstants.XMLList); + + private BuiltinType(String name) + { + this.name = name; + } + + private final String name; + + public String getName() + { + return name; + } + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IDocEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IDocEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IDocEmitter.java new file mode 100644 index 0000000..f71ae5e --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IDocEmitter.java @@ -0,0 +1,36 @@ +/* + * + * 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.codegen; + +/** + * Base interface for documentation emitters. + * + * @author Michael Schmalle + */ +public interface IDocEmitter +{ + void begin(); + + String flushBuffer(); + + void setBufferWrite(boolean value); + + void end(); +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitter.java new file mode 100644 index 0000000..5e2e596 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitter.java @@ -0,0 +1,113 @@ +/* + * + * 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.codegen; + +import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; +import org.apache.flex.compiler.tree.as.IASNode; + +/** + * @author Michael Schmalle + * @author Erik de Bruin + */ +public interface IEmitter +{ + + /** + * Pushes an indent into the emitter so after newlines are emitted, the + * output is correctly formatted. + */ + void indentPush(); + + /** + * Pops an indent from the emitter so after newlines are emitted, the output + * is correctly formatted. + */ + void indentPop(); + + /** + * Writes a string to the writer. + * + * @param value The string to write to the output buffer. + */ + void write(IEmitterTokens value); + + void write(String value); + + /** + * Writes newline character(s) + */ + void writeNewline(); + + /** + * Writes the <code>value</code> and then a newline which will automatically + * have the indent applied after the \n character. + * + * @param value The String value to write before the \n is appended. + */ + void writeNewline(IEmitterTokens value); + + void writeNewline(String value); + + /** + * Writes the <code>value</code> after a push or pop of the indent. + * <p> + * This method effectively lets you write a value and then indent our + * outdent. The method can be useful in the following where your cursor + * writer is at <code>[0]</code>, you write + * <code>writeNewline("if (foo) {", true);</code> and the cursor after the + * call will end up at <code>[1]</code>. + * + * <pre> + * [0]if (foo) { + * [1]this.something; + * } + * </pre> + * + * @param value The String value to write before the \n is appended. + * @param pushIndent Whether to push indent <code>true</code> or pop indent + * <code>false</code>. + */ + void writeNewline(IEmitterTokens value, boolean pushIndent); + + void writeNewline(String value, boolean pushIndent); + + /** + * Writes a {@link ASEmitterTokens} character to the buffer and appends a + * space after automatically. + * + * @param value The {@link ASEmitterTokens} value. + */ + void writeToken(IEmitterTokens value); + + void writeToken(String value); + + /** + * Takes the node argument and created a String representation if it using + * the buffer temporarily. + * <p> + * Note; This method is still beta, it need more logic if an emitter is + * actually using the buffer! + * + * @param node The node walk and create a String for. + * @return The node's output. + */ + String stringifyNode(IASNode node); + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitterTokens.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitterTokens.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitterTokens.java new file mode 100644 index 0000000..09be781 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/IEmitterTokens.java @@ -0,0 +1,24 @@ +/* + * + * 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.codegen; + +public interface IEmitterTokens +{ + String getToken(); +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISourceMapEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISourceMapEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISourceMapEmitter.java new file mode 100644 index 0000000..3fef28e --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISourceMapEmitter.java @@ -0,0 +1,30 @@ +/* + * + * 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.codegen; + +/** + * Base interface for source map emitters. + * + * @author Josh Tynjala + */ +public interface ISourceMapEmitter +{ + String emitSourceMap(String sourceFilePath, String sourceMapPath, String sourceRoot); +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISubEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISubEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISubEmitter.java new file mode 100644 index 0000000..1431c4b --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/ISubEmitter.java @@ -0,0 +1,45 @@ +/* + * + * 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.codegen; + +import org.apache.flex.compiler.tree.as.IASNode; + +/** + * The {@link IEmitter} emitter can use composition for it's more + * complicated production sequences with member, dynamic, binary expressions and + * identifiers etc. + * + * @author Michael Schmalle + */ +public interface ISubEmitter<T> +{ + /** + * The main emitter will call this method of the sub emitter with the + * correct generic type implemented. + * <p> + * The main idea here is abstraction. Producing JavaScript can get + * complicated, the best way to avoid bugs is to avoid as much state and + * interdependence between emit() calls of the main emitter. + * + * @param node The current {@link IASNode} being emitted by the + * {@link IEmitter}. + */ + void emit(T node); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java new file mode 100644 index 0000000..bd0d1eb --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java @@ -0,0 +1,369 @@ +/* + * + * 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.codegen.as; + +import java.io.Writer; + +import org.apache.flex.compiler.codegen.IDocEmitter; +import org.apache.flex.compiler.codegen.IEmitter; +import org.apache.flex.compiler.definitions.IPackageDefinition; +import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode; +import org.apache.flex.compiler.tree.as.IASNode; +import org.apache.flex.compiler.tree.as.IBinaryOperatorNode; +import org.apache.flex.compiler.tree.as.IBlockNode; +import org.apache.flex.compiler.tree.as.ICatchNode; +import org.apache.flex.compiler.tree.as.IClassNode; +import org.apache.flex.compiler.tree.as.IContainerNode; +import org.apache.flex.compiler.tree.as.IDynamicAccessNode; +import org.apache.flex.compiler.tree.as.IForLoopNode; +import org.apache.flex.compiler.tree.as.IFunctionCallNode; +import org.apache.flex.compiler.tree.as.IFunctionNode; +import org.apache.flex.compiler.tree.as.IFunctionObjectNode; +import org.apache.flex.compiler.tree.as.IGetterNode; +import org.apache.flex.compiler.tree.as.IIdentifierNode; +import org.apache.flex.compiler.tree.as.IIfNode; +import org.apache.flex.compiler.tree.as.IImportNode; +import org.apache.flex.compiler.tree.as.IInterfaceNode; +import org.apache.flex.compiler.tree.as.IIterationFlowNode; +import org.apache.flex.compiler.tree.as.IKeywordNode; +import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode; +import org.apache.flex.compiler.tree.as.ILiteralContainerNode; +import org.apache.flex.compiler.tree.as.ILiteralNode; +import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode; +import org.apache.flex.compiler.tree.as.INamespaceAccessExpressionNode; +import org.apache.flex.compiler.tree.as.INamespaceNode; +import org.apache.flex.compiler.tree.as.INumericLiteralNode; +import org.apache.flex.compiler.tree.as.IObjectLiteralValuePairNode; +import org.apache.flex.compiler.tree.as.IParameterNode; +import org.apache.flex.compiler.tree.as.IReturnNode; +import org.apache.flex.compiler.tree.as.ISetterNode; +import org.apache.flex.compiler.tree.as.ISwitchNode; +import org.apache.flex.compiler.tree.as.ITernaryOperatorNode; +import org.apache.flex.compiler.tree.as.IThrowNode; +import org.apache.flex.compiler.tree.as.ITryNode; +import org.apache.flex.compiler.tree.as.ITypedExpressionNode; +import org.apache.flex.compiler.tree.as.IUnaryOperatorNode; +import org.apache.flex.compiler.tree.as.IUseNamespaceNode; +import org.apache.flex.compiler.tree.as.IVariableExpressionNode; +import org.apache.flex.compiler.tree.as.IVariableNode; +import org.apache.flex.compiler.tree.as.IWhileLoopNode; +import org.apache.flex.compiler.tree.as.IWithNode; +import org.apache.flex.compiler.tree.metadata.IMetaTagNode; +import org.apache.flex.compiler.visitor.IASNodeStrategy; +import org.apache.flex.compiler.visitor.IBlockWalker; + +/** + * The {@link IASEmitter} interface allows abstraction between the + * {@link IASNodeStrategy} and the current output buffer {@link Writer}. + * + * @author Michael Schmalle + */ +public interface IASEmitter extends IEmitter +{ + IBlockWalker getWalker(); + + void setWalker(IBlockWalker asBlockWalker); + + IDocEmitter getDocEmitter(); + + void setDocEmitter(IDocEmitter value); + + String postProcess(String output); + + void emitImport(IImportNode node); + + void emitPackageHeader(IPackageDefinition definition); + + void emitPackageHeaderContents(IPackageDefinition definition); + + void emitPackageContents(IPackageDefinition definition); + + void emitPackageFooter(IPackageDefinition definition); + + /** + * Emit a Class. + * + * @param node The {@link IClassNode} class. + */ + void emitClass(IClassNode node); + + /** + * Emit an Interface. + * + * @param node The {@link IInterfaceNode} class. + */ + void emitInterface(IInterfaceNode node); + + /** + * Emit a documentation comment for a Class field or constant + * {@link IVariableNode}. + * + * @param node The {@link IVariableNode} class field member. + */ + void emitFieldDocumentation(IVariableNode node); + + /** + * Emit a full Class field member. + * + * @param node The {@link IVariableNode} class field member. + */ + void emitField(IVariableNode node); + + /** + * Emit a documentation comment for a Class method {@link IFunctionNode}. + * + * @param node The {@link IFunctionNode} class method member. + */ + void emitMethodDocumentation(IFunctionNode node); + + /** + * Emit a full Class or Interface method member. + * + * @param node The {@link IFunctionNode} class method member. + */ + void emitMethod(IFunctionNode node); + + /** + * Emit a documentation comment for a Class method {@link IGetterNode}. + * + * @param node The {@link IGetterNode} class accessor member. + */ + void emitGetAccessorDocumentation(IGetterNode node); + + /** + * Emit a full Class getter member. + * + * @param node The {@link IVariableNode} class getter member. + */ + void emitGetAccessor(IGetterNode node); + + /** + * Emit a documentation comment for a Class accessor {@link IGetterNode}. + * + * @param node The {@link ISetterNode} class accessor member. + */ + void emitSetAccessorDocumentation(ISetterNode node); + + /** + * Emit a full Class setter member. + * + * @param node The {@link ISetterNode} class setter member. + */ + void emitSetAccessor(ISetterNode node); + + void emitParameter(IParameterNode node); + + /** + * Emit a namespace member. + * + * @param node The {@link INamespaceNode} class member. + */ + void emitNamespace(INamespaceNode node); + + //-------------------------------------------------------------------------- + // Statements + //-------------------------------------------------------------------------- + + /** + * Emit a statement found within an {@link IBlockNode}. + * + * @param node The {@link IASNode} statement. + */ + void emitStatement(IASNode node); + + /** + * Emit a <code>if(){}else if(){}else{}</code> statement. + * + * @param node The {@link IIfNode} node. + */ + void emitIf(IIfNode node); + + /** + * Emit a <code>for each</code> statement. + * + * @param node The {@link IForLoopNode} node. + */ + void emitForEachLoop(IForLoopNode node); + + /** + * Emit a <code>for</code> statement. + * + * @param node The {@link IForLoopNode} node. + */ + void emitForLoop(IForLoopNode node); + + /** + * Emit a <code>switch(){}</code> statement. + * + * @param node The {@link ISwitchNode} node. + */ + void emitSwitch(ISwitchNode node); + + /** + * Emit a <code>while(){}</code> statement. + * + * @param node The {@link IWhileLoopNode} node. + */ + void emitWhileLoop(IWhileLoopNode node); + + /** + * Emit a <code>do{}while()</code> statement. + * + * @param node The {@link IWhileLoopNode} node. + */ + void emitDoLoop(IWhileLoopNode node); + + /** + * Emit a <code>with(){}</code> statement. + * + * @param node The {@link IWithNode} node. + */ + void emitWith(IWithNode node); + + /** + * Emit a <code>throw</code> statement. + * + * @param node The {@link IThrowNode} node. + */ + void emitThrow(IThrowNode node); + + /** + * Emit a <code>try{}</code> statement. + * + * @param node The {@link ITryNode} node. + */ + void emitTry(ITryNode node); + + /** + * Emit a <code>catch(){}</code> statement. + * + * @param node The {@link ICatchNode} node. + */ + void emitCatch(ICatchNode node); + + /** + * Emit a <code>foo:{}</code> statement. + * + * @param node The {@link LabeledStatementNode} node. + */ + void emitLabelStatement(LabeledStatementNode node); + + void emitReturn(IReturnNode node); + + //-------------------------------------------------------------------------- + // Expressions + //-------------------------------------------------------------------------- + + /** + * Emit a variable declaration found in expression statements within scoped + * blocks. + * + * @param node The {@link IVariableNode} or chain of variable nodes. + */ + void emitVarDeclaration(IVariableNode node); + + /** + * Emit an anonymous {@link IFunctionObjectNode}. + * + * @param node The anonymous {@link IFunctionObjectNode}. + */ + void emitFunctionObject(IFunctionObjectNode node); + + /** + * Emit an local named function {@link IFunctionNode}. + * + * @param node The local named function {@link IFunctionNode}. + */ + void emitLocalNamedFunction(IFunctionNode node); + + /** + * Emit a header at the start of a function block. + * + * @param node The {@link IFunctionNode} node. + */ + void emitFunctionBlockHeader(IFunctionNode node); + + /** + * Emit a function call like <code>new Foo()</code> or <code>foo(42)</code>. + * + * @param node The {@link IFunctionCallNode} node. + */ + void emitFunctionCall(IFunctionCallNode node); + + void emitArguments(IContainerNode node); + + void emitIterationFlow(IIterationFlowNode node); + + void emitNamespaceAccessExpression(INamespaceAccessExpressionNode node); + + void emitMemberAccessExpression(IMemberAccessExpressionNode node); + + void emitVariableExpression(IVariableExpressionNode node); + + void emitDynamicAccess(IDynamicAccessNode node); + + void emitTypedExpression(ITypedExpressionNode node); + + void emitObjectLiteralValuePair(IObjectLiteralValuePairNode node); + + void emitIdentifier(IIdentifierNode node); + + void emitLiteral(ILiteralNode node); + + void emitLiteralContainer(ILiteralContainerNode node); + + void emitNumericLiteral(INumericLiteralNode node); + + //-------------------------------------------------------------------------- + // Operators + //-------------------------------------------------------------------------- + + void emitUnaryOperator(IUnaryOperatorNode node); + + void emitAsOperator(IBinaryOperatorNode node); + + void emitIsOperator(IBinaryOperatorNode node); + + /** + * Emit an operator statement. + * + * @param node The {@link IBinaryOperatorNode} or chain of variable nodes. + */ + void emitBinaryOperator(IBinaryOperatorNode node); + + void emitTernaryOperator(ITernaryOperatorNode node); + + //-------------------------------------------------------------------------- + // Node + //-------------------------------------------------------------------------- + + void emitKeyword(IKeywordNode node); + + void emitLanguageIdentifier(ILanguageIdentifierNode node); + + void emitMetaTag(IMetaTagNode node); + + void emitContainer(IContainerNode node); + + void emitE4XFilter(IMemberAccessExpressionNode node); + + void emitUseNamespace(IUseNamespaceNode node); + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASWriter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASWriter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASWriter.java new file mode 100644 index 0000000..c2c2ded --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASWriter.java @@ -0,0 +1,51 @@ +/* + * + * 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.codegen.as; + +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +/** + * An ActionScript writer that outputs cross compiled string data to the output + * stream. + * + * @author Michael Schmalle + */ +public interface IASWriter extends Closeable +{ + /** + * Start writing to output stream. + * + * @param out output stream + */ + void writeTo(OutputStream out); + + /** + * Start writing to a file. + * + * @param out The output {@link File}. + * @return The number of bytes written. + */ + int writeTo(File out) throws FileNotFoundException, IOException; + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSDocEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSDocEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSDocEmitter.java new file mode 100644 index 0000000..e37dd18 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSDocEmitter.java @@ -0,0 +1,33 @@ +/* + * + * 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.codegen.js; + +import org.apache.flex.compiler.codegen.IDocEmitter; + +/** + * The {@link IJSDocEmitter} interface allows the abstraction of JavaScript + * document comments to be emitted per tag. + * + * @author Michael Schmalle + */ +public interface IJSDocEmitter extends IDocEmitter +{ + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java new file mode 100644 index 0000000..218b5be --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java @@ -0,0 +1,85 @@ +/* + * + * 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.codegen.js; + +import java.io.Writer; +import java.util.List; + +import com.google.debugging.sourcemap.FilePosition; +import org.apache.flex.compiler.codegen.as.IASEmitter; +import org.apache.flex.compiler.common.ISourceLocation; +import org.apache.flex.compiler.internal.codegen.js.JSSessionModel; +import org.apache.flex.compiler.tree.as.IASNode; +import org.apache.flex.compiler.tree.as.ITypeNode; +import org.apache.flex.compiler.visitor.IASNodeStrategy; + +/** + * The {@link IJSEmitter} interface allows abstraction between the + * {@link IASNodeStrategy} and the current output buffer {@link Writer}. + * + * @author Michael Schmalle + */ +public interface IJSEmitter extends IASEmitter +{ + JSSessionModel getModel(); + List<SourceMapMapping> getSourceMapMappings(); + + String formatQualifiedName(String name); + + /** + * Adds a node to the source map. + */ + void startMapping(ISourceLocation node); + + /** + * Adds a node to the source map using custom line and column values, + * instead of the node's own line and column. Useful for starting a mapping + * in the middle of the node. + */ + void startMapping(ISourceLocation node, int line, int column); + + /** + * Adds a node to the source map after a particular node instead using the + * node's own line and column. + */ + void startMapping(ISourceLocation node, ISourceLocation nodeBeforeMapping); + + /** + * Commits a mapping to the source map. + */ + void endMapping(ISourceLocation node); + + void pushSourceMapName(ISourceLocation node); + void popSourceMapName(); + + void emitSourceMapDirective(ITypeNode node); + + void emitClosureStart(); + void emitClosureEnd(IASNode node); + + class SourceMapMapping + { + public String sourcePath; + public String name; + public FilePosition sourceStartPosition; + public FilePosition destStartPosition; + public FilePosition destEndPosition; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSPublisher.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSPublisher.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSPublisher.java new file mode 100644 index 0000000..2d62436 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSPublisher.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.compiler.codegen.js; + +import java.io.File; +import java.io.IOException; + +import org.apache.flex.compiler.clients.problems.ProblemQuery; +import org.apache.flex.compiler.driver.IPublisher; + +/** + * The {@link IJSPublisher} interface allows the abstraction of project output + * generation. + * + * @author Erik de Bruin + */ +public interface IJSPublisher extends IPublisher +{ + + File getOutputFolder(); + + boolean publish(ProblemQuery problems) throws IOException; + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSWriter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSWriter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSWriter.java new file mode 100644 index 0000000..aae8011 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSWriter.java @@ -0,0 +1,43 @@ +/* + * + * 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.codegen.js; + +import java.io.File; +import java.io.OutputStream; + +import org.apache.flex.compiler.codegen.as.IASWriter; + +/** + * A JavaScript writer that outputs cross compiled string data to the output + * stream. + * + * @author Michael Schmalle + */ +public interface IJSWriter extends IASWriter +{ + /** + * Write JS file and source map. + * + * @param jsOut JS output stream + * @param sourceMapOut Source map file + */ + void writeTo(OutputStream jsOut, File sourceMapOut); + +}