/* * * 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(); }