diff options
4 files changed, 32 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index 4b8750da07..7fcd60f4f7 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -159,9 +159,10 @@ public final class AspectDefinition { } /** - * Returns whether this aspect applies to files. + * Returns whether this aspect applies to (output) files. * - * Currently only supported for top-level aspects and targets. + * Currently only supported for top-level aspects and targets, and + * only for output files. */ public boolean applyToFiles() { return applyToFiles; @@ -459,7 +460,8 @@ public final class AspectDefinition { * Sets whether this aspect should apply to files. * * Default is <code>false</code>. - * Currently only supported for top-level aspects and targets. + * Currently only supported for top-level aspects and targets, and only for + * output files. */ public Builder applyToFiles(boolean propagateOverGeneratedFiles) { this.applyToFiles = propagateOverGeneratedFiles; diff --git a/src/main/java/com/google/devtools/build/lib/packages/Target.java b/src/main/java/com/google/devtools/build/lib/packages/Target.java index f503aa8568..ad83dafeed 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Target.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Target.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import java.util.Set; +import javax.annotation.Nullable; /** * A node in the build dependency graph, identified by a Label. @@ -60,6 +61,7 @@ public interface Target { * If this is a Rule, returns itself; it this is an OutputFile, returns its * generating rule; if this is an input file, returns null. */ + @Nullable Rule getAssociatedRule(); /** 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 1b783b9926..d650fdbc13 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 @@ -985,6 +985,10 @@ public final class ConfiguredTargetFunction implements SkyFunction { if (!aspect.getDefinition().applyToFiles() && !(dep.getTarget() instanceof Rule)) { return false; } + if (dep.getTarget().getAssociatedRule() == null) { + // even aspects that 'apply to files' cannot apply to input files. + return false; + } return dep.satisfies(aspect.getDefinition().getRequiredProviders()); } 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 a2bac61ceb..4488f733c8 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 @@ -800,7 +800,7 @@ public class AspectTest extends AnalysisTestCase { } @Test - public void aspectApplyingtToFiles() throws Exception { + public void aspectApplyingToFiles() throws Exception { AspectApplyingToFiles aspectApplyingToFiles = new AspectApplyingToFiles(); setRulesAndAspectsAvailableInTests( ImmutableList.<NativeAspectClass>of(aspectApplyingToFiles), @@ -818,4 +818,24 @@ public class AspectTest extends AnalysisTestCase { assertThat(provider.getLabel()) .isEqualTo(Label.parseAbsoluteUnchecked("//a:x_deploy.jar")); } + + @Test + public void aspectApplyingToSourceFilesIgnored() throws Exception { + AspectApplyingToFiles aspectApplyingToFiles = new AspectApplyingToFiles(); + setRulesAndAspectsAvailableInTests( + ImmutableList.<NativeAspectClass>of(aspectApplyingToFiles), + ImmutableList.<RuleDefinition>of()); + pkg( + "a", + "java_binary(name = 'x', main_class = 'x.FooBar', srcs = ['x.java'])" + ); + scratch.file("a/x.java", ""); + AnalysisResult analysisResult = update(new EventBus(), defaultFlags(), + ImmutableList.of(aspectApplyingToFiles.getName()), + "//a:x.java"); + AspectValue aspect = Iterables.getOnlyElement(analysisResult.getAspects()); + assertThat(aspect.getConfiguredAspect().getProvider(AspectApplyingToFiles.Provider.class)) + .isNull(); + } + } |