Always stripped out nestHost/nestMembers attributes regardless member reference
#java11 #desugar
- Stripped out these Java8-unknown attribute to unconfuse tools.
PiperOrigin-RevId: 291277852
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD b/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
index ad89834..43f3eed 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/BUILD
@@ -10,6 +10,35 @@
licenses(["notice"]) # Apache 2.0
java_test(
+ name = "ClassFileFormatTest",
+ size = "medium",
+ srcs = ["ClassFileFormatTest.java"],
+ data = [
+ "//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat",
+ "//src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:android_jar_for_testing",
+ "//src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:jacoco_agent_jar",
+ ],
+ jvm_flags = [
+ "-Dinput_srcs='$(locations //src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat)'",
+ "-Djdk.internal.lambda.dumpProxyClasses=$$(mktemp -d)",
+ "-Dandroid_runtime_jar=$(location //src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:android_jar_for_testing)",
+ "-Djacoco_agent_jar=$(location //src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:jacoco_agent_jar)",
+ ],
+ test_class = "com.google.devtools.build.android.desugar.nest.ClassFileFormatTest",
+ deps = [
+ "//src/tools/android/java/com/google/devtools/build/android/desugar/testing/junit:desugar_rule",
+ "//third_party:asm",
+ "//third_party:asm-tree",
+ "//third_party:guava",
+ "//third_party:guava-testlib",
+ "//third_party:jsr330_inject",
+ "//third_party:junit4",
+ "//third_party:truth",
+ "//third_party:truth8",
+ ],
+)
+
+java_test(
name = "NestAnalyzerTest",
size = "medium",
srcs = ["NestAnalyzerTest.java"],
@@ -188,6 +217,7 @@
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/complexcase:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/nestanalyzer:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/constructor:srcs",
+ "//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/field:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/interfacemethod:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/method:srcs",
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/ClassFileFormatTest.java b/src/test/java/com/google/devtools/build/android/desugar/nest/ClassFileFormatTest.java
new file mode 100644
index 0000000..07701c6
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/ClassFileFormatTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2020 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.android.desugar.nest;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Splitter;
+import com.google.devtools.build.android.desugar.testing.junit.AsmNode;
+import com.google.devtools.build.android.desugar.testing.junit.DesugarRule;
+import com.google.devtools.build.android.desugar.testing.junit.DesugarRunner;
+import com.google.devtools.build.android.desugar.testing.junit.JdkSuppress;
+import com.google.devtools.build.android.desugar.testing.junit.JdkVersion;
+import java.lang.invoke.MethodHandles;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.objectweb.asm.tree.ClassNode;
+
+/**
+ * Tests for accessing a series of private fields, constructors and methods from another class
+ * within a nest.
+ */
+@RunWith(DesugarRunner.class)
+@JdkSuppress(minJdkVersion = JdkVersion.V11)
+public final class ClassFileFormatTest {
+
+ private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
+
+ @Rule
+ @SuppressWarnings("SplitterToStream") // Pending bazel guava update.
+ public final DesugarRule desugarRule =
+ DesugarRule.builder(this, lookup)
+ .addSourceInputs(getInputSourceFilesFromJvmOption("input_srcs"))
+ .addJavacOptions("-source 11", "-target 11")
+ .setWorkingJavaPackage(
+ "com.google.devtools.build.android.desugar.nest.testsrc.simpleunit.classfileformat")
+ .addCommandOptions("desugar_nest_based_private_access", "true")
+ .build();
+
+ private static Path[] getInputSourceFilesFromJvmOption(String jvmOptionKey) {
+ return Splitter.on(" ").trimResults().splitToList(System.getProperty(jvmOptionKey)).stream()
+ .map(Paths::get)
+ .toArray(Path[]::new);
+ }
+
+ @Test
+ public void classFileMajorVersions(
+ @AsmNode(className = "NestOuterInterfaceA", round = 0) ClassNode beforeDesugarClassNode,
+ @AsmNode(className = "NestOuterInterfaceA", round = 1) ClassNode afterDesugarClassNode) {
+ assertThat(beforeDesugarClassNode.version).isEqualTo(JdkVersion.V11);
+ assertThat(afterDesugarClassNode.version).isEqualTo(JdkVersion.V1_7);
+ }
+
+ @Test
+ public void nestMembersAttribute_strippedOutAfterDesugaring(
+ @AsmNode(className = "NestOuterInterfaceA", round = 0) ClassNode before,
+ @AsmNode(className = "NestOuterInterfaceA", round = 1) ClassNode after) {
+ assertThat(before.nestMembers).isNotEmpty();
+ assertThat(after.nestMembers).isNull();
+ }
+
+ @Test
+ public void nestHostAttribute_strippedOutAfterDesugaringForNestedClass(
+ @AsmNode(className = "NestOuterInterfaceA$NestedClassB", round = 0) ClassNode before,
+ @AsmNode(className = "NestOuterInterfaceA$NestedClassB", round = 1) ClassNode after) {
+ assertThat(before.nestHostClass).isNotEmpty();
+ assertThat(after.nestHostClass).isNull();
+ }
+
+ @Test
+ public void nestHostAttribute_strippedOutAfterDesugaringForNestedInterface(
+ @AsmNode(className = "NestOuterInterfaceA$NestedInterfaceC", round = 0) ClassNode before,
+ @AsmNode(className = "NestOuterInterfaceA$NestedInterfaceC", round = 1) ClassNode after) {
+ assertThat(before.nestHostClass).isNotEmpty();
+ assertThat(after.nestHostClass).isNull();
+ }
+
+ @Test
+ public void nestHostAttribute_strippedOutAfterDesugaringForNestedAnnotation(
+ @AsmNode(className = "NestOuterInterfaceA$NestedAnnotationD", round = 0) ClassNode before,
+ @AsmNode(className = "NestOuterInterfaceA$NestedAnnotationD", round = 1) ClassNode after) {
+ assertThat(before.nestHostClass).isNotEmpty();
+ assertThat(after.nestHostClass).isNull();
+ }
+
+ @Test
+ public void nestHostAttribute_strippedOutAfterDesugaringForNestedEnum(
+ @AsmNode(className = "NestOuterInterfaceA$NestedEnumE", round = 0) ClassNode before,
+ @AsmNode(className = "NestOuterInterfaceA$NestedEnumE", round = 1) ClassNode after) {
+ assertThat(before.nestHostClass).isNotEmpty();
+ assertThat(after.nestHostClass).isNull();
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/BUILD b/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/BUILD
new file mode 100644
index 0000000..5376b5b
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/BUILD
@@ -0,0 +1,17 @@
+package(
+ default_testonly = 1,
+ default_visibility = ["//src/test/java/com/google/devtools/build/android/desugar:__subpackages__"],
+)
+
+licenses(["notice"]) # Apache 2.0
+
+filegroup(
+ name = "classfileformat",
+ srcs = glob(["*.java"]),
+)
+
+filegroup(
+ name = "srcs",
+ testonly = 0,
+ srcs = glob(["*"]),
+)
diff --git a/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/NestOuterInterfaceA.java b/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/NestOuterInterfaceA.java
new file mode 100644
index 0000000..6c65169
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/android/desugar/nest/testsrc/simpleunit/classfileformat/NestOuterInterfaceA.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2020 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.android.desugar.nest.testsrc.simpleunit.classfileformat;
+
+/** A nest for testing the attributes in class file format. */
+@SuppressWarnings("InterfaceWithOnlyStatics") // Contrived class for nest-access based testing.
+public interface NestOuterInterfaceA {
+
+ /** A nested class. */
+ class NestedClassB {}
+
+ /** A nested interface. */
+ interface NestedInterfaceC {}
+
+ /** A nested annotation. */
+ @interface NestedAnnotationD {}
+
+ /** A nested enum. */
+ enum NestedEnumE {}
+}
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
index 0f3992b..9d8ef00 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
@@ -1061,7 +1061,7 @@
}
}
- if (options.desugarNestBasedPrivateAccess && classMemberRecord.hasAnyReason()) {
+ if (options.desugarNestBasedPrivateAccess) {
visitor = new NestDesugaring(visitor, nestCompanions, classMemberRecord);
}