Similar to TargetMarkerValue, have TargetPatternValue *not* embed Targets.
[]TESTED: See
--
MOS_MIGRATED_REVID=91816612
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 7a29564..ebc2c96 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.cmdline.TargetPattern;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.graph.Digraph;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.Package;
@@ -149,6 +150,7 @@
return allowedLabels;
}
+ @Override
public Collection<Target> getFwdDeps(Target target) {
Collection<Target> unfilteredDeps = getRawFwdDeps(target);
if (!(target instanceof Rule)) {
@@ -164,6 +166,7 @@
});
}
+ @Override
public Collection<Target> getReverseDeps(final Target target) {
return Collections2.filter(getRawReverseDeps(target), new Predicate<Target>() {
@Override
@@ -314,8 +317,21 @@
}
}
+ private static Target getExistingTarget(Label label,
+ GraphBackedRecursivePackageProvider provider) {
+ StoredEventHandler handler = new StoredEventHandler();
+ try {
+ return provider.getTarget(handler, label);
+ } catch (NoSuchThingException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
protected Map<String, ResolvedTargets<Target>> preloadOrThrow(QueryExpression caller,
Collection<String> patterns) throws QueryException, TargetParsingException {
+ GraphBackedRecursivePackageProvider provider =
+ new GraphBackedRecursivePackageProvider(graph);
Map<String, ResolvedTargets<Target>> result = Maps.newHashMapWithExpectedSize(patterns.size());
for (String pattern : patterns) {
SkyKey patternKey = TargetPatternValue.key(pattern,
@@ -326,10 +342,17 @@
TargetParsingException targetParsingException = null;
if (graph.exists(patternKey)) {
- // If the graph already contains a value for this target pattern, use it.
+ // The graph already contains a value or exception for this target pattern, so we use it.
TargetPatternValue value = (TargetPatternValue) graph.getValue(patternKey);
if (value != null) {
- result.put(pattern, value.getTargets());
+ ResolvedTargets.Builder<Target> targetsBuilder = ResolvedTargets.builder();
+ for (Label label : value.getTargets().getTargets()) {
+ targetsBuilder.add(getExistingTarget(label, provider));
+ }
+ for (Label label : value.getTargets().getFilteredTargets()) {
+ targetsBuilder.remove(getExistingTarget(label, provider));
+ }
+ result.put(pattern, targetsBuilder.build());
} else {
targetParsingException =
(TargetParsingException)
@@ -339,8 +362,6 @@
// If the graph doesn't contain a value for this target pattern, try to directly evaluate
// it, by making use of packages already present in the graph.
TargetPattern.Parser parser = new TargetPattern.Parser(targetPattern.getOffset());
- GraphBackedRecursivePackageProvider provider =
- new GraphBackedRecursivePackageProvider(graph);
RecursivePackageProviderBackedTargetPatternResolver resolver =
new RecursivePackageProviderBackedTargetPatternResolver(provider, eventHandler,
targetPattern.getPolicy(), pkgPath);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index 09d2ec5..8bccd2d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -19,6 +19,7 @@
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.Artifact;
@@ -78,6 +79,7 @@
import java.nio.channels.ClosedByInterruptException;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -299,6 +301,16 @@
this.env = env;
}
+ private static Target getExistingTarget(Label label,
+ Map<PackageIdentifier, Package> packages) {
+ try {
+ return packages.get(label.getPackageIdentifier()).getTarget(label.getName());
+ } catch (NoSuchTargetException e) {
+ // Unexpected since the label was part of the TargetPatternValue.
+ throw new IllegalStateException(e);
+ }
+ }
+
@Override
public Map<String, ResolvedTargets<Target>> preloadTargetPatterns(EventHandler eventHandler,
Collection<String> patterns,
@@ -308,25 +320,74 @@
boolean ok = true;
Map<String, ResolvedTargets<Target>> preloadedPatterns =
Maps.newHashMapWithExpectedSize(patterns.size());
- Map<SkyKey, String> keys = Maps.newHashMapWithExpectedSize(patterns.size());
+ Map<SkyKey, String> patternKeys = Maps.newHashMapWithExpectedSize(patterns.size());
for (String pattern : patterns) {
checkValidPatternType(pattern);
- keys.put(TargetPatternValue.key(pattern, FilteringPolicies.NO_FILTER, ""), pattern);
+ patternKeys.put(TargetPatternValue.key(pattern, FilteringPolicies.NO_FILTER, ""), pattern);
}
+ Set<SkyKey> packageKeys = new HashSet<>();
+ Map<String, ResolvedTargets<Label>> resolvedLabelsMap =
+ Maps.newHashMapWithExpectedSize(patterns.size());
synchronized (this) {
for (Map.Entry<SkyKey, ValueOrException<TargetParsingException>> entry :
- env.getValuesOrThrow(keys.keySet(), TargetParsingException.class).entrySet()) {
+ env.getValuesOrThrow(patternKeys.keySet(), TargetParsingException.class).entrySet()) {
TargetPatternValue patternValue = (TargetPatternValue) entry.getValue().get();
if (patternValue == null) {
ok = false;
} else {
- preloadedPatterns.put(keys.get(entry.getKey()), patternValue.getTargets());
+ ResolvedTargets<Label> resolvedLabels = patternValue.getTargets();
+ resolvedLabelsMap.put(patternKeys.get(entry.getKey()), resolvedLabels);
+ for (Label label
+ : Iterables.concat(resolvedLabels.getTargets(),
+ resolvedLabels.getFilteredTargets())) {
+ packageKeys.add(PackageValue.key(label.getPackageIdentifier()));
+ }
}
}
}
if (!ok) {
throw new SkyframeRestartQueryException();
}
+ Map<PackageIdentifier, Package> packages =
+ Maps.newHashMapWithExpectedSize(packageKeys.size());
+ synchronized (this) {
+ for (Map.Entry<SkyKey, ValueOrException<NoSuchPackageException>> entry :
+ env.getValuesOrThrow(packageKeys, NoSuchPackageException.class).entrySet()) {
+ PackageIdentifier pkgName = (PackageIdentifier) entry.getKey().argument();
+ Package pkg = null;
+ try {
+ PackageValue packageValue = (PackageValue) entry.getValue().get();
+ if (packageValue == null) {
+ ok = false;
+ continue;
+ }
+ pkg = packageValue.getPackage();
+ } catch (NoSuchPackageException nspe) {
+ if (nspe.getPackage() != null) {
+ pkg = nspe.getPackage();
+ } else {
+ continue;
+ }
+ }
+ Preconditions.checkNotNull(pkg, pkgName);
+ packages.put(pkgName, pkg);
+ }
+ }
+ if (!ok) {
+ throw new SkyframeRestartQueryException();
+ }
+ for (Map.Entry<String, ResolvedTargets<Label>> entry : resolvedLabelsMap.entrySet()) {
+ String pattern = entry.getKey();
+ ResolvedTargets<Label> resolvedLabels = resolvedLabelsMap.get(pattern);
+ ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+ for (Label label : resolvedLabels.getTargets()) {
+ builder.add(getExistingTarget(label, packages));
+ }
+ for (Label label : resolvedLabels.getFilteredTargets()) {
+ builder.remove(getExistingTarget(label, packages));
+ }
+ preloadedPatterns.put(pattern, builder.build());
+ }
return preloadedPatterns;
}
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 fe90910..1ea4c0f 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
@@ -21,9 +21,9 @@
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
-import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.ParseFailureListener;
import com.google.devtools.build.lib.skyframe.PrepareDepsOfPatternsValue.TargetPatternSequence;
+import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -61,7 +61,7 @@
EventHandler eventHandler = env.getListener();
boolean handlerIsParseFailureListener = eventHandler instanceof ParseFailureListener;
- ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+ ResolvedTargets.Builder<Label> builder = ResolvedTargets.builder();
for (SkyKey key : patternSkyKeys) {
try {
// The only exception type throwable by TargetPatternFunction is TargetParsingException.
@@ -69,7 +69,7 @@
// TargetParsingException when get is called.
TargetPatternValue resultValue = Preconditions.checkNotNull(
(TargetPatternValue) targetPatternValuesByKey.get(key).get());
- ResolvedTargets<Target> results = resultValue.getTargets();
+ ResolvedTargets<Label> results = resultValue.getTargets();
if (((TargetPatternValue.TargetPattern) key.argument()).isNegative()) {
builder.filter(Predicates.not(Predicates.in(results.getTargets())));
} else {
@@ -80,11 +80,11 @@
handleTargetParsingException(eventHandler, handlerIsParseFailureListener, key, e);
}
}
- ResolvedTargets<Target> resolvedTargets = builder.build();
+ ResolvedTargets<Label> resolvedTargets = builder.build();
List<SkyKey> targetKeys = new ArrayList<>();
- for (Target target : resolvedTargets.getTargets()) {
- targetKeys.add(TransitiveTargetValue.key(target.getLabel()));
+ for (Label target : resolvedTargets.getTargets()) {
+ targetKeys.add(TransitiveTargetValue.key(target));
}
// TransitiveTargetFunction can produce exceptions of types NoSuchPackageException and
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
index 8b8209a..0ea6fc2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
@@ -22,18 +22,26 @@
import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.NoSuchPackageException;
+import com.google.devtools.build.lib.packages.NoSuchTargetException;
+import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.packages.PackageIdentifier;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
import com.google.devtools.build.lib.pkgcache.ParseFailureListener;
import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
+import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.ErrorInfo;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.WalkableGraph;
import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Skyframe-based target pattern parsing.
@@ -95,6 +103,36 @@
SkyframeExecutor.DEFAULT_THREAD_COUNT, keepGoing, eventHandler);
}
+ private static Map<PackageIdentifier, Package> getPackages(
+ Set<PackageIdentifier> packagesToRequest, WalkableGraph walkableGraph) {
+ Map<PackageIdentifier, Package> packages =
+ Maps.newHashMapWithExpectedSize(packagesToRequest.size());
+ for (PackageIdentifier pkgIdentifier : packagesToRequest) {
+ SkyKey key = PackageValue.key(pkgIdentifier);
+ Package pkg = null;
+ NoSuchPackageException nspe = (NoSuchPackageException) walkableGraph.getException(key);
+ if (nspe != null) {
+ pkg = nspe.getPackage();
+ } else {
+ pkg = ((PackageValue) walkableGraph.getValue(key)).getPackage();
+ }
+ // Unexpected since the label was part of the TargetPatternValue.
+ Preconditions.checkNotNull(pkg, pkgIdentifier);
+ packages.put(pkgIdentifier, pkg);
+ }
+ return packages;
+ }
+
+ private static Target getExistingTarget(Label label, Map<PackageIdentifier, Package> packages) {
+ Package pkg = Preconditions.checkNotNull(packages.get(label.getPackageIdentifier()), label);
+ try {
+ return pkg.getTarget(label.getName());
+ } catch (NoSuchTargetException e) {
+ // Unexpected since the label was part of the TargetPatternValue.
+ throw new IllegalStateException(e);
+ }
+ }
+
ResolvedTargets<Target> parseTargetPatternKeys(Iterable<SkyKey> patternSkyKeys, int numThreads,
boolean keepGoing, EventHandler eventHandler)
throws InterruptedException, TargetParsingException {
@@ -102,15 +140,15 @@
skyframeExecutor.targetPatterns(patternSkyKeys, numThreads, keepGoing, eventHandler);
String errorMessage = null;
- ResolvedTargets.Builder<Target> builder = ResolvedTargets.builder();
+ ResolvedTargets.Builder<Label> resolvedLabelsBuilder = ResolvedTargets.builder();
for (SkyKey key : patternSkyKeys) {
TargetPatternValue resultValue = result.get(key);
if (resultValue != null) {
- ResolvedTargets<Target> results = resultValue.getTargets();
+ ResolvedTargets<Label> results = resultValue.getTargets();
if (((TargetPatternValue.TargetPattern) key.argument()).isNegative()) {
- builder.filter(Predicates.not(Predicates.in(results.getTargets())));
+ resolvedLabelsBuilder.filter(Predicates.not(Predicates.in(results.getTargets())));
} else {
- builder.merge(results);
+ resolvedLabelsBuilder.merge(results);
}
} else {
TargetPatternValue.TargetPattern pattern =
@@ -133,7 +171,7 @@
if (keepGoing) {
eventHandler.handle(Event.error("Skipping '" + rawPattern + "': " + errorMessage));
}
- builder.setError();
+ resolvedLabelsBuilder.setError();
if (eventHandler instanceof ParseFailureListener) {
ParseFailureListener parseListener = (ParseFailureListener) eventHandler;
@@ -146,6 +184,24 @@
Preconditions.checkState(errorMessage != null, "unexpected errors: %s", result.errorMap());
throw new TargetParsingException(errorMessage);
}
- return builder.build();
+ ResolvedTargets<Label> resolvedLabels = resolvedLabelsBuilder.build();
+ Set<PackageIdentifier> packagesToRequest = new HashSet<>();
+ for (Label label
+ : Iterables.concat(resolvedLabels.getTargets(), resolvedLabels.getFilteredTargets())) {
+ packagesToRequest.add(label.getPackageIdentifier());
+ }
+ WalkableGraph walkableGraph = Preconditions.checkNotNull(result.getWalkableGraph(), result);
+ Map<PackageIdentifier, Package> packages = getPackages(packagesToRequest, walkableGraph);
+ ResolvedTargets.Builder<Target> resolvedTargetsBuilder = ResolvedTargets.builder();
+ if (resolvedLabels.hasError()) {
+ resolvedTargetsBuilder.setError();
+ }
+ for (Label label : resolvedLabels.getTargets()) {
+ resolvedTargetsBuilder.add(getExistingTarget(label, packages));
+ }
+ for (Label label : resolvedLabels.getFilteredTargets()) {
+ resolvedTargetsBuilder.remove(getExistingTarget(label, packages));
+ }
+ return resolvedTargetsBuilder.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
index 9322998..1f4a91e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -13,10 +13,14 @@
// limitations under the License.
package com.google.devtools.build.lib.skyframe;
+import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.cmdline.ResolvedTargets;
import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.cmdline.TargetPattern;
+import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.skyframe.EnvironmentBackedRecursivePackageProvider.MissingDepException;
+import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyKey;
@@ -44,6 +48,7 @@
TargetPatternValue.TargetPattern patternKey =
((TargetPatternValue.TargetPattern) key.argument());
TargetPattern.Parser parser = new TargetPattern.Parser(patternKey.getOffset());
+ ResolvedTargets<Target> resolvedTargets = null;
try {
EnvironmentBackedRecursivePackageProvider provider =
new EnvironmentBackedRecursivePackageProvider(env);
@@ -51,7 +56,7 @@
new RecursivePackageProviderBackedTargetPatternResolver(provider, env.getListener(),
patternKey.getPolicy(), pkgPath.get());
TargetPattern resolvedPattern = parser.parse(patternKey.getPattern());
- return new TargetPatternValue(resolvedPattern.eval(resolver));
+ resolvedTargets = resolvedPattern.eval(resolver);
} catch (TargetParsingException e) {
throw new TargetPatternFunctionException(e);
} catch (MissingDepException e) {
@@ -62,6 +67,15 @@
// implementations that are unconcerned with MissingDepExceptions.
return null;
}
+ Preconditions.checkNotNull(resolvedTargets, key);
+ ResolvedTargets.Builder<Label> resolvedLabelsBuilder = ResolvedTargets.builder();
+ for (Target target : resolvedTargets.getTargets()) {
+ resolvedLabelsBuilder.add(target.getLabel());
+ }
+ for (Target target : resolvedTargets.getFilteredTargets()) {
+ resolvedLabelsBuilder.remove(target.getLabel());
+ }
+ return new TargetPatternValue(resolvedLabelsBuilder.build());
}
@Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
index c97194f..50cdc9b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
@@ -19,12 +19,10 @@
import com.google.devtools.build.lib.cmdline.ResolvedTargets.Builder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.packages.NoSuchTargetException;
-import com.google.devtools.build.lib.packages.Package;
-import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.syntax.Label.SyntaxException;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -34,12 +32,8 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
-import java.util.Set;
/**
* A value referring to a computed set of resolved targets. This is used for the results of target
@@ -49,62 +43,50 @@
@ThreadSafe
public final class TargetPatternValue implements SkyValue {
- private ResolvedTargets<Target> targets;
+ private ResolvedTargets<Label> targets;
- TargetPatternValue(ResolvedTargets<Target> targets) {
+ TargetPatternValue(ResolvedTargets<Label> targets) {
this.targets = Preconditions.checkNotNull(targets);
}
private void writeObject(ObjectOutputStream out) throws IOException {
- Set<Package> packages = new LinkedHashSet<>();
List<String> ts = new ArrayList<>();
List<String> filteredTs = new ArrayList<>();
- for (Target target : targets.getTargets()) {
- packages.add(target.getPackage());
- ts.add(target.getLabel().toString());
+ for (Label target : targets.getTargets()) {
+ ts.add(target.toString());
}
- for (Target target : targets.getFilteredTargets()) {
- packages.add(target.getPackage());
- filteredTs.add(target.getLabel().toString());
+ for (Label target : targets.getFilteredTargets()) {
+ filteredTs.add(target.toString());
}
- out.writeObject(packages);
out.writeObject(ts);
out.writeObject(filteredTs);
}
+ private Label labelFromString(String labelString) {
+ try {
+ return Label.parseAbsolute(labelString);
+ } catch (SyntaxException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
@SuppressWarnings("unchecked")
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- Set<Package> packages = (Set<Package>) in.readObject();
List<String> ts = (List<String>) in.readObject();
List<String> filteredTs = (List<String>) in.readObject();
- Map<String, Package> packageMap = new HashMap<>();
- for (Package p : packages) {
- packageMap.put(p.getName(), p);
- }
-
- Builder<Target> builder = ResolvedTargets.<Target>builder();
+ Builder<Label> builder = ResolvedTargets.<Label>builder();
for (String labelString : ts) {
- builder.add(lookupTarget(packageMap, labelString));
+ builder.add(labelFromString(labelString));
}
for (String labelString : filteredTs) {
- builder.remove(lookupTarget(packageMap, labelString));
+ builder.remove(labelFromString(labelString));
}
this.targets = builder.build();
}
- private static Target lookupTarget(Map<String, Package> packageMap, String labelString) {
- Label label = Label.parseAbsoluteUnchecked(labelString);
- Package p = packageMap.get(label.getPackageName());
- try {
- return p.getTarget(label.getName());
- } catch (NoSuchTargetException e) {
- throw new IllegalStateException(e);
- }
- }
-
@SuppressWarnings("unused")
private void readObjectNoData() {
throw new IllegalStateException();
@@ -148,7 +130,7 @@
return keys;
}
- public ResolvedTargets<Target> getTargets() {
+ public ResolvedTargets<Label> getTargets() {
return targets;
}