diff options
author | Nathan Harmata <nharmata@google.com> | 2015-05-13 18:42:51 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-05-15 09:44:01 +0000 |
commit | db4d8619023693c97e5afb467737084ccd30b311 (patch) | |
tree | 513e52cce65d50a2cb12f13d2f96c379e85761ec /src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java | |
parent | 767c372a6de2a4eb44a9c5cfe062885bcd1e7022 (diff) |
Add a SingleCycleReporter for analysis phase cycles, which can (only) occur due to configurations.
RELNOTES:
--
MOS_MIGRATED_REVID=93543318
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java new file mode 100644 index 0000000000..f4a43aafba --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java @@ -0,0 +1,61 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skyframe; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.pkgcache.LoadedPackageProvider; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.skyframe.CycleInfo; +import com.google.devtools.build.skyframe.SkyKey; + +/** + * Reports cycles between {@link ConfiguredTargetValue}s. Similar to + * {@link TransitiveTargetCycleReporter}, these indicate cycles between targets, but during the + * analysis phase. In the current target-parsing, loading, analysis, and execution phase + * distinction, such cycles can only occur due to the presence of a specific configuration (if + * such a cycle occurs regardless of the configuration, then it would have been caught during the + * target parsing or loading phase). + */ +class ConfiguredTargetCycleReporter extends AbstractLabelCycleReporter { + + private static final Predicate<SkyKey> IS_CONFIGURED_TARGET_SKY_KEY = + SkyFunctions.isSkyFunction(SkyFunctions.CONFIGURED_TARGET); + + ConfiguredTargetCycleReporter(LoadedPackageProvider loadedPackageProvider) { + super(loadedPackageProvider); + } + + @Override + protected boolean canReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo) { + return Iterables.all(Iterables.concat(ImmutableList.of(topLevelKey), + cycleInfo.getPathToCycle(), cycleInfo.getCycle()), IS_CONFIGURED_TARGET_SKY_KEY); + } + + @Override + protected String getAdditionalMessageAboutCycle(SkyKey topLevelKey, CycleInfo cycleInfo) { + return "\nThis cycle occurred because of a configuration option"; + } + + @Override + public String prettyPrint(SkyKey key) { + return ((ConfiguredTargetKey) key.argument()).prettyPrint(); + } + + @Override + public Label getLabel(SkyKey key) { + return ((ConfiguredTargetKey) key.argument()).getLabel(); + } +}
\ No newline at end of file |