Package org.apache.flex.compiler.internal.targets

Source Code of org.apache.flex.compiler.internal.targets.JSTarget

/*
*
*  Licensed to the Apache Software Foundation (ASF) under one or more
*  contributor license agreements.  See the NOTICE file distributed with
*  this work for additional information regarding copyright ownership.
*  The ASF licenses this file to You under the Apache License, Version 2.0
*  (the "License"); you may not use this file except in compliance with
*  the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*
*/

package org.apache.flex.compiler.internal.targets;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.flex.compiler.exceptions.BuildCanceledException;
import org.apache.flex.compiler.internal.js.codegen.JSSharedData;
import org.apache.flex.compiler.internal.js.driver.JSApplication;
import org.apache.flex.compiler.internal.projects.CompilerProject;
import org.apache.flex.compiler.js.IJSApplication;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.projects.IASProject;
import org.apache.flex.compiler.targets.IJSTarget;
import org.apache.flex.compiler.targets.ITargetProgressMonitor;
import org.apache.flex.compiler.targets.ITargetReport;
import org.apache.flex.compiler.targets.ITargetSettings;
import org.apache.flex.compiler.units.ICompilationUnit;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;

public class JSTarget extends Target implements IJSTarget
{
    private ICompilationUnit mainCU;
    private RootedCompilationUnits rootedCompilationUnits;

    /**
     * Initialize a JS target with the owner project and root compilation units.
     *
     * @param project the owner project
     */
    public JSTarget(IASProject project, ITargetSettings targetSettings,
            ITargetProgressMonitor progressMonitor)
    {
        super((CompilerProject) 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);
    }

}
TOP

Related Classes of org.apache.flex.compiler.internal.targets.JSTarget

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.