diff options
4 files changed, 35 insertions, 5 deletions
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 a4d54c035a..87523c15bb 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 @@ -129,6 +129,8 @@ public final class AspectFunction implements SkyFunction { transitivePackages); } catch (DependencyEvaluationException e) { throw new AspectFunctionException(e.getRootCauseSkyKey(), e.getCause()); + } catch (AspectCreationException e) { + throw new AspectFunctionException(e); } } 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 8067e60e7c..7fe19c5c78 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 @@ -193,6 +193,9 @@ final class ConfiguredTargetFunction implements SkyFunction { return ans; } catch (DependencyEvaluationException e) { throw new ConfiguredTargetFunctionException(e.getRootCauseSkyKey(), e.getCause()); + } catch (AspectCreationException e) { + throw new ConfiguredTargetFunctionException( + new ConfiguredValueCreationException(e.getMessage())); } } @@ -224,7 +227,7 @@ final class ConfiguredTargetFunction implements SkyFunction { AspectDefinition aspectDefinition, AspectParameters aspectParameters, Set<ConfigMatchingProvider> configConditions, RuleClassProvider ruleClassProvider, BuildConfiguration hostConfiguration, NestedSetBuilder<Package> transitivePackages) - throws DependencyEvaluationException { + throws DependencyEvaluationException, AspectCreationException { // Create the map from attributes to list of (target, configuration) pairs. ListMultimap<Attribute, Dependency> depValueNames; @@ -483,7 +486,7 @@ final class ConfiguredTargetFunction implements SkyFunction { private static ListMultimap<SkyKey, Aspect> resolveAspectDependencies(Environment env, Map<SkyKey, ConfiguredTarget> configuredTargetMap, Iterable<Dependency> deps, NestedSetBuilder<Package> transitivePackages) - throws DependencyEvaluationException { + throws AspectCreationException { ListMultimap<SkyKey, Aspect> result = ArrayListMultimap.create(); Set<SkyKey> aspectKeys = new HashSet<>(); for (Dependency dep : deps) { @@ -517,12 +520,12 @@ final class ConfiguredTargetFunction implements SkyFunction { } catch (ConfiguredValueCreationException e) { // The configured target should have been created in resolveConfiguredTargetDependencies() throw new IllegalStateException(e); - } catch (NoSuchThingException | AspectCreationException e) { + } catch (NoSuchThingException e) { AspectFactory<?, ?, ?> depAspectFactory = AspectFactory.Util.create(depAspect.getAspectFactory()); - throw new DependencyEvaluationException(new ConfiguredValueCreationException( + throw new AspectCreationException( String.format("Evaluation of aspect %s on %s failed: %s", - depAspectFactory.getDefinition().getName(), dep.getLabel(), e.toString()))); + depAspectFactory.getDefinition().getName(), dep.getLabel(), e.toString())); } if (aspectValue == null) { diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java index 02b4f3e1dc..b051db1a8c 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java @@ -126,6 +126,29 @@ public class AspectTest extends AnalysisTestCase { } @Test + public void transitiveAspectInError() throws Exception { + setRules(new TestAspects.BaseRule(), new TestAspects.ErrorAspectRule(), + new TestAspects.SimpleRule()); + + pkg("a", + "error_aspect(name='a', foo=[':b'])", + "error_aspect(name='b', bar=[':c'])", + "error_aspect(name='c', bar=[':d'])", + "error_aspect(name='d')"); + + reporter.removeHandler(failFastHandler); + // getConfiguredTarget() uses a separate code path that does not hit + // SkyframeBuildView#configureTargets + try { + update("//a:a"); + fail(); + } catch (ViewCreationFailedException e) { + // expected + } + assertContainsEvent("Aspect error"); + } + + @Test public void sameTargetInDifferentAttributes() throws Exception { setRules(new TestAspects.BaseRule(), new TestAspects.AspectRequiringRule(), new TestAspects.SimpleRule()); diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java index 5f41e3d4ec..c0ee9111a0 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java @@ -237,6 +237,7 @@ public class TestAspects { } private static final AspectDefinition ERROR_ASPECT = new AspectDefinition.Builder("error") + .attributeAspect("bar", ErrorAspect.class) .build(); /** @@ -367,6 +368,7 @@ public class TestAspects { return builder .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE) .aspect(ErrorAspect.class)) + .add(attr("bar", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)) .build(); } |