Rule functions should return None instead of internal Rule objects
PiperOrigin-RevId: 159438112
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 f6a34e9..50c4775 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.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 @@
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");
+ }
}