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.
    */