Introduce --incompatible_no_target_output_group to turn down deprecated Target.output_group field.
Progress toward #6241
RELNOTES: None.
PiperOrigin-RevId: 215238373
diff --git a/site/docs/skylark/backward-compatibility.md b/site/docs/skylark/backward-compatibility.md
index dfd1e7c..a66785d 100644
--- a/site/docs/skylark/backward-compatibility.md
+++ b/site/docs/skylark/backward-compatibility.md
@@ -41,6 +41,7 @@
* [New actions API](#new-actions-api)
* [New args API](#new-args-api)
* [Disable objc provider resources](#disable-objc-provider-resources)
+* [Disable output group field on Target](#disable-output-group-field-on-target)
* [Remove native git repository](#remove-native-git-repository)
* [Remove native http archive](#remove-native-http-archive)
* [New-style JavaInfo constructor](#new-style-java_info)
@@ -254,6 +255,27 @@
* Default: `false`
+### Disable output group field on Target
+
+This flag disables the `output_group` field on the `Target` Starlark type.
+Use `OutputGroupInfo` instead.
+
+For example, replace:
+
+```python
+dep_bin = ctx.attr.dep.output_group.bin
+```
+
+with:
+
+```python
+dep_bin = ctx.attr.dep[OutputGroupInfo].bin
+```
+
+* Flag: `--incompatible_no_target_output_group`
+* Default: `false`
+
+
### Remove native git repository
When set, the native `git_repository` and `new_git_repository` rules are
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index 07ec878..8618b47 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -319,6 +319,18 @@
public boolean incompatibleNoSupportToolsInActionInputs;
@Option(
+ name = "incompatible_no_target_output_group",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
+ effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+ metadataTags = {
+ OptionMetadataTag.INCOMPATIBLE_CHANGE,
+ OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+ },
+ help = "If set to true, disables the output_group field of the 'Target' Starlark type.")
+ public boolean incompatibleNoTargetOutputGroup;
+
+ @Option(
name = "incompatible_no_transitive_loads",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
@@ -465,6 +477,7 @@
.incompatibleGenerateJavaCommonSourceJar(incompatibleGenerateJavaCommonSourceJar)
.incompatibleNewActionsApi(incompatibleNewActionsApi)
.incompatibleNoSupportToolsInActionInputs(incompatibleNoSupportToolsInActionInputs)
+ .incompatibleNoTargetOutputGroup(incompatibleNoTargetOutputGroup)
.incompatibleNoTransitiveLoads(incompatibleNoTransitiveLoads)
.incompatiblePackageNameIsAFunction(incompatiblePackageNameIsAFunction)
.incompatibleRangeType(incompatibleRangeType)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
index 3b3d1ce..1e5dde3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
@@ -19,6 +19,7 @@
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
/**
* Interface for a build target.
@@ -53,6 +54,7 @@
documented = false, // TODO(dslomov): document.
parameters = {
@Param(name = "group_name", type = String.class, doc = "Output group name", named = true)
- })
+ },
+ disableWithFlag = FlagIdentifier.INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP)
SkylarkNestedSet outputGroup(String group);
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 9a50737..d906f8b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -511,7 +511,7 @@
Environment environment)
throws EvalException {
Pair<MethodDescriptor, List<Object>> matchingMethod = null;
- List<MethodDescriptor> methods = getMethods(objClass, methodName);
+ List<MethodDescriptor> methods = getMethods(environment.getSemantics(), objClass, methodName);
ArgumentListConversionResult argumentListConversionResult = null;
if (methods != null) {
for (MethodDescriptor method : methods) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index 2d606cc..fb1d2df 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -37,6 +37,8 @@
public enum FlagIdentifier {
INCOMPATIBLE_DISABLE_OBJC_PROVIDER_RESOURCES(
SkylarkSemantics::incompatibleDisableObjcProviderResources),
+ INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(
+ SkylarkSemantics::incompatibleNoTargetOutputGroup),
NONE(null);
// Using a Function here makes the enum definitions far cleaner, and, since this is
@@ -125,6 +127,8 @@
public abstract boolean incompatibleNoSupportToolsInActionInputs();
+ public abstract boolean incompatibleNoTargetOutputGroup();
+
public abstract boolean incompatibleNoTransitiveLoads();
public abstract boolean incompatiblePackageNameIsAFunction();
@@ -177,6 +181,7 @@
.incompatibleGenerateJavaCommonSourceJar(false)
.incompatibleNewActionsApi(false)
.incompatibleNoSupportToolsInActionInputs(false)
+ .incompatibleNoTargetOutputGroup(false)
.incompatibleNoTransitiveLoads(false)
.incompatiblePackageNameIsAFunction(false)
.incompatibleRangeType(false)
@@ -231,6 +236,8 @@
public abstract Builder incompatibleNoSupportToolsInActionInputs(boolean value);
+ public abstract Builder incompatibleNoTargetOutputGroup(boolean value);
+
public abstract Builder incompatibleNoTransitiveLoads(boolean value);
public abstract Builder incompatiblePackageNameIsAFunction(boolean value);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index 0d32a89..6ebf71e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -140,6 +140,7 @@
"--incompatible_generate_javacommon_source_jar=" + rand.nextBoolean(),
"--incompatible_new_actions_api=" + rand.nextBoolean(),
"--incompatible_no_support_tools_in_action_inputs=" + rand.nextBoolean(),
+ "--incompatible_no_target_output_group=" + rand.nextBoolean(),
"--incompatible_no_transitive_loads=" + rand.nextBoolean(),
"--incompatible_package_name_is_a_function=" + rand.nextBoolean(),
"--incompatible_range_type=" + rand.nextBoolean(),
@@ -178,6 +179,7 @@
.incompatibleGenerateJavaCommonSourceJar(rand.nextBoolean())
.incompatibleNewActionsApi(rand.nextBoolean())
.incompatibleNoSupportToolsInActionInputs(rand.nextBoolean())
+ .incompatibleNoTargetOutputGroup(rand.nextBoolean())
.incompatibleNoTransitiveLoads(rand.nextBoolean())
.incompatiblePackageNameIsAFunction(rand.nextBoolean())
.incompatibleRangeType(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index f72a681..06eb578 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -1916,6 +1916,26 @@
"//test/skylark:dep doesn't support expected environment: //buildenv/foo:default");
}
+ @Test
+ public void testNoTargetOutputGroup() throws Exception {
+ setSkylarkSemanticsOptions("--incompatible_no_target_output_group=true");
+ scratch.file(
+ "test/skylark/extension.bzl",
+ "def _impl(ctx):",
+ " f = ctx.attr.dep.output_group()",
+ " return struct()",
+ "my_rule = rule(implementation = _impl,",
+ " attrs = { 'dep' : attr.label() })");
+
+ checkError(
+ "test/skylark",
+ "r",
+ "struct has no method 'output_group'",
+ "load('//test/skylark:extension.bzl', 'my_rule')",
+ "cc_binary(name = 'lib', data = ['a.txt'])",
+ "my_rule(name='r', dep = ':lib')");
+ }
+
/**
* Skylark integration test that forces inlining.
*/