Fix `in` operator for targets
`DefaultInfo in target` should always return `true` for any target.
PiperOrigin-RevId: 153166669
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
index b522bce..acaa4a8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
@@ -149,15 +149,7 @@
"Type Target only supports querying by object constructors, got %s instead",
EvalUtils.getDataTypeName(key)));
}
- ClassObjectConstructor constructor = (ClassObjectConstructor) key;
- SkylarkProviders provider = getProvider(SkylarkProviders.class);
- if (provider != null) {
- Object declaredProvider = provider.getDeclaredProvider(constructor.getKey());
- if (declaredProvider != null) {
- return true;
- }
- }
- return false;
+ return get(((ClassObjectConstructor) key).getKey()) != null;
}
@Override
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index 0d4f74f..8c4be30 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -867,6 +867,7 @@
"def _impl(ctx):",
" provider = ctx.attr.deps[0][DefaultInfo]",
" return struct(",
+ " is_provided = DefaultInfo in ctx.attr.deps[0],",
" provider = provider,",
" dir = str(sorted(dir(provider))),",
" rule_data_runfiles = provider.data_runfiles,",
@@ -889,6 +890,8 @@
ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
SkylarkProviders providers = configuredTarget.getProvider(SkylarkProviders.class);
+ assertThat((Boolean) providers.getValue("is_provided")).isTrue();
+
Object provider = providers.getValue("provider");
assertThat(provider).isInstanceOf(DefaultProvider.class);
assertThat(((DefaultProvider) provider).getConstructor().getPrintableName())
@@ -925,6 +928,7 @@
"def _impl(ctx):",
" provider = ctx.attr.deps[0][DefaultInfo]",
" return struct(",
+ " is_provided = DefaultInfo in ctx.attr.deps[0],",
" provider = provider,",
" dir = str(sorted(dir(provider))),",
" file_data_runfiles = provider.data_runfiles,",
@@ -945,6 +949,8 @@
ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
SkylarkProviders providers = configuredTarget.getProvider(SkylarkProviders.class);
+ assertThat((Boolean) providers.getValue("is_provided")).isTrue();
+
Object provider = providers.getValue("provider");
assertThat(provider).isInstanceOf(DefaultProvider.class);
assertThat(((DefaultProvider) provider).getConstructor().getPrintableName())