blob: 587ab4503d96c7a9dfbf3b885b2fcf97483c8b31 [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.units;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.flex.compiler.common.IDefinitionPriority;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.internal.targets.Target;
import org.apache.flex.compiler.internal.units.CompilationUnitBase;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.targets.ITarget.TargetType;
import org.apache.flex.compiler.units.requests.IABCBytesRequestResult;
import org.apache.flex.compiler.units.requests.IFileScopeRequestResult;
import org.apache.flex.compiler.units.requests.IOutgoingDependenciesRequestResult;
import org.apache.flex.compiler.units.requests.IRequest;
import org.apache.flex.compiler.units.requests.ISWFTagsRequestResult;
import org.apache.flex.compiler.units.requests.ISyntaxTreeRequestResult;
/**
* A unit of compilation. Implementations provide methods to request definitions
* ( getFileScopeRequest ), semantic errors/warnings (
* getOutgoingDependenciesRequest ), abc bytes ( getABCBytesRequest ), and SWF tags
* ( getSWFTagsRequest ). Implementations of this interface are the main means
* that AS3, MXML, and associated source files are converted to bytes in SWF.
*/
public interface ICompilationUnit
{
/**
* An enumeration with an entry for each ICompilationUnit operation. Used in
* tracking which operation results of another ICompilaitonUnit that an
* ICompilationUnit depends on.
*/
enum Operation
{
GET_SYNTAX_TREE,
GET_FILESCOPE,
GET_SEMANTIC_PROBLEMS,
GET_ABC_BYTES,
GET_SWF_TAGS,
INVALIDATE_CU;
Operation()
{
assert ordinal() < 31 : "We should not have more than 8 operations, let alone 31!";
mask = 1 << ordinal();
}
/**
* This mask is used by {@link CompilationUnitBase} to update
* a {@link AtomicInteger} that keeps track of which operations have
* been completed.
*/
public final int mask;
}
/**
* An enumeration with an entry for each ICompilationUnit source type.
*/
enum UnitType
{
AS_UNIT,
ABC_UNIT,
FXG_UNIT,
MXML_UNIT,
CSS_UNIT,
SWC_UNIT,
EMBED_UNIT,
RESOURCE_UNIT
}
/**
* @return The project that contains this ICompilationUnit.
*/
ICompilerProject getProject();
/**
* Gets the request object from which the caller can extract the syntax tree
* and any source file parsing {@link ICompilerProblem}'s
* for this {@link ICompilationUnit}. Implementations may update the dependency
* graph in the project as a side
* affect of this operation.
*
* @return The request object for the getFileScope operation.
*/
IRequest<ISyntaxTreeRequestResult, ICompilationUnit> getSyntaxTreeRequest();
/**
* Gets the request object from which the caller can extract the root scope,
* AST, and any parsing ICompilerProblems, for the CompilationUnit.
* Implementations may update the dependency graph in the project as a side
* affect of this operation.
*
* @return The request object for the getFileScope operation.
*/
IRequest<IFileScopeRequestResult, ICompilationUnit> getFileScopeRequest();
/**
* Gets the request object from which the caller cause the dependency graph to be updated
* with all the dependencies from this compilation unit.
*
* @return The request object for the getFileScope operation.
*/
IRequest<IOutgoingDependenciesRequestResult, ICompilationUnit> getOutgoingDependenciesRequest ();
/**
* Gets the request object from which the caller can extract the abc bytes
* generated for this ICompilationUnit. Implementations may update the
* dependency graph in the project as a side affect of this operation.
*
* @return The request object for the getFileScope operation.
*/
IRequest<IABCBytesRequestResult, ICompilationUnit> getABCBytesRequest();
/**
* Gets the request object with which the caller can add the SWF tags
* generated for this ICompilationUnit to a ISWF. Implementations may update
* the dependency graph in the project as a side affect of this operation.
*
* @return The request object for the getFileScope operation.
*/
IRequest<ISWFTagsRequestResult, ICompilationUnit> getSWFTagsRequest();
/**
* @return The identifier names defined by the compilation unit
* @throws InterruptedException
*/
List<String> getShortNames() throws InterruptedException;
/**
* @return The qualified names defined by the compilation unit
* @throws InterruptedException
*/
List<String> getQualifiedNames() throws InterruptedException;
/**
* Gets a string that is unique to the compilation unit instance and can be
* used to produce an ordering of compilation units that is stable across
* different compilation runs.
*
* Note that is is critical that everyone who implements this interface
* implements this method correctly. If not, the compiler will act in
* a non-deterministic way.
*
* Also, note that this is the String that will be written to the link report as
* the name of this compilation unit.
*
* @return The unique name string for the compilation unit.
*/
String getName();
/**
* Gets the path to the compilation unit instance. The string is unique to
* the compilation unit instance. This string will also be used in reporting
* errors.
*
* @return The absolute path for the compilation unit.
*/
String getAbsoluteFilename();
/**
* @return List of definition promises
*/
List<IDefinition> getDefinitionPromises();
/**
* @return the compilation unit type
*/
UnitType getCompilationUnitType();
/**
* Removes all data created during a compile Clients should not call this
* method directly, as it can potentially leave the ICompilationUnit in an
* invalid state. Read the CompilerProject.clean implementation for more
* details.
*
* @param invalidatedSWCFiles Map of SWC filenames and depending projects
* which have been invalidated by this call
* @param cusToUpdate {@link Map} from {@link ICompilerProject} to
* {@link Set} of {@link ICompilationUnit}s in the project whose externally
* visible symbols need to be re-registered with the symbol table of the
* containing {@link ICompilerProject} when cleaning is complete.
* @param clearFileScope Whether to clear the file scope
* @return whether an invalidation was done
*/
boolean clean(Map<ICompilerProject, Set<File>> invalidatedSWCFiles, Map<ICompilerProject, Set<ICompilationUnit>> cusToUpdate, boolean clearFileScope);
/**
* Gets the definition priority for definitions defined by the compilation
* unit. The "priority" of a definition determines whether that definition
* shadows definitions from other compilation units that have the same
* qname.
*
* @return The definition priority for definitions defined by the compilation
* unit.
*/
IDefinitionPriority getDefinitionPriority();
/**
* Called by {@link ICompilerProject}'s when an {@link ICompilationUnit}
* is removed from a project. Implementations should clear an references
* to the containing project when this method is called. After this
* method is called {@link #getProject()} should return null.
*/
void clearProject();
/**
* Wait till the compilation unit finishes building, and collect compiler
* problems. After calling this method, this compilation unit will be in a
* fully compiled state.
*
* @see ICompilationUnit#startBuildAsync
* @param problems Problems from executing the requests.
* @param targetType type of the active {@link Target}
* @throws InterruptedException Concurrency error.
*/
void waitForBuildFinish(Collection<ICompilerProblem> problems, TargetType targetType) throws InterruptedException;
/**
* This method starts to build the compilation unit asynchronously. It kicks
* off all the request methods on the compilation unit.
*
* @param targetType type of the active {@link Target}
*/
void startBuildAsync(TargetType targetType);
/**
* @return true if this {@link ICompilationUnit} does *not*
* put its global definitions in the {@link ICompilerProject}'s
* symbol table, false otherwise.
*/
boolean isInvisible();
/**
* @return A collection of all filenames which are embedded in
* this {@link ICompilationUnit} through Embed metadata. This
* will never return null.
*/
Collection<String> getEmbeddedFilenames();
}