cquery fragments: include outer class name for inner classes.

This disambiguates inner classes called "Options", for example:

https://github.com/bazelbuild/bazel/blob/5bc203045a8397238aeeefa8c51ae1c0aeec9ba2/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java#L42

Outer classes can also presumably have the same problem. But in
practice they don't and it's more readable to look at base names
vs. fully qualified paths.

PiperOrigin-RevId: 281169250
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index d04aad7..d9647af 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -70,6 +70,7 @@
 import com.google.devtools.build.lib.skyframe.AspectFunction.AspectFunctionException;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
+import com.google.devtools.build.lib.util.ClassName;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import java.util.Collection;
 import java.util.LinkedHashMap;
@@ -317,10 +318,11 @@
     // Add directly required fragments:
 
     // Fragments explicitly required by this rule:
-    directlyRequiredFragments.forEach(fragment -> requiredFragments.add(fragment.getSimpleName()));
+    directlyRequiredFragments.forEach(
+        fragment -> requiredFragments.add(ClassName.getSimpleNameWithOuter(fragment)));
     // Fragments universally required by all rules:
     universallyRequiredFragments.forEach(
-        fragment -> requiredFragments.add(fragment.getSimpleName()));
+        fragment -> requiredFragments.add(ClassName.getSimpleNameWithOuter(fragment)));
     // Fragments required by config_conditions this rule select()s on:
     configConditions.forEach(
         configCondition -> requiredFragments.addAll(configCondition.getRequiredFragmentOptions()));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/BUILD b/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
index 54feb0a..d829ba6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
@@ -21,8 +21,8 @@
         "//src/main/java/com/google/devtools/build/lib:core-rules",
         "//src/main/java/com/google/devtools/build/lib:events",
         "//src/main/java/com/google/devtools/build/lib:packages-internal",
-        "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
         "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
index 8866522..4b4ef3b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
@@ -63,6 +63,7 @@
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.config.ConfigRuleClasses.ConfigSettingRule;
+import com.google.devtools.build.lib.util.ClassName;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
@@ -288,7 +289,7 @@
         foundMismatch = true;
         continue;
       }
-      requiredFragmentOptions.add(optionClass.getSimpleName());
+      requiredFragmentOptions.add(ClassName.getSimpleNameWithOuter(optionClass));
 
       SelectRestriction selectRestriction = options.getSelectRestriction(optionName);
       if (selectRestriction != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/util/ClassName.java b/src/main/java/com/google/devtools/build/lib/util/ClassName.java
new file mode 100644
index 0000000..47adeec
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/util/ClassName.java
@@ -0,0 +1,32 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.util;
+
+/** Utilities providing user-friendly class names. */
+public final class ClassName {
+
+  /**
+   * Returns a class's {@link Class#getSimpleName}, but also includes the outer class's simple name
+   * if this is an inner class.
+   *
+   * <p>For example, given {@code MyInnerClass} under {@code MyOuterClass}, returns {@code
+   * "MyOuterClass$MyInnerClass"}.
+   */
+  public static String getSimpleNameWithOuter(Class<?> clazz) {
+    String name = clazz.getName();
+    return name.substring(name.lastIndexOf(".") + 1);
+  }
+
+  private ClassName() {}
+}
diff --git a/src/test/java/com/google/devtools/build/lib/util/ClassNameTest.java b/src/test/java/com/google/devtools/build/lib/util/ClassNameTest.java
new file mode 100644
index 0000000..2f4e8c8
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/util/ClassNameTest.java
@@ -0,0 +1,37 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link ClassNameTest}. */
+@RunWith(JUnit4.class)
+public class ClassNameTest {
+  @Test
+  public void outerClassName() {
+    assertThat(ClassName.getSimpleNameWithOuter(ClassNameTest.class)).isEqualTo("ClassNameTest");
+  }
+
+  static class InnerClass {}
+
+  @Test
+  public void innerClassName() {
+    assertThat(ClassName.getSimpleNameWithOuter(InnerClass.class))
+        .isEqualTo("ClassNameTest$InnerClass");
+  }
+}
diff --git a/src/test/shell/integration/configured_query_test.sh b/src/test/shell/integration/configured_query_test.sh
index 86cfaff..42522e7 100755
--- a/src/test/shell/integration/configured_query_test.sh
+++ b/src/test/shell/integration/configured_query_test.sh
@@ -399,7 +399,10 @@
 
 config_setting(
     name = "py_reading_condition",
-    values = {"build_python_zip": "1"}
+    values = {
+      "build_python_zip": "1",
+      "shell_executable": "foo"
+    }
 )
 
 cc_library(
@@ -418,9 +421,11 @@
   assert_not_contains "//$pkg:cclib .*PythonOptions" output
 
   assert_contains "//$pkg:py_reading_condition .*PythonOptions" output
+  assert_contains "//$pkg:py_reading_condition .*ShellConfiguration\$Options" output
 
   assert_contains "//$pkg:cclib_with_select .*CppConfiguration" output
   assert_contains "//$pkg:cclib_with_select .*PythonOptions" output
+  assert_contains "//$pkg:cclib_with_select .*ShellConfiguration\$Options" output
 }
 
 function test_show_config_fragments_select_on_starlark_option() {