diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java | 3 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java | 27 |
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"); + } } |