Well, a generator has to keep it's own state anyway, in practice. In
the case of AbstractClientBundleGenerator, it actually creates a
ResourceContext and passes that around, along with the GeneratorContext
(this was before any IncrementalGenerator enhancements). In the case of
RPC, there are 2 SerializableTypeOracleBuilders and the GeneratorContext
that get passed around.
I'm not sure, it sounds like you are asking to have a generic
functionality for the GeneratorContext, so generators can park data
there as needed (not really specific to IncrementalGenerators). What
would the semantics be, would it always get added to the cache in
entirety, or is there a separate api for saving data for current state
and another for specifically placing data that needs to be cached? Is
it cleared when each new generator invocation occurs?
Since this change is not attempting to modify how the framework behaves
with respect to legacy generators, I'd rather not invent api in this
patch that's not related to the task at hand.
Using your example, before any IncrementalGenerator work, both
ClientBundle and RPC look similar to your first example (e.g. there's
both a GeneratorContext and helperCachedData passed around everywhere).
The only change I've done is to add a way (without modifying current
generators), to prepare extra data for subsequent cache reuse checking.
In fact, the client data stored for cache reuse checking is generally
newly prepared data, not really needed unless caching is enabled. So,
the way things work now, are very similar to the current state, but with
cache use support added at the beginning (to check reusability) and at
the end (to prepare and remember data for future checking). Like so:
generateIncrementally(TreeLogger logger, GeneratorContext context,
String
typeName) {
if (checkCacheReusability(context))
return new RebindResult(RebindMode.USE_CACHE,...)
// this part is no different for non-incremental generators
MyGeneratorStateClass generatorState;
new HelperOne(context, generatorState).run();
new HelperTwo(context, generatorState).run();
if (canBeCacheable(context)) {
// possibly expensive task
PreparedClientData pcd = prepareClientData(context, helperData);
RebindResult result = new RebindResult(USE_WHATEVER, typeName +
"Impl");
result.putClientData("pcd", pcd);
return result;
} else {
// no need to prepare any client data
return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING,...);
}
}
http://gwt-code-reviews.appspot.com/1468804/
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors