blob: 2525bd8dea6731a50b4755cce6b79a576b3c287e [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.targets;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.royale.compiler.driver.js.IJSApplication;
import org.apache.royale.compiler.exceptions.BuildCanceledException;
import org.apache.royale.compiler.internal.driver.js.JSApplication;
import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
import org.apache.royale.compiler.problems.ICompilerProblem;
import org.apache.royale.compiler.targets.IJSTarget;
import org.apache.royale.compiler.targets.ITargetProgressMonitor;
import org.apache.royale.compiler.targets.ITargetReport;
import org.apache.royale.compiler.targets.ITargetSettings;
import org.apache.royale.compiler.units.ICompilationUnit;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
public class JSTarget extends Target implements IJSTarget
{
protected ICompilationUnit mainCU;
protected RootedCompilationUnits rootedCompilationUnits;
/**
* Initialize a JS target with the owner project and root compilation units.
*
* @param project the owner project
*/
public JSTarget(RoyaleJSProject project, ITargetSettings targetSettings,
ITargetProgressMonitor progressMonitor)
{
super(project, targetSettings, progressMonitor);
}
@Override
public TargetType getTargetType()
{
// can't do anything, TargetType is only swf|swc
return null;
}
@Override
protected ITargetReport computeTargetReport() throws InterruptedException
{
// TODO Should return a new TargetReport relating to the js app?
return null;
}
@Override
protected RootedCompilationUnits computeRootedCompilationUnits()
throws InterruptedException
{
if (mainCU != null)
{
return new Target.RootedCompilationUnits(ImmutableSet.of(mainCU),
Collections.<ICompilerProblem> emptyList());
}
return new Target.RootedCompilationUnits(
Collections.<ICompilationUnit> emptySet(),
Collections.<ICompilerProblem> emptyList());
}
@Override
public RootedCompilationUnits getRootedCompilationUnits()
throws InterruptedException
{
if (rootedCompilationUnits == null)
rootedCompilationUnits = computeRootedCompilationUnits();
return rootedCompilationUnits;
}
@Override
public IJSApplication build(Collection<ICompilerProblem> problems)
{
buildStarted();
try
{
Iterable<ICompilerProblem> fatalProblems = getFatalProblems();
if (!Iterables.isEmpty(fatalProblems))
{
Iterables.addAll(problems, fatalProblems);
return null;
}
Set<ICompilationUnit> compilationUnitSet = new HashSet<ICompilationUnit>();
Target.RootedCompilationUnits rootedCompilationUnits = getRootedCompilationUnits();
Iterables.addAll(problems, rootedCompilationUnits.getProblems());
compilationUnitSet.addAll(rootedCompilationUnits.getUnits());
buildAndCollectProblems(compilationUnitSet, problems);
List<ICompilationUnit> reachableCompilationUnits = project
.getReachableCompilationUnitsInSWFOrder(rootedCompilationUnits
.getUnits());
IJSApplication application = initializeApplication(reachableCompilationUnits);
// ISWF swf = initializeSWF(reachableCompilationUnits);
//
// // make main frame for DoABC tags
// final SWFFrame mainFrame = new SWFFrame();
// swf.addFrame(mainFrame);
//
// // Add definitions.
// for (final ICompilationUnit cu : compilationUnitSet)
// {
// // ignore externals
// if (isLinkageExternal(cu, targetSettings))
// continue;
//
// // ignore any resource bundles
// if (cu instanceof ResourceBundleCompilationUnit)
// continue;
//
// // Create a DoABC tag per compilation unit.
//
// // Please add this API to SWFTarget. Thx.
// // protected Boolean addToFrame(ICompilationUnit cu, SWFFrame mainFrame) throws InterruptedException
// // final boolean tagsAdded = cu.getSWFTagsRequest().get().addToFrame(mainFrame);
// final boolean tagsAdded = addToFrame(cu, mainFrame);
// if (!tagsAdded)
// {
// ICompilerProblem problem = new UnableToBuildSWFTagProblem(cu.getAbsoluteFilename());
// problems.add(problem);
// }
// }
//
createLinkReport(problems);
return application;
}
catch (BuildCanceledException bce)
{
return null;
}
catch (InterruptedException ie)
{
return null;
}
finally
{
buildFinished();
}
}
protected IJSApplication initializeApplication(
List<ICompilationUnit> reachableCompilationUnits)
{
JSApplication result = new JSApplication();
// TODO set properties of the application
return result;
}
protected void buildAndCollectProblems(
final Set<ICompilationUnit> compilationUnits,
final Collection<ICompilerProblem> problems)
throws InterruptedException
{
/* final JSSharedData sharedData = JSSharedData.instance;
sharedData.beginCodeGen();*/
BuiltCompilationUnitSet builtCompilationUnits = getBuiltCompilationUnitSet();
// if (JSSharedData.OUTPUT_ISOLATED)
// {
final ICompilationUnit rootCU = getRootClassCompilationUnit();
compilationUnits.clear();
compilationUnits.add(rootCU);
// i added
Iterables.addAll(problems, builtCompilationUnits.problems);
// }
// else
// {
// final List<ICompilationUnit> allUnits = new ArrayList<ICompilationUnit>();
// allUnits.addAll(project
// .getReachableCompilationUnitsInSWFOrder(builtCompilationUnits.compilationUnits));
// final List<ICompilationUnit> cuList = sortCompilationUnits(allUnits);
// compilationUnits.clear();
// for (ICompilationUnit cu : cuList)
// compilationUnits.add(cu);
// }
// sharedData.endCodeGen();
}
private ICompilationUnit getRootClassCompilationUnit()
{
String rootClassFileName = targetSettings.getRootSourceFileName();
if (rootClassFileName == null)
return null;
Collection<ICompilationUnit> rootClassCompilationUnits = project
.getCompilationUnits(rootClassFileName);
assert rootClassCompilationUnits.size() == 1 : "There must only be a single compilation unit for the root source file!";
return Iterables.getOnlyElement(rootClassCompilationUnits);
}
public IJSApplication build(ICompilationUnit unit,
Collection<ICompilerProblem> problems)
{
mainCU = unit;
return build(problems);
}
}