aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java27
2 files changed, 29 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index 004b215346..03e423d7db 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -764,13 +764,14 @@ public class SkylarkRuleClassFunctions {
"Cannot instantiate a rule when loading a .bzl file. Rules can only be called from "
+ "a BUILD file (possibly via a macro).");
}
- return RuleFactory.createAndAddRule(
+ RuleFactory.createAndAddRule(
pkgContext,
ruleClass,
attributeValues,
ast,
env,
pkgContext.getAttributeContainerFactory().apply(ruleClass));
+ return Runtime.NONE;
} catch (InvalidRuleException | NameConflictException e) {
throw new EvalException(ast.getLocation(), e.getMessage());
}
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index f6a34e9fc3..50c477520d 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.rules.SkylarkAttr;
import com.google.devtools.build.lib.rules.SkylarkAttr.Descriptor;
import com.google.devtools.build.lib.rules.SkylarkFileType;
import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions.RuleFunction;
+import com.google.devtools.build.lib.rules.SkylarkRuleContext;
import com.google.devtools.build.lib.skyframe.SkylarkImportLookupFunction;
import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
import com.google.devtools.build.lib.syntax.BuildFileAST;
@@ -1389,4 +1390,30 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
assertThat(c.getRequiredToolchains()).containsExactly(toolchain.getKey());
}
+
+ @Test
+ public void testRuleFunctionReturnsNone() throws Exception {
+ scratch.file("test/rule.bzl",
+ "def _impl(ctx):",
+ " pass",
+ "foo_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {'params': attr.string_list()},",
+ ")");
+ scratch.file("test/BUILD",
+ "load(':rule.bzl', 'foo_rule')",
+ "r = foo_rule(name='foo')", // Custom rule should return None
+ "c = cc_library(name='cc')", // Native rule should return None
+ "",
+ "foo_rule(",
+ " name='check',",
+ " params = [type(r), type(c)]",
+ ")");
+ invalidatePackages();
+ SkylarkRuleContext context = createRuleContext("//test:check");
+ @SuppressWarnings("unchecked")
+ MutableList<Object> params = (MutableList<Object>) context.getAttr().getValue("params");
+ assertThat(params.get(0)).isEqualTo("NoneType");
+ assertThat(params.get(1)).isEqualTo("NoneType");
+ }
}