blob: 6583f3a39f861d6576da00ec8546349ad87d316d [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.flex.compiler.internal.driver.js;
import java.io.IOException;
import java.util.Collection;
import org.apache.flex.compiler.common.DependencyType;
import org.apache.flex.compiler.internal.projects.CompilerProject;
import org.apache.flex.compiler.internal.projects.DefinitionPriority;
import org.apache.flex.compiler.internal.units.ASCompilationUnit;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.targets.ITarget.TargetType;
import org.apache.flex.compiler.units.requests.IOutgoingDependenciesRequestResult;
/**
* JSCompilationUnit is the CompilationUnit for compiling ActionScript source
* files to JavasScript.
* <p>
* JSCompilationUnit is derived from ASCompilationUnit and overrides the parts
* that generate the code.
*/
public class JSCompilationUnit extends ASCompilationUnit
{
@SuppressWarnings("unused")
private Boolean inCodeGen = false;
/**
* Create a compilation unit from an ABC file.
*
* @param project compiler project
* @param path ABC file path
* @throws IOException error
*/
public JSCompilationUnit(CompilerProject project, String path)
throws IOException
{
this(project, path, DefinitionPriority.BasePriority.LIBRARY_PATH);
}
public JSCompilationUnit(CompilerProject project, String path,
DefinitionPriority.BasePriority basePriority)
{
super(project, path, basePriority);
}
public JSCompilationUnit(CompilerProject project, String path,
DefinitionPriority.BasePriority basePriority, String qname)
{
super(project, path, basePriority, 0, qname);
}
// protected IABCBytesRequestResult _handleABCBytesRequest(Operation buildPhase) throws InterruptedException
// {
// // If JSEmitter.needsSecondPass() returns true, JSGenerator.generate() will return null during scanning,
// // which will result in JSCompilationUnit::handleSemanticProblemsRequest not caching any abcBytes for
// // handleABCBytesRequest. The net result is that JSGenerator.generate() will be called again in handleABCBytesRequest.
// // This mechanic will ensure selective two-pass compilation.
// if (m_abcBytes != null &&
// !JSSharedData.instance.hasSymbols() && // Symbol support
// !JSSharedData.instance.hasAnyClassInit()) // support for class inits
// return m_abcBytes;
//
// JSGenerator jsGenerator = new JSGenerator();
// jsGenerator.m_compilationUnit = this;
// jsGenerator.setBuildPhase(buildPhase);
//
// // Need to force the file scope request to happen first to get the ASFileScope
// // for this compilation unit registered with the project.
// // ** TODO this is a hack!
// getFileScopeRequest().get();
//
// // This is also a hack! If there are embed directives, need to ensure
// // semantic pass has finished, as that is what will generate the embed classes
// // which are needed by codegen
// if (buildPhase != Operation.GET_SEMANTIC_PROBLEMS)
// {
// // AJH this was deadlocking as getOutgoingDependencies calls handleABCBytes
// if (buildPhase != Operation.GET_ABC_BYTES)
// getOutgoingDependenciesRequest().get();
// }
//
// final ISyntaxTreeRequestResult fsr = getSyntaxTreeRequest().get();
// final IASNode rootNode = fsr.getAST();
//
// startProfile(buildPhase);
// IABCBytesRequestResult result = jsGenerator.generate(getFilenameNoPath(), rootNode, this.getProject());
// stopProfile(buildPhase);
//
// m_needsSecondPass = jsGenerator.needsSecondPass();
//
// return result;
// }
// @Override
// protected IABCBytesRequestResult handleABCBytesRequest() throws InterruptedException
// {
// final IABCBytesRequestResult result = _handleABCBytesRequest(Operation.GET_ABC_BYTES);
//
// /*
// * // explicitly reference all classes this class depends on if(
// * result.getProblems() == null || result.getProblems().length == 0 ) {
// * final String code = new String( result.getABCBytes() ); if(
// * code.contains(JSSharedData.REQUIRED_TAG_MARKER) ) { final
// * ICompilationUnit cu = this; final Set<ICompilationUnit> deps = new
// * HashSet<ICompilationUnit>(); deps.addAll(
// * getProject().getDependencies(cu) ); if( !deps.isEmpty() ) { String
// * depNames = ""; Boolean separator = false; final List<IDefinition>
// * defs = MXMLJSC.getClassDefinitions( cu ); for( IDefinition def: defs
// * ) { if( def instanceof ClassDefinition ) { final String defName =
// * JSGeneratingReducer.createFullNameFromDefinition(def); if( defName !=
// * null && !defName.isEmpty() ) { if( separator ) depNames += ":"; else
// * separator = true; depNames += defName; } } }
// * code.replaceFirst(JSSharedData.REQUIRED_TAG_MARKER, depNames); return
// * new ABCBytesRequestResult(code.getBytes(), result.getProblems()); } }
// * }
// */
// return result;
// }
@Override
protected IOutgoingDependenciesRequestResult handleOutgoingDependenciesRequest()
throws InterruptedException
{
// // Every CU is dependent on the class glue, which is implemented in browser.adobe.
// // Add dependency from this JSCompilationUnit to browser.adobe's JSCompilationUnit.
// addDependency(JSSharedData.JS_FRAMEWORK_NAME, DependencyType.INHERITANCE);
// addDependency(JSSharedData.FRAMEWORK_CLASS, DependencyType.INHERITANCE);
IOutgoingDependenciesRequestResult result = super
.handleOutgoingDependenciesRequest();
// // SWFTarget::startBuildAndFindAllCompilationUnits() is called by SWFTarget::collectProblems(), which is called by SWFTarget::addToSWF() in JSDriver::main().
// // This is our first pass. jsGenerator.generate() will return null if JSGeneratingReducer.getMember
// // If JSEmitter.needsSecondPass() returns true, JSGenerator.generate() will return null during scanning,
// // which will result in JSCompilationUnit::handleSemanticProblemsRequest not caching any abcBytes for
// // handleABCBytesRequest. The net result is that JSGenerator.generate() will be called again in handleABCBytesRequest.
// // This mechanic will ensure selective two-pass compilation.
// if (result.getProblems().length == 0)
// {
// m_needsSecondPass = false;
// m_abcBytes = _handleABCBytesRequest(Operation.GET_SEMANTIC_PROBLEMS);
// if (m_needsSecondPass)
// m_abcBytes = null;
// }
return result;
}
public Boolean addDependency(String className, DependencyType dt)
{
// if (JSGeneratingReducer.isReservedDataType(className))
// return false;
//
// final ICompilationUnit fromCU = this;
// final CompilerProject compilerProject = this.getProject();
// final ASProjectScope projectScope = compilerProject.getScope();
//
// final IDefinition classDef = projectScope.findDefinitionByName(className);
// if (classDef == null)
// return false;
//
// final ICompilationUnit toCU = projectScope.getCompilationUnitForDefinition(classDef);
// if (fromCU == toCU)
// return false;
//
// // sharedData.verboseMessage( "Adding dependency: " + className );
// compilerProject.addDependency(fromCU, toCU, dt);
return true;
}
@Override
public void startBuildAsync(TargetType targetType)
{
// super.startBuildAsync(targetType);
getSyntaxTreeRequest();
getFileScopeRequest();
getOutgoingDependenciesRequest();
// // scanning and code generating phases need to be separated
// // in order to create two distinct passes for m_needSecondPass.
// if (m_inCodeGen)
// {
// getABCBytesRequest();
// getSWFTagsRequest();
// }
}
@Override
public void waitForBuildFinish(final Collection<ICompilerProblem> problems,
TargetType targetType) throws InterruptedException
{
inCodeGen = true;
super.waitForBuildFinish(problems, targetType);
inCodeGen = false;
}
}