Process outer classpath classes in GenericSignatureContextBuilder
Fixes: b/415703756
Change-Id: I22d8a30e47bba57d9a01522ce66856c93f90b9c9
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
index 84bd5a1..0b901df 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
@@ -142,7 +142,8 @@
}
Map<DexReference, TypeParameterSubstitutions> formalsInfo = new IdentityHashMap<>();
Map<DexReference, DexReference> enclosingInfo = new IdentityHashMap<>();
- programClasses.forEach(
+ WorkList<DexClass> worklist = WorkList.newIdentityWorkList(programClasses);
+ worklist.process(
clazz -> {
// Build up a map of type variables to bounds for every reference such that we can
// lookup the information even after we prune the generic signatures.
@@ -150,7 +151,7 @@
formalsInfo.put(
clazz.getReference(),
TypeParameterSubstitutions.create(clazz.classSignature.getFormalTypeParameters()));
- clazz.forEachProgramMethod(
+ clazz.forEachClassMethod(
method -> {
MethodTypeSignature methodSignature =
method.getDefinition().getGenericSignature();
@@ -165,8 +166,15 @@
// Build up an enclosing class context such that the enclosing class can be looked up
// even after inner class and enclosing method attribute attributes are removed.
InnerClassAttribute innerClassAttribute = clazz.getInnerClassAttributeForThisClass();
- if (innerClassAttribute != null) {
+ if (innerClassAttribute != null && innerClassAttribute.getOuter() != null) {
enclosingInfo.put(clazz.getType(), innerClassAttribute.getOuter());
+ DexClass outerClass =
+ appView
+ .appInfo()
+ .definitionForWithoutExistenceAssert(innerClassAttribute.getOuter());
+ if (outerClass != null) {
+ worklist.addIfNotSeen(outerClass);
+ }
}
EnclosingMethodAttribute enclosingMethodAttribute = clazz.getEnclosingMethodAttribute();
if (enclosingMethodAttribute != null) {
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationSignatureContextTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationSignatureContextTest.java
index f0af1b9..ffa0f55 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationSignatureContextTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationSignatureContextTest.java
@@ -3,10 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.partial;
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static org.hamcrest.CoreMatchers.containsString;
-
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
@@ -38,13 +36,8 @@
.addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
.addKeepAllClassesRule()
.addKeepAttributeSignature()
- .allowDiagnosticInfoMessages()
.setMinApi(apiLevelWithNativeMultiDexSupport())
- // TODO(b/415703756): Should not report invalid signature.
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics.assertInfosMatch(
- diagnosticMessage(containsString("Invalid signature"))));
+ .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages);
}
@Test
@@ -55,13 +48,8 @@
.addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
.addKeepAllClassesRule()
.addKeepAttributeSignature()
- .allowDiagnosticInfoMessages()
.setMinApi(apiLevelWithNativeMultiDexSupport())
- // TODO(b/415703756): Should not report invalid signature.
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics.assertInfosMatch(
- diagnosticMessage(containsString("Invalid signature"))));
+ .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages);
}
static class ExcludedClass<T> {