blob: f4fb843d64e007ae9e6087dbeb7f80e30c0750c8 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed 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 com.google.gwt.core.ext;
import com.google.gwt.core.ext.linker.Artifact;
import com.google.gwt.core.ext.linker.GeneratedResource;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.resource.ResourceOracle;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* Provides metadata to deferred binding generators.
*/
public interface GeneratorContext {
/**
* Checks whether a rebind rule is available for a given sourceTypeName, such
* as can appear in a replace-with or generate-with rule.
*
* @param sourceTypeName the name of a type to check for rebind rule
* availability.
* @return true if a rebind rule is available
*/
boolean checkRebindRuleAvailable(String sourceTypeName);
/**
* Commits source generation begun with
* {@link #tryCreate(TreeLogger, String, String)}.
*/
void commit(TreeLogger logger, PrintWriter pw);
/**
* Add an Artifact to the {@link com.google.gwt.core.ext.linker.ArtifactSet}
* that will be presented to the {@link Linker} chain at the end of the
* compilation cycle. Custom sub-classes of Artifact can be used to write
* cooperating Generator and Linker combinations. This method is semantically
* equivalent to calling
* {@link com.google.gwt.core.ext.linker.ArtifactSet#replace(Artifact)} if an
* equivalent Artifact had previously been committed.
*
* @param logger a logger; normally the logger passed into the currently
* invoked generator or a branch thereof
* @param artifact the Artifact to provide to the Linker chain.
*/
void commitArtifact(TreeLogger logger, Artifact<?> artifact) throws UnableToCompleteException;
/**
* Commits resource generation begun with
* {@link #tryCreateResource(TreeLogger, String)}.
*
* @return the GeneratedResource that was created as a result of committing
* the OutputStream.
* @throws UnableToCompleteException if the resource cannot be written to
* disk, if the specified stream is unknown, or if the stream has
* already been committed
*/
GeneratedResource commitResource(TreeLogger logger, OutputStream os)
throws UnableToCompleteException;
/**
* Get the cached rebind result that has been provided to the context, if
* available. The provided result will be the most recent previously generated
* result for the currently active rebind rule and requested type name.
*
* @return A {@link CachedGeneratorResult} object, if one has been provided to
* the context. Null is returned if there is no previous result
* available.
*/
CachedGeneratorResult getCachedGeneratorResult();
/**
* Gets the property oracle for the current generator context. Generators can
* use the property oracle to query deferred binding properties.
*/
PropertyOracle getPropertyOracle();
/**
* Returns a resource oracle containing all resources that are mapped into the
* module's source (or super-source) paths. Conceptually, this resource oracle
* exposes resources which are "siblings" to GWT-compatible Java classes. For
* example, if the module includes <code>com.google.gwt.core.client</code> as
* a source package, then a resource at
* <code>com/google/gwt/core/client/Foo.properties</code> would be exposed by
* this resource oracle.
*/
ResourceOracle getResourcesOracle();
/**
* Gets the type oracle for the current generator context. Generators can use
* the type oracle to ask questions about the entire translatable code base.
*
* @return a TypeOracle over all the relevant translatable compilation units
* in the source path
*/
TypeOracle getTypeOracle();
/**
* Check whether generator result caching is currently enabled.
*/
boolean isGeneratorResultCachingEnabled();
/**
* Returns true if generators are being run to produce code for a production
* compile. Returns false for dev mode. Generators can use this information to
* produce code optimized for the target.
*/
boolean isProdMode();
/**
* Attempts to get a <code>PrintWriter</code> so that the caller can generate
* the source code for the named type. If the named types already exists,
* <code>null</code> is returned to indicate that no work needs to be done.
* The file is not committed until {@link #commit(TreeLogger, PrintWriter)} is
* called.
*
* @param logger a logger; normally the logger passed into the currently
* invoked generator, or a branch thereof
* @param packageName the name of the package to which the create type belongs
* @param simpleName the unqualified source name of the type being generated
* @return <code>null</code> if the package and class already exists,
* otherwise a <code>PrintWriter</code> is returned.
*/
PrintWriter tryCreate(TreeLogger logger, String packageName, String simpleName);
/**
* Attempts to get an <code>OutputStream</code> so that the caller can write
* file contents into the named file underneath the compilation output
* directory. The file is not committed until
* {@link #commitResource(TreeLogger, OutputStream)} is called.
*
* @param logger a logger; normally the logger passed into the currently
* invoked generator, or a branch thereof
* @param partialPath the name of the file whose contents are to be written;
* the name can include subdirectories separated by forward slashes
* ('/')
* @return an <code>OutputStream</code> into which file contents can be
* written, or <code>null</code> if a resource by that name is already
* pending or already exists
* @throws UnableToCompleteException if the resource could not be initialized
* for some reason, such as if the specified partial path is invalid
*/
OutputStream tryCreateResource(TreeLogger logger, String partialPath)
throws UnableToCompleteException;
/**
* Mark a type to be reused from the generator result cache, if available.
* Calling this method with a successful response indicates that the calling
* generator will not re-generate this type. A cached version of this type
* will be added to the context once the calling generator returns from
* {@link IncrementalGenerator#generateIncrementally}, with a result
* containing {@link RebindMode#USE_PARTIAL_CACHED}.
*
* @param typeName the fully qualified source name of a type.
* @return true if the requested type is available from the generator result
* cache, false otherwise.
*/
boolean tryReuseTypeFromCache(String typeName);
}