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() {