From 77a49629255d4e6f749f9082dfcbec5baa870113 Mon Sep 17 00:00:00 2001 From: John Cater Date: Fri, 19 Apr 2019 07:23:33 -0700 Subject: [PATCH] Convert ToolchainResolver to ToolchainResolutionFunction. Part of work on execution transitions, #7935. Closes #8070. PiperOrigin-RevId: 244355735 --- .../analysis/ResolvedToolchainContext.java | 1 + .../build/lib/analysis/ToolchainResolver.java | 1 + .../build/lib/skyframe/AspectFunction.java | 1 - .../skyframe/ConfiguredTargetFunction.java | 1 - .../RegisteredToolchainsCycleReporter.java | 55 +- .../build/lib/skyframe/SkyFunctions.java | 2 + .../build/lib/skyframe/SkyframeExecutor.java | 1 + .../lib/skyframe/ToolchainException.java | 20 + .../skyframe/ToolchainResolutionFunction.java | 513 ++++++++++++++++++ .../UnloadedToolchainContext.java | 57 +- .../ResolvedToolchainContextTest.java | 1 + .../lib/analysis/ToolchainResolverTest.java | 1 + .../analysis/util/BuildViewForTesting.java | 2 +- .../ToolchainResolutionFunctionTest.java | 423 +++++++++++++++ 14 files changed, 1052 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java rename src/main/java/com/google/devtools/build/lib/{analysis => skyframe}/UnloadedToolchainContext.java (53%) create mode 100644 src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java index 0bef37dfa648e3..9a19b105fe3353 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.rules.AliasConfiguredTarget; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData; import com.google.devtools.build.lib.skyframe.ToolchainException; +import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext; import com.google.devtools.build.lib.skylarkbuildapi.ToolchainContextApi; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.skylarkinterface.StarlarkContext; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java index 04e548a82b5f67..4a92d5bea2b738 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java @@ -42,6 +42,7 @@ import com.google.devtools.build.lib.skyframe.SingleToolchainResolutionFunction.NoToolchainFoundException; import com.google.devtools.build.lib.skyframe.SingleToolchainResolutionValue; import com.google.devtools.build.lib.skyframe.ToolchainException; +import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext; import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.ValueOrException2; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index 6dde831d56c641..743c7d29228596 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -32,7 +32,6 @@ import com.google.devtools.build.lib.analysis.ResolvedToolchainContext; import com.google.devtools.build.lib.analysis.TargetAndConfiguration; import com.google.devtools.build.lib.analysis.ToolchainResolver; -import com.google.devtools.build.lib.analysis.UnloadedToolchainContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 5c6481b2fafb56..a26612905a4ab0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -38,7 +38,6 @@ import com.google.devtools.build.lib.analysis.ResolvedToolchainContext; import com.google.devtools.build.lib.analysis.TargetAndConfiguration; import com.google.devtools.build.lib.analysis.ToolchainResolver; -import com.google.devtools.build.lib.analysis.UnloadedToolchainContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsCycleReporter.java index 4bd0451cfcf308..7b4ddd20e87511 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsCycleReporter.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsCycleReporter.java @@ -14,9 +14,13 @@ package com.google.devtools.build.lib.skyframe; +import static java.util.stream.Collectors.joining; + import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.Event; @@ -41,6 +45,15 @@ public class RegisteredToolchainsCycleReporter implements CyclesReporter.SingleC private static final Predicate IS_SINGLE_TOOLCHAIN_RESOLUTION_SKY_KEY = SkyFunctions.isSkyFunction(SkyFunctions.SINGLE_TOOLCHAIN_RESOLUTION); + private static final Predicate IS_TOOLCHAIN_RESOLUTION_SKY_KEY = + SkyFunctions.isSkyFunction(SkyFunctions.TOOLCHAIN_RESOLUTION); + + private static final Predicate IS_TOOLCHAIN_RELATED = + Predicates.or( + IS_REGISTERED_TOOLCHAINS_SKY_KEY, + IS_SINGLE_TOOLCHAIN_RESOLUTION_SKY_KEY, + IS_TOOLCHAIN_RESOLUTION_SKY_KEY); + @Override public boolean maybeReportCycle( SkyKey topLevelKey, @@ -50,9 +63,7 @@ public boolean maybeReportCycle( ImmutableList cycle = cycleInfo.getCycle(); if (alreadyReported) { return true; - } else if (!Iterables.any(cycle, IS_REGISTERED_TOOLCHAINS_SKY_KEY) - || !Iterables.any(cycle, IS_CONFIGURED_TARGET_SKY_KEY) - || !Iterables.any(cycle, IS_SINGLE_TOOLCHAIN_RESOLUTION_SKY_KEY)) { + } else if (!Iterables.any(cycle, IS_TOOLCHAIN_RELATED)) { return false; } @@ -63,24 +74,28 @@ public boolean maybeReportCycle( } Function printer = - new Function() { - @Override - public String apply(SkyKey input) { - if (input.argument() instanceof ConfiguredTargetKey) { - Label label = ((ConfiguredTargetKey) input.argument()).getLabel(); - return label.toString(); - } - if (input.argument() instanceof RegisteredToolchainsValue.Key) { - return "RegisteredToolchains"; - } - if (input.argument() instanceof SingleToolchainResolutionValue.Key) { - Label toolchainType = - ((SingleToolchainResolutionValue.Key) input.argument()).toolchainTypeLabel(); - return String.format("toolchain type %s", toolchainType.toString()); - } else { - throw new UnsupportedOperationException(); - } + input -> { + if (input.argument() instanceof ConfiguredTargetKey) { + Label label = ((ConfiguredTargetKey) input.argument()).getLabel(); + return label.toString(); + } + if (input.argument() instanceof RegisteredToolchainsValue.Key) { + return "RegisteredToolchains"; } + if (input.argument() instanceof SingleToolchainResolutionValue.Key) { + Label toolchainType = + ((SingleToolchainResolutionValue.Key) input.argument()).toolchainTypeLabel(); + return String.format("toolchain type %s", toolchainType); + } + if (input.argument() instanceof UnloadedToolchainContext.Key) { + ImmutableSet