aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2018-04-27 13:04:59 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-27 13:07:03 -0700
commitaab9868f535e3a08e272570fed5fec3c51cd384b (patch)
tree4e1742d8aad4495b9c25b8c80addfd2aae2e1d93 /src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
parent758287532e338401146a8bb447161711b4b939c0 (diff)
Allow skylark rule definitions to advertise providers that targets of the rule must propagate
This allows native aspects which specifically require advertised providers to be applied to skylark rules. Implementation to allow aspects to explicitly declare provider requirements will come later. RELNOTES: Skylark rule definitions may advertise providers that targets of the rule must propagate. PiperOrigin-RevId: 194581466
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index 5f7c2bf8db..18db4d3849 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -68,6 +68,7 @@ import com.google.devtools.build.lib.packages.SkylarkAspect;
import com.google.devtools.build.lib.packages.SkylarkDefinedAspect;
import com.google.devtools.build.lib.packages.SkylarkExportable;
import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.packages.TestSize;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -532,7 +533,18 @@ public class SkylarkRuleClassFunctions {
legacyNamed = true,
defaultValue = "''",
doc = "A description of the rule that can be extracted by documentation generating tools."
- )
+ ),
+ @Param(
+ name = "provides",
+ type = SkylarkList.class,
+ named = true,
+ positional = false,
+ defaultValue = "[]",
+ doc =
+ "A list of providers this rule is guaranteed to provide. "
+ + "It is an error if a provider is listed here and the rule "
+ + "implementation function does not return it."
+ ),
},
useAst = true,
useEnvironment = true
@@ -546,11 +558,12 @@ public class SkylarkRuleClassFunctions {
Object implicitOutputs,
Boolean executable,
Boolean outputToGenfiles,
- SkylarkList fragments,
- SkylarkList hostFragments,
+ SkylarkList<?> fragments,
+ SkylarkList<?> hostFragments,
Boolean skylarkTestable,
SkylarkList<String> toolchains,
String doc,
+ SkylarkList<?> providesArg,
FuncallExpression ast,
Environment funcallEnv)
throws EvalException, ConversionException {
@@ -617,6 +630,21 @@ public class SkylarkRuleClassFunctions {
funcallEnv.getTransitiveContentHashCode());
builder.addRequiredToolchains(collectToolchainLabels(toolchains, ast));
+ for (Object o : providesArg) {
+ if (!SkylarkAttr.isProvider(o)) {
+ throw new EvalException(
+ ast.getLocation(),
+ String.format(
+ "Illegal argument: element in 'provides' is of unexpected type. "
+ + "Should be list of providers, but got item of type %s.",
+ EvalUtils.getDataTypeName(o, true)));
+ }
+ }
+ for (SkylarkProviderIdentifier skylarkProvider :
+ SkylarkAttr.getSkylarkProviderIdentifiers(providesArg, ast.getLocation())) {
+ builder.advertiseSkylarkProvider(skylarkProvider);
+ }
+
return new SkylarkRuleFunction(builder, type, attributes, ast.getLocation());
}
@@ -863,7 +891,7 @@ public class SkylarkRuleClassFunctions {
ast.getLocation(),
String.format(
"Illegal argument: element in 'provides' is of unexpected type. "
- + "Should be list of providers, but got %s. ",
+ + "Should be list of providers, but got item of type %s. ",
EvalUtils.getDataTypeName(o, true)));
}
}