blob: c436fd9955449df4c37147e325507db0f21835b9 [file] [log] [blame]
/*
*
* 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.royale.compiler.internal.test;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.royale.compiler.clients.MXMLJSC;
import org.apache.royale.compiler.codegen.as.IASEmitter;
import org.apache.royale.compiler.codegen.mxml.IMXMLEmitter;
import org.apache.royale.compiler.config.Configurator;
import org.apache.royale.compiler.driver.IBackend;
import org.apache.royale.compiler.internal.codegen.as.ASFilterWriter;
import org.apache.royale.compiler.internal.definitions.DefinitionBase;
import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
import org.apache.royale.compiler.internal.projects.RoyaleProjectConfigurator;
import org.apache.royale.compiler.internal.projects.ISourceFileHandler;
import org.apache.royale.compiler.internal.targets.JSTarget;
import org.apache.royale.compiler.internal.tree.as.FunctionNode;
import org.apache.royale.compiler.internal.tree.as.ImportNode;
import org.apache.royale.compiler.internal.workspaces.Workspace;
import org.apache.royale.compiler.mxml.IMXMLNamespaceMapping;
import org.apache.royale.compiler.problems.ICompilerProblem;
import org.apache.royale.compiler.projects.ICompilerProject;
import org.apache.royale.compiler.tree.as.IASNode;
import org.apache.royale.compiler.tree.as.IFileNode;
import org.apache.royale.compiler.tree.mxml.IMXMLFileNode;
import org.apache.royale.compiler.units.ICompilationUnit;
import org.apache.royale.compiler.units.requests.ISyntaxTreeRequestResult;
import org.apache.royale.utils.EnvProperties;
import org.apache.royale.compiler.visitor.as.IASBlockWalker;
import org.apache.royale.compiler.visitor.mxml.IMXMLBlockWalker;
import org.apache.royale.utils.FilenameNormalization;
import org.apache.royale.utils.ITestAdapter;
import org.apache.royale.utils.TestAdapterFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@Ignore
public class TestBase implements ITestBase
{
private static ITestAdapter testAdapter = TestAdapterFactory.getTestAdapter();
protected List<ICompilerProblem> errors;
protected static EnvProperties env = EnvProperties.initiate();
protected static Workspace workspace = new Workspace();
protected RoyaleJSProject project;
protected IBackend backend;
protected ASFilterWriter writer;
protected IASEmitter asEmitter;
protected IMXMLEmitter mxmlEmitter;
protected IASBlockWalker asBlockWalker;
protected IMXMLBlockWalker mxmlBlockWalker;
protected String inputFileExtension;
protected String mCode;
protected File tempDir;
protected List<File> sourcePaths = new ArrayList<File>();
protected List<File> libraries = new ArrayList<File>();
protected List<IMXMLNamespaceMapping> namespaceMappings = new ArrayList<IMXMLNamespaceMapping>();
@Before
public void setUp()
{
DefinitionBase.setPerformanceCachingEnabled(true);
errors = new ArrayList<ICompilerProblem>();
if (project == null)
{
backend = createBackend();
project = new RoyaleJSProject(workspace, backend);
project.setProxyBaseClass("custom.TestProxy");
}
project.setProblems(errors);
RoyaleProjectConfigurator.configure(project);
try {
Configurator projectConfigurator = backend.createConfigurator();
project.setTargetSettings(projectConfigurator.getTargetSettings(null));
}
catch (UnsupportedOperationException e)
{
}
writer = backend.createWriterBuffer(project);
try
{
ISourceFileHandler sfh = backend.getSourceFileHandlerInstance();
inputFileExtension = "." + sfh.getExtensions()[0];
}
catch (Exception e)
{
inputFileExtension = ".as";
}
sourcePaths = new ArrayList<File>();
libraries = new ArrayList<File>();
namespaceMappings = new ArrayList<IMXMLNamespaceMapping>();
tempDir = new File(TestAdapterFactory.getTestAdapter().getTempDir()); // ensure this exists
}
@After
public void tearDown()
{
DefinitionBase.setPerformanceCachingEnabled(false);
backend = null;
writer = null;
}
protected IBackend createBackend()
{
return null;
}
protected void assertErrors(String errorReport)
{
StringBuilder actualErrors = new StringBuilder();
for (ICompilerProblem problem : errors)
{
if (problem.toString().equals("An externally-visible definition with the name 'Array' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'Function' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'Object' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'String' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'Boolean' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'Number' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'Error' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'RangeError' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'ReferenceError' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'TypeError' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'int' was unexpectedly found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'uint' was unexpectedly found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Array' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Function' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Object' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.String' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Number' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Boolean' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.Error' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.RangeError' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.ReferenceError' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.TypeError' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.int' was found."))
continue;
if (problem.toString().equals("No externally-visible definition with the name 'typedefs.as.classes.uint' was found."))
continue;
if (problem.toString().equals("An externally-visible definition with the name 'RoyaleTest_A' was unexpectedly found."))
continue;
if (problem.toString().startsWith("No externally-visible definition with the name 'TestRoyaleGlobalFunctions"))
continue;
actualErrors.append(problem.toString());
}
assertThat(actualErrors.toString(), is(errorReport));
}
protected void assertOut(String code, boolean keepMetadata)
{
mCode = removeGeneratedString(writer.toString());
if (!keepMetadata)
mCode = removeMetadata(mCode);
//System.out.println(mCode);
/*if (!code.equals(mCode)) {
System.out.println("mCode:\n"+mCode);
System.out.println("code:\n"+code);
}*/
assertThat(mCode, is(code));
}
protected void assertOutPostProcess(String code, boolean keepMetadata)
{
mCode = removeGeneratedString(asEmitter.postProcess(writer.toString()));
if (!keepMetadata)
mCode = removeMetadata(mCode);
//System.out.println(mCode);
/*if (!code.equals(mCode)) {
System.out.println("mCode:\n"+mCode);
System.out.println("code:\n"+code);
}*/
assertThat(mCode, is(code));
}
protected void assertOutMXMLPostProcess(String code, boolean keepMetadata)
{
mCode = removeGeneratedString(mxmlEmitter.postProcess(writer.toString()));
if (!keepMetadata)
mCode = removeMetadata(mCode);
//System.out.println(mCode);
/*if (!code.equals(mCode)) {
System.out.println("mCode:\n"+mCode);
System.out.println("code:\n"+code);
}*/
assertThat(mCode, is(code));
}
protected void assertOut(String code)
{
assertOut(code, false);
}
protected void assertOutWithMetadata(String code)
{
assertOut(code, true);
}
protected String removeMetadata(String code)
{
int c = code.indexOf("\n\n\n/**\n * Metadata");
if (c != -1)
return code.substring(0, c);
return code;
}
protected String removeGeneratedString(String code)
{
int c = code.indexOf(" * Generated by Apache Royale Compiler");
if (c != -1)
{
int c2 = code.indexOf("\n", c);
String newString = code.substring(0, c);
newString += code.substring(c2 + 1);
return newString;
}
return code;
}
@Override
public String toString()
{
return writer.toString();
}
protected IFileNode compileAS(String input)
{
return compileAS(input, false, "");
}
protected IFileNode compileAS(String input, boolean isFileName,
String inputDir)
{
return compileAS(input, isFileName, inputDir, true);
}
protected IFileNode compileAS(String input, boolean isFileName,
String inputDir, boolean useTempFile)
{
return (IFileNode) compile(input, isFileName, inputDir, useTempFile);
}
protected IASNode compile(String input, boolean isFileName,
String inputDir, boolean useTempFile)
{
File tempFile = (useTempFile) ? writeCodeToTempFile(input, isFileName, inputDir) :
new File(inputDir + File.separator + input + inputFileExtension);
addDependencies();
String normalizedMainFileName = FilenameNormalization
.normalize(tempFile.getAbsolutePath());
Collection<ICompilationUnit> mainFileCompilationUnits = workspace
.getCompilationUnits(normalizedMainFileName, project);
ICompilationUnit cu = null;
for (ICompilationUnit cu2 : mainFileCompilationUnits)
{
if (cu2 != null)
cu = cu2;
}
IASNode fileNode = null;
try
{
ISyntaxTreeRequestResult result = cu.getSyntaxTreeRequest().get();
ICompilerProblem[] problems = result.getProblems();
if (problems.length > 0)
{
for (ICompilerProblem problem : problems)
System.out.println(problem.toString());
return null;
}
fileNode = result.getAST();
project.getDependencies(cu);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return fileNode;
}
protected List<String> compileProject(String inputFileName,
String inputDirName)
{
return compileProject(inputFileName, inputDirName, new StringBuilder(), true);
}
protected List<String> compileProject(String inputFileName,
String inputDirName, StringBuilder sb, boolean ignoreErrors)
{
List<String> compiledFileNames = new ArrayList<String>();
String mainFileName = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
inputDirName + "/" + inputFileName + inputFileExtension).getPath();
addDependencies();
ICompilationUnit mainCU = Iterables
.getOnlyElement(workspace.getCompilationUnits(
FilenameNormalization.normalize(mainFileName), project));
project.mainCU = mainCU;
Configurator projectConfigurator = backend.createConfigurator();
JSTarget target = (JSTarget) backend.createTarget(project,
projectConfigurator.getTargetSettings(null), null);
ArrayList<ICompilerProblem> errors = new ArrayList<ICompilerProblem>();
target.build(mainCU, errors);
if (!ignoreErrors && errors.size() > 0)
{
for (ICompilerProblem error : errors)
{
String fn = error.getSourcePath();
if(fn != null) {
int c = fn.indexOf(testAdapter.getUnitTestBaseDir().getPath());
fn = fn.substring(c);
sb.append(fn);
sb.append("(" + error.getLine() + ":" + error.getColumn() + ")\n");
sb.append(error.toString() + "\n");
}
}
System.out.println(sb.toString());
return compiledFileNames;
}
List<ICompilationUnit> reachableCompilationUnits = project
.getReachableCompilationUnitsInSWFOrder(ImmutableSet.of(mainCU));
for (final ICompilationUnit cu : reachableCompilationUnits)
{
try
{
ICompilationUnit.UnitType cuType = cu.getCompilationUnitType();
if (cuType == ICompilationUnit.UnitType.AS_UNIT
|| cuType == ICompilationUnit.UnitType.MXML_UNIT)
{
File outputRootDir = new File(
FilenameNormalization.normalize(tempDir
+ File.separator + inputDirName));
String qname = cu.getQualifiedNames().get(0);
compiledFileNames.add(qname.replace(".", "/"));
final File outputClassFile = getOutputClassFile(qname
+ "_output", outputRootDir);
ASFilterWriter writer = backend.createWriterBuffer(project);
IASEmitter emitter = backend.createEmitter(writer);
IASBlockWalker walker = backend.createWalker(project,
errors, emitter);
walker.visitCompilationUnit(cu);
//System.out.println(writer.toString());
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(outputClassFile));
out.write(emitter.postProcess(writer.toString()).getBytes());
out.flush();
out.close();
}
}
catch (Exception e)
{
//System.out.println(e.getMessage());
}
}
/*
File outputRootDir = new File(
FilenameNormalization.normalize(tempDir
+ File.separator + inputDirName));
String qname;
try {
qname = mainCU.getQualifiedNames().get(0);
final File outputClassFile = getOutputClassFile(qname
+ "_output", outputRootDir);
appendLanguageAndXML(outputClassFile.getAbsolutePath(), qname);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
return compiledFileNames;
}
protected void writeFile(String path, String content, boolean append)
throws IOException
{
File tgtFile = new File(path);
if (!tgtFile.exists())
tgtFile.createNewFile();
FileWriter fw = new FileWriter(tgtFile, append);
fw.write(content);
fw.close();
}
/*
private void appendLanguageAndXML(String path, String projectName) throws IOException
{
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
appendString.append("\n");
String fileData = readCode(new File(path));
int reqidx = fileData.indexOf(appendString.toString());
if (reqidx == -1 && project instanceof RoyaleJSProject && ((RoyaleJSProject)project).needLanguage)
{
boolean afterProvide = false;
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (reqidx == -1)
{
afterProvide = true;
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_PROVIDE.getToken());
}
reqidx = fileData.indexOf(";", reqidx);
String after = fileData.substring(reqidx + 1);
String before = fileData.substring(0, reqidx + 1);
if (afterProvide)
before += "\n";
String s = before + "\n" + appendString.toString() + after;
writeFile(path, s, false);
}
StringBuilder appendStringXML = new StringBuilder();
appendStringXML.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendStringXML.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendStringXML.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendStringXML.append(IASLanguageConstants.XML);
appendStringXML.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendStringXML.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendStringXML.append(ASEmitterTokens.SEMICOLON.getToken());
appendStringXML.append("\n");
if (project instanceof RoyaleJSProject && ((RoyaleJSProject)project).needXML)
{
fileData = readCode(new File(path));
reqidx = fileData.indexOf(appendStringXML.toString());
if (reqidx == -1)
{
boolean afterProvide = false;
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (reqidx == -1)
{
afterProvide = true;
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_PROVIDE.getToken());
}
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (reqidx == -1)
reqidx = fileData.lastIndexOf(JSGoogEmitterTokens.GOOG_PROVIDE.getToken());
reqidx = fileData.indexOf(";", reqidx);
String after = fileData.substring(reqidx + 1);
String before = fileData.substring(0, reqidx + 1);
if (afterProvide)
before += "\n";
String s = before + "\n" + appendStringXML.toString() + after;
writeFile(path, s, false);
}
}
}
*/
protected String readCode(File file)
{
String code = "";
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF8"));
String line = in.readLine();
while (line != null)
{
code += line + "\n";
line = in.readLine();
}
code = code.substring(0, code.length() - 1);
in.close();
}
catch (Exception e)
{
// nothing to see, move along...
}
return code;
}
protected 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 + "." + backend.getOutputExtension());
}
protected IMXMLFileNode compileMXML(String input)
{
return compileMXML(input, false, "");
}
protected IMXMLFileNode compileMXML(String input, boolean isFileName,
String inputDir)
{
return compileMXML(input, isFileName, inputDir, true);
}
protected IMXMLFileNode compileMXML(String input, boolean isFileName,
String inputDir, boolean useTempFile)
{
return (IMXMLFileNode) compile(input, isFileName, inputDir, useTempFile);
}
protected File writeCodeToTempFile(String input, boolean isFileName,
String inputDir)
{
File tempASFile = null;
try
{
String tempFileName = (isFileName) ? input : getClass()
.getSimpleName();
tempASFile = File.createTempFile(tempFileName, inputFileExtension,
new File(TestAdapterFactory.getTestAdapter().getTempDir()));
tempASFile.deleteOnExit();
String code = "";
if (!isFileName)
{
code = input;
}
else
{
code = getCodeFromFile(input, false, inputDir);
}
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempASFile),"UTF-8"));
out.write(code);
out.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
return tempASFile;
}
protected void writeResultToFile(String result, String fileName)
{
BufferedWriter writer = null;
try
{
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(new File(tempDir, fileName + ".js")),
"utf-8"));
writer.write(result);
}
catch (IOException e1)
{
e1.printStackTrace();
}
finally
{
try
{
writer.close();
}
catch (Exception ex)
{
}
}
}
/**
* Overridable setup of dependencies, default adds source, libraries and
* namepsaces.
* <p>
* The test will then set the dependencies on the current
* {@link ICompilerProject}.
*/
protected void addDependencies()
{
addSourcePaths(sourcePaths);
addLibraries(libraries);
if (libraries.size() == 0)
{
String jsSwcPath = FilenameNormalization.normalize("../compiler-externc/target/js.swc");
libraries.add(new File(jsSwcPath));
String customSwcPath = FilenameNormalization.normalize("../compiler/target/custom.swc");
libraries.add(new File(customSwcPath));
}
addNamespaceMappings(namespaceMappings);
project.setSourcePath(sourcePaths);
project.setLibraries(libraries);
project.setNamespaceMappings(namespaceMappings);
}
protected void addLibraries(List<File> libraries)
{
}
protected void addSourcePaths(List<File> sourcePaths)
{
sourcePaths.add(tempDir);
}
protected void addNamespaceMappings(
List<IMXMLNamespaceMapping> namespaceMappings)
{
}
protected String getCodeFromFile(String fileName, boolean isJS,
String sourceDir)
{
File testFile = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
sourceDir + "/" + fileName
+ (isJS ? ".js" : inputFileExtension));
return readCodeFile(testFile);
}
protected String getCodeFromFile(String fileName,
String sourceDir)
{
File testFile = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
sourceDir + "/" + fileName);
return readCodeFile(testFile);
}
protected String readCodeFile(File file)
{
boolean isResult = file.getName().contains("_result") || file.getName().equals("output.js");
String code = "";
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF8"));
String line = in.readLine();
if (line.contains("/**") && isResult)
{
// eat opening comment which should be apache header
while (line != null)
{
line = in.readLine();
if (line.contains("*/"))
{
line = in.readLine();
break;
}
}
}
else if (line.contains("<!--") && isResult)
{
// eat opening comment which should be apache header
while (line != null)
{
line = in.readLine();
if (line.contains("-->"))
{
line = in.readLine();
break;
}
}
}
while (line != null)
{
code += line + "\n";
line = in.readLine();
}
code = code.substring(0, code.length() - 1);
code = removeGeneratedString(code);
in.close();
}
catch (Exception e)
{
}
return code;
}
protected IASNode findFirstDescendantOfType(IASNode node,
Class<? extends IASNode> nodeType)
{
int n = node.getChildCount();
for (int i = 0; i < n; i++)
{
IASNode child = node.getChild(i);
if (child instanceof ImportNode)
continue; // not interested in these and they have BinaryOps inside
if (child instanceof FunctionNode)
{
((FunctionNode) child).parseFunctionBody(errors);
}
if (nodeType.isInstance(child))
return child;
IASNode found = findFirstDescendantOfType(child, nodeType);
if (found != null)
return found;
}
return null;
}
protected int compileAndPublishProject(String projectFolderPath,
String projectName, String mainFileName)
{
String sourceFolderName = tempDir + "/" + projectName + "/src";
IOFileFilter asFilter = FileFilterUtils.and(FileFileFilter.FILE,
FileFilterUtils.suffixFileFilter(".as"));
File sourceFolder = new File(sourceFolderName);
File projectFolder = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(), projectFolderPath);
try {
FileUtils.copyDirectory(projectFolder, sourceFolder, asFilter);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int numArgs = 3;
if (env.GOOG != null) numArgs++;
String[] args = new String[numArgs];
File mainFile = new File(sourceFolder, mainFileName);
//args[0] = "-compiler.targets=JS";
int index = 0;
args[index++] = "-external-library-path=" + env.ASJS + "/js/libs/js.swc";
args[index++] = "-remove-circulars";
if (env.GOOG != null)
args[index++] = "-closure-lib=" + env.GOOG;
args[index++] = mainFile.getAbsolutePath();
int exitCode = MXMLJSC.staticMainNoExit(args);
return exitCode;
}
}