ModuleDef's resource oracles really should be lazy. http://gwt-code-reviews.appspot.com/1264801/show Review by: zundel@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9509 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java index 6fccfee..5d07787 100644 --- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java +++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
@@ -111,6 +111,8 @@ */ private String nameOverride; + private boolean needsRefresh; + private final Properties properties = new Properties(); private PathPrefixSet publicPrefixSet = new PathPrefixSet(); @@ -196,7 +198,7 @@ * method, the ResourceOraclewill be empty and unusable. Calling * {@link #refresh(TreeLogger)} will restore them. */ - public void clear() { + public synchronized void clear() { if (lazySourceOracle != null) { lazySourceOracle.clear(); } @@ -241,6 +243,7 @@ } public synchronized Resource findPublicFile(String partialPath) { + doRefresh(TreeLogger.NULL); return lazyPublicOracle.getResourceMap().get(partialPath); } @@ -272,6 +275,7 @@ * @return the resource for the requested source file */ public synchronized Resource findSourceFile(String partialPath) { + doRefresh(TreeLogger.NULL); return lazySourceOracle.getResourceMap().get(partialPath); } @@ -294,6 +298,7 @@ } public String[] getAllPublicFiles() { + doRefresh(TreeLogger.NULL); return lazyPublicOracle.getPathNames().toArray(Empty.STRINGS); } @@ -302,6 +307,7 @@ * oracle has been initialized. */ public String[] getAllSourceFiles() { + doRefresh(TreeLogger.NULL); return lazySourceOracle.getPathNames().toArray(Empty.STRINGS); } @@ -315,6 +321,7 @@ public synchronized CompilationState getCompilationState(TreeLogger logger) throws UnableToCompleteException { + doRefresh(TreeLogger.NULL); CompilationState compilationState = CompilationStateBuilder.buildFrom( logger, lazySourceOracle.getResources()); checkForSeedTypes(logger, compilationState); @@ -360,6 +367,8 @@ } lazyResourcesOracle.setPathPrefixes(newPathPrefixes); ResourceOracleImpl.refresh(TreeLogger.NULL, lazyResourcesOracle); + } else { + doRefresh(TreeLogger.NULL); } return lazyResourcesOracle; } @@ -416,18 +425,7 @@ } public synchronized void refresh(TreeLogger logger) { - Event moduleDefEvent = SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "refresh", "module", getName()); - logger = logger.branch(TreeLogger.DEBUG, "Refreshing module '" + getName() - + "'"); - - // Refresh resource oracles. - if (lazyResourcesOracle == null) { - ResourceOracleImpl.refresh(logger, lazyPublicOracle, lazySourceOracle); - } else { - ResourceOracleImpl.refresh( - logger, lazyPublicOracle, lazySourceOracle, lazyResourcesOracle); - } - moduleDefEvent.end(); + needsRefresh = true; } /** @@ -483,23 +481,15 @@ // Create the public path. TreeLogger branch = Messages.PUBLIC_PATH_LOCATIONS.branch(logger, null); - // lazyPublicOracle = publicPathEntries.create(branch); - if (lazyPublicOracle == null) { - lazyPublicOracle = new ResourceOracleImpl(branch); - lazyPublicOracle.setPathPrefixes(publicPrefixSet); - } + lazyPublicOracle = new ResourceOracleImpl(branch); + lazyPublicOracle.setPathPrefixes(publicPrefixSet); // Create the source path. branch = Messages.SOURCE_PATH_LOCATIONS.branch(logger, null); lazySourceOracle = new ResourceOracleImpl(branch); lazySourceOracle.setPathPrefixes(sourcePrefixSet); - ResourceOracleImpl.refresh(logger, lazyPublicOracle, lazySourceOracle); - if (lazySourceOracle.getResources().isEmpty()) { - branch.log(TreeLogger.WARN, - "No source path entries; expect subsequent failures", null); - } - + needsRefresh = true; moduleDefNormalize.end(); } @@ -528,4 +518,24 @@ throw new UnableToCompleteException(); } } + + private synchronized void doRefresh(TreeLogger logger) { + if (!needsRefresh) { + return; + } + Event moduleDefEvent = SpeedTracerLogger.start( + CompilerEventType.MODULE_DEF, "phase", "refresh", "module", getName()); + logger = logger.branch(TreeLogger.DEBUG, "Refreshing module '" + getName() + + "'"); + + // Refresh resource oracles. + if (lazyResourcesOracle == null) { + ResourceOracleImpl.refresh(logger, lazyPublicOracle, lazySourceOracle); + } else { + ResourceOracleImpl.refresh(logger, lazyPublicOracle, lazySourceOracle, + lazyResourcesOracle); + } + moduleDefEvent.end(); + needsRefresh = false; + } }