Only use star wildcard if directly under a type-argument
Bug: 186547736
Change-Id: I4ded5327fc864ced6b45e415d36be859012f115f
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
index 4420d43..dfa8a95 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -26,10 +26,6 @@
private final Set<String> introducedClassTypeVariables = new HashSet<>();
private final Set<String> introducedMethodTypeVariables = new HashSet<>();
- // Wildcards can only be called be used in certain positions:
- // https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
- private boolean canUseWildcardInArguments = true;
-
private GenericSignaturePartialTypeArgumentApplier(
Map<String, DexType> substitutions, DexType objectType) {
this.substitutions = substitutions;
@@ -96,11 +92,7 @@
if (interfaceSignatures.isEmpty()) {
return interfaceSignatures;
}
- canUseWildcardInArguments = false;
- List<ClassTypeSignature> map =
- ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
- canUseWildcardInArguments = true;
- return map;
+ return ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
}
@Override
@@ -108,7 +100,9 @@
if (typeArguments.isEmpty()) {
return typeArguments;
}
- return ListUtils.mapOrElse(typeArguments, this::visitFieldTypeSignature);
+ // Wildcards can only be called be used in certain positions:
+ // https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
+ return ListUtils.mapOrElse(typeArguments, arg -> visitFieldTypeSignature(arg, true));
}
@Override
@@ -171,14 +165,16 @@
@Override
public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
- canUseWildcardInArguments = false;
- ClassTypeSignature visit = classTypeSignature.visit(this);
- canUseWildcardInArguments = true;
- return visit;
+ return classTypeSignature.visit(this);
}
@Override
public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
+ return visitFieldTypeSignature(fieldSignature, false);
+ }
+
+ private FieldTypeSignature visitFieldTypeSignature(
+ FieldTypeSignature fieldSignature, boolean canUseWildcardInArguments) {
if (fieldSignature.isStar()) {
return fieldSignature;
} else if (fieldSignature.isClassTypeSignature()) {
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
index f566ca2..f3cee7b 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.graph.genericsignature;
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestBase;
@@ -45,10 +43,11 @@
@Test
public void testVariablesInOuterPosition() {
- // TODO(b/186547736): The expected signature should be (Ljava/lang/Object;)Ljava/lang/Object;
- runTest(ImmutableMap.of("T", objectType, "R", objectType), "(TT;)TR;", "(*)*")
- .assertWarningThatMatches(
- diagnosticMessage(containsString("Invalid signature '(*)*' for method foo")));
+ runTest(
+ ImmutableMap.of("T", objectType, "R", objectType),
+ "(TT;)TR;",
+ "(Ljava/lang/Object;)Ljava/lang/Object;")
+ .assertNoMessages();
}
@Test
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
index 608b8d3..ebca08d 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
@@ -55,20 +55,9 @@
public void checkSignatures(CodeInspector inspector) {
checkSignature(
inspector.clazz(Bar.class.getTypeName() + "$1"),
- "L"
- + binaryName(Foo.class)
- + "<"
- + descriptor(Object.class)
- + descriptor(Main.class)
- + ">;");
+ "L" + binaryName(Foo.class) + "<*" + descriptor(Main.class) + ">;");
checkSignature(
- inspector.clazz(Bar.class.getTypeName() + "$2"),
- "L"
- + binaryName(Foo.class)
- + "<"
- + descriptor(Object.class)
- + descriptor(Object.class)
- + ">;");
+ inspector.clazz(Bar.class.getTypeName() + "$2"), "L" + binaryName(Foo.class) + "<**>;");
}
private void checkSignature(ClassSubject classSubject, String expectedSignature) {