diff options
author | 2018-05-18 05:19:37 -0700 | |
---|---|---|
committer | 2018-05-18 05:23:05 -0700 | |
commit | cf2f494b2a7b023c88fe12b8fa54f447577a30ca (patch) | |
tree | 77bf24ce177606c6e237bd422499b5234ec2fede /src | |
parent | fd44bae268f74e3b308d03b8e3710ee9442cd851 (diff) |
Add support of empty target to LateBoundAlias.
RELNOTES:none
PiperOrigin-RevId: 197132230
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java | 26 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java | 117 |
2 files changed, 137 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java index 3e309c338b..176411b7f6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java @@ -18,13 +18,17 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.analysis.Runfiles; +import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.VisibilityProvider; import com.google.devtools.build.lib.analysis.VisibilityProviderImpl; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -36,14 +40,19 @@ import com.google.devtools.build.lib.packages.RuleClass; import java.util.function.Function; /** Implements template for creating custom alias rules. */ -public class LateBoundAlias implements RuleConfiguredTargetFactory { +public final class LateBoundAlias implements RuleConfiguredTargetFactory { private static final String ATTRIBUTE_NAME = ":alias"; @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) + throws ActionConflictException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite(ATTRIBUTE_NAME, Mode.TARGET); + if (actual == null) { + return createEmptyConfiguredTarget(ruleContext); + } + return new AliasConfiguredTarget( ruleContext, actual, @@ -54,10 +63,15 @@ public class LateBoundAlias implements RuleConfiguredTargetFactory { new VisibilityProviderImpl(ruleContext.getVisibility()))); } - /** - * Rule definition for custom alias rules" - */ - public static class CommonAliasRule implements RuleDefinition { + private ConfiguredTarget createEmptyConfiguredTarget(RuleContext ruleContext) + throws ActionConflictException { + return new RuleConfiguredTargetBuilder(ruleContext) + .addProvider(RunfilesProvider.class, RunfilesProvider.simple(Runfiles.EMPTY)) + .build(); + } + + /** Rule definition for custom alias rules */ + public abstract static class CommonAliasRule implements RuleDefinition { private static final String ATTRIBUTE_NAME = ":alias"; diff --git a/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java new file mode 100644 index 0000000000..4da5bb3f98 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java @@ -0,0 +1,117 @@ +// Copyright 2018 The Bazel Authors. 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.rules; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.LabelSyntaxException; +import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault; +import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.rules.LateBoundAlias.CommonAliasRule; +import com.google.devtools.build.lib.testutil.TestRuleClassProvider; +import java.io.IOException; +import javax.annotation.Nullable; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests that LateBoundAlias can resolve null actual reference. + */ +@RunWith(JUnit4.class) +public class LateBoundAliasTest extends BuildViewTestCase { + + private static final class TestFragment extends Fragment {} + + private static final class TestFragmentOptionFactory implements ConfigurationFragmentFactory { + + @Override + public Class<? extends Fragment> creates() { + return TestFragment.class; + } + + @Override + public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { + return ImmutableSet.of(); + } + + @Nullable + @Override + public Fragment create(BuildOptions buildOptions) { + return new TestFragment(); + } + } + + private static final class TestLateBoundDefault extends LateBoundDefault<TestFragment, Label> { + + private TestLateBoundDefault() { + super(false, TestFragment.class, null); + } + + @Override + public Label resolve(Rule rule, AttributeMap attributes, TestFragment input) { + return null; + } + } + + private static final class MyTestRule extends CommonAliasRule { + public MyTestRule() { + super("test_rule_name", env -> new TestLateBoundDefault(), TestFragment.class); + } + } + + @Override + protected ConfiguredRuleClassProvider getRuleClassProvider() { + ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder(); + TestRuleClassProvider.addStandardRules(builder); + builder.addConfigurationFragment(new TestFragmentOptionFactory()); + builder.addRuleDefinition(new MyTestRule()); + return builder.build(); + } + + @Test + public void testResolveNullTarget() throws IOException, LabelSyntaxException { + scratch.file("a/BUILD", "test_rule_name(name='alias')"); + + ConfiguredTarget alias = getConfiguredTarget("//a:alias"); + + assertThat(alias).isNotNull(); + } + + @Test + public void testNullTargetCanBeDependant() throws IOException, LabelSyntaxException { + scratch.file( + "a/BUILD", + "test_rule_name(name='alias')", + "filegroup(", + " name = 'my_filegroup',", + " srcs = [':alias']", + ")"); + + ConfiguredTarget myFilegroup = getConfiguredTarget("//a:my_filegroup"); + + assertThat(myFilegroup).isNotNull(); + } +} |