diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/ProtoOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/ProtoOutputFormatterCallback.java index c9b63cd4881147..4d1b1ed927566d 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/cquery/ProtoOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/ProtoOutputFormatterCallback.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.AnalysisProtosV2.CqueryResult; import com.google.devtools.build.lib.analysis.AnalysisProtosV2.CqueryResultOrBuilder; import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; @@ -56,6 +57,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; /** Proto output formatter for cquery results. */ class ProtoOutputFormatterCallback extends CqueryThreadsafeCallback { @@ -80,11 +82,24 @@ public String formatName() { private static class ConfigurationCache { private final Map cache = new HashMap<>(); + private final Function configurationGetter; + + private ConfigurationCache( + Function configurationGetter) { + this.configurationGetter = configurationGetter; + } public int getId(BuildConfigurationEvent buildConfigurationEvent) { return cache.computeIfAbsent(buildConfigurationEvent, event -> cache.size() + 1); } + public int getId(BuildOptions options) { + BuildConfigurationValue configurationValue = + configurationGetter.apply(BuildConfigurationKey.create(options)); + BuildConfigurationEvent buildConfigurationEvent = configurationValue.toBuildEvent(); + return getId(buildConfigurationEvent); + } + public ImmutableList getConfigurations() { return cache.entrySet().stream() .map( @@ -110,7 +125,8 @@ public ImmutableList getConfigurations() { private final OutputType outputType; private final AspectResolver resolver; private final SkyframeExecutor skyframeExecutor; - private final ConfigurationCache configurationCache = new ConfigurationCache(); + private final ConfigurationCache configurationCache = + new ConfigurationCache(this::getConfiguration); private final JsonFormat.Printer jsonPrinter = JsonFormat.printer(); private final RuleClassProvider ruleClassProvider; @@ -261,9 +277,7 @@ public void processOutput(Iterable partialResult) .setLabel(labelPrinter.toString(resolvedTransition.label()))); } else { for (BuildOptions options : resolvedTransition.options()) { - BuildConfigurationEvent buildConfigurationEvent = - getConfiguration(BuildConfigurationKey.create(options)).toBuildEvent(); - int configurationId = configurationCache.getId(buildConfigurationEvent); + int configurationId = configurationCache.getId(options); targetBuilder .getRuleBuilder()