diff options
author | Mark Schaller <mschaller@google.com> | 2015-05-19 21:19:37 +0000 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-05-21 09:46:17 +0000 |
commit | 66b35f3d069a77e5da685099d3ba3c0a0f5e844b (patch) | |
tree | 1970ede6c00b2980f6a11951581f5046073d236d /src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java | |
parent | 87836b4116f78b3c37cb8ed439c14d98193ae9d5 (diff) |
Move target pattern parsing to key construction time
So that a subsequent commit can take advantage of semantic information
known only after target patterns have been parsed, this commit moves
parsing from pattern evaluation time to pattern key construction time.
This leads toward more efficient processing of target patterns in
target pattern sequence evaluation.
--
MOS_MIGRATED_REVID=94025646
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java index bd280dd9cf..6653c48933 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunction.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.events.Event; @@ -24,6 +25,7 @@ import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.pkgcache.ParseFailureListener; import com.google.devtools.build.lib.skyframe.PrepareDepsOfPatternsValue.TargetPatternSequence; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; +import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternSkyKeyOrException; import com.google.devtools.build.lib.syntax.Label; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; @@ -50,20 +52,32 @@ public class PrepareDepsOfPatternsFunction implements SkyFunction { @Nullable @Override public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException { + EventHandler eventHandler = env.getListener(); + boolean handlerIsParseFailureListener = eventHandler instanceof ParseFailureListener; TargetPatternSequence targetPatternSequence = (TargetPatternSequence) skyKey.argument(); - Iterable<SkyKey> patternSkyKeys = TargetPatternValue.keys(targetPatternSequence.getPatterns(), - targetPatternSequence.getPolicy(), targetPatternSequence.getOffset()); + Iterable<TargetPatternSkyKeyOrException> keysMaybe = + TargetPatternValue.keys(targetPatternSequence.getPatterns(), + targetPatternSequence.getPolicy(), targetPatternSequence.getOffset()); + + ImmutableList.Builder<SkyKey> skyKeyBuilder = ImmutableList.builder(); + for (TargetPatternSkyKeyOrException skyKeyOrException : keysMaybe) { + try { + skyKeyBuilder.add(skyKeyOrException.getSkyKey()); + } catch (TargetParsingException e) { + handleTargetParsingException(eventHandler, handlerIsParseFailureListener, + skyKeyOrException.getOriginalPattern(), e); + } + } + ImmutableList<SkyKey> skyKeys = skyKeyBuilder.build(); + Map<SkyKey, ValueOrException<TargetParsingException>> targetPatternValuesByKey = - env.getValuesOrThrow(patternSkyKeys, TargetParsingException.class); + env.getValuesOrThrow(skyKeys, TargetParsingException.class); if (env.valuesMissing()) { return null; } - EventHandler eventHandler = env.getListener(); - boolean handlerIsParseFailureListener = eventHandler instanceof ParseFailureListener; - ResolvedTargets.Builder<Label> builder = ResolvedTargets.builder(); - for (SkyKey key : patternSkyKeys) { + for (SkyKey key : skyKeys) { try { // The only exception type throwable by TargetPatternFunction is TargetParsingException. // Therefore all ValueOrException values in the map will either be non-null or throw @@ -102,13 +116,18 @@ public class PrepareDepsOfPatternsFunction implements SkyFunction { private static void handleTargetParsingException(EventHandler eventHandler, boolean handlerIsParseFailureListener, SkyKey key, TargetParsingException e) { - TargetPatternKey pattern = (TargetPatternKey) key.argument(); - String rawPattern = pattern.getPattern(); + TargetPatternKey patternKey = (TargetPatternKey) key.argument(); + String rawPattern = patternKey.getPattern(); + handleTargetParsingException(eventHandler, handlerIsParseFailureListener, rawPattern, e); + } + + private static void handleTargetParsingException(EventHandler eventHandler, + boolean handlerIsParseFailureListener, String rawPattern, TargetParsingException e) { String errorMessage = e.getMessage(); eventHandler.handle(Event.error("Skipping '" + rawPattern + "': " + errorMessage)); if (handlerIsParseFailureListener) { ParseFailureListener parseListener = (ParseFailureListener) eventHandler; - parseListener.parsingError(rawPattern, errorMessage); + parseListener.parsingError(rawPattern, errorMessage); } } |