Move generic signature visitor to top-level class
Bug: 184927364
Change-Id: I3ceddd69e33dcc64383c8df0ac80e80d86f11fb1
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
index ea66ba7..e889a40 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
@@ -4,17 +4,9 @@
package com.android.tools.r8.graph;
-import com.android.tools.r8.graph.GenericSignature.ClassSignature;
-import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
-import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.ReturnType;
-import com.android.tools.r8.graph.GenericSignature.TypeSignature;
import com.android.tools.r8.graph.analysis.EnqueuerAnalysis;
import com.android.tools.r8.shaking.Enqueuer.EnqueuerDefinitionSupplier;
import com.android.tools.r8.shaking.EnqueuerWorklist;
-import java.util.List;
public class GenericSignatureEnqueuerAnalysis extends EnqueuerAnalysis {
@@ -26,164 +18,20 @@
@Override
public void processNewlyLiveClass(DexProgramClass clazz, EnqueuerWorklist worklist) {
- new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier)
+ new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier::definitionFor)
.visitClassSignature(clazz.getClassSignature());
}
@Override
public void processNewlyLiveField(ProgramField field, ProgramDefinition context) {
- new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier)
+ new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
.visitFieldTypeSignature(field.getDefinition().getGenericSignature());
}
@Override
public void processNewlyLiveMethod(ProgramMethod method, ProgramDefinition context) {
- new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier)
+ new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
.visitMethodSignature(method.getDefinition().getGenericSignature());
}
- private static class GenericSignatureTypeVisitor implements GenericSignatureVisitor {
-
- private final ProgramDefinition context;
- private final EnqueuerDefinitionSupplier enqueuerDefinitionSupplier;
-
- private GenericSignatureTypeVisitor(
- ProgramDefinition context, EnqueuerDefinitionSupplier enqueuerDefinitionSupplier) {
- this.context = context;
- this.enqueuerDefinitionSupplier = enqueuerDefinitionSupplier;
- }
-
- @Override
- public ClassSignature visitClassSignature(ClassSignature classSignature) {
- if (classSignature.hasNoSignature()) {
- return classSignature;
- }
- return classSignature.visit(this);
- }
-
- @Override
- public MethodTypeSignature visitMethodSignature(MethodTypeSignature methodSignature) {
- if (methodSignature.hasNoSignature()) {
- return methodSignature;
- }
- return methodSignature.visit(this);
- }
-
- @Override
- public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
- if (fieldSignature.hasNoSignature()) {
- return fieldSignature;
- }
- if (fieldSignature.isStar()) {
- return fieldSignature;
- }
- if (fieldSignature.isTypeVariableSignature()) {
- return fieldSignature;
- }
- if (fieldSignature.isArrayTypeSignature()) {
- fieldSignature.asArrayTypeSignature().visit(this);
- return fieldSignature;
- }
- assert fieldSignature.isClassTypeSignature();
- return fieldSignature.asClassTypeSignature().visit(this);
- }
-
- @Override
- public List<FormalTypeParameter> visitFormalTypeParameters(
- List<FormalTypeParameter> formalTypeParameters) {
- formalTypeParameters.forEach(formalTypeParameter -> formalTypeParameter.visit(this));
- return formalTypeParameters;
- }
-
- @Override
- public FieldTypeSignature visitClassBound(FieldTypeSignature fieldSignature) {
- return visitFieldTypeSignature(fieldSignature);
- }
-
- @Override
- public List<FieldTypeSignature> visitInterfaceBounds(List<FieldTypeSignature> fieldSignatures) {
- if (fieldSignatures == null) {
- return null;
- }
- fieldSignatures.forEach(this::visitInterfaceBound);
- return fieldSignatures;
- }
-
- @Override
- public FieldTypeSignature visitInterfaceBound(FieldTypeSignature fieldSignature) {
- return visitFieldTypeSignature(fieldSignature);
- }
-
- @Override
- public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
- return classTypeSignature.visit(this);
- }
-
- @Override
- public List<ClassTypeSignature> visitSuperInterfaces(
- List<ClassTypeSignature> interfaceSignatures) {
- if (interfaceSignatures == null) {
- return null;
- }
- interfaceSignatures.forEach(this::visitSuperInterface);
- return interfaceSignatures;
- }
-
- @Override
- public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
- return classTypeSignature.visit(this);
- }
-
- @Override
- public TypeSignature visitTypeSignature(TypeSignature typeSignature) {
- if (typeSignature.isBaseTypeSignature()) {
- return typeSignature;
- }
- assert typeSignature.isFieldTypeSignature();
- return visitFieldTypeSignature(typeSignature.asFieldTypeSignature());
- }
-
- @Override
- public ClassTypeSignature visitSimpleClass(ClassTypeSignature classTypeSignature) {
- return classTypeSignature.visit(this);
- }
-
- @Override
- public ReturnType visitReturnType(ReturnType returnType) {
- if (returnType.isVoidDescriptor()) {
- return returnType;
- }
- visitTypeSignature(returnType.typeSignature);
- return returnType;
- }
-
- @Override
- public List<TypeSignature> visitMethodTypeSignatures(List<TypeSignature> typeSignatures) {
- typeSignatures.forEach(this::visitTypeSignature);
- return typeSignatures;
- }
-
- @Override
- public List<TypeSignature> visitThrowsSignatures(List<TypeSignature> typeSignatures) {
- typeSignatures.forEach(this::visitTypeSignature);
- return typeSignatures;
- }
-
- @Override
- public List<FieldTypeSignature> visitTypeArguments(List<FieldTypeSignature> typeArguments) {
- typeArguments.forEach(this::visitFieldTypeSignature);
- return typeArguments;
- }
-
- @Override
- public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
- return formalTypeParameter.visit(this);
- }
-
- @Override
- public DexType visitType(DexType type) {
- enqueuerDefinitionSupplier.definitionFor(type, context);
- return type;
- }
- }
}
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
new file mode 100644
index 0000000..34500a4
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph;
+
+import com.android.tools.r8.graph.GenericSignature.ClassSignature;
+import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
+import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
+import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
+import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
+import com.android.tools.r8.graph.GenericSignature.ReturnType;
+import com.android.tools.r8.graph.GenericSignature.TypeSignature;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+class GenericSignatureTypeVisitor implements GenericSignatureVisitor {
+
+ private final ProgramDefinition context;
+ private final BiConsumer<DexType, ProgramDefinition> visitedTypeConsumer;
+
+ GenericSignatureTypeVisitor(
+ ProgramDefinition context, BiConsumer<DexType, ProgramDefinition> visitedTypeConsumer) {
+ this.context = context;
+ this.visitedTypeConsumer = visitedTypeConsumer;
+ }
+
+ @Override
+ public ClassSignature visitClassSignature(ClassSignature classSignature) {
+ if (classSignature.hasNoSignature()) {
+ return classSignature;
+ }
+ return classSignature.visit(this);
+ }
+
+ @Override
+ public MethodTypeSignature visitMethodSignature(MethodTypeSignature methodSignature) {
+ if (methodSignature.hasNoSignature()) {
+ return methodSignature;
+ }
+ return methodSignature.visit(this);
+ }
+
+ @Override
+ public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
+ if (fieldSignature.hasNoSignature()) {
+ return fieldSignature;
+ }
+ if (fieldSignature.isStar()) {
+ return fieldSignature;
+ }
+ if (fieldSignature.isTypeVariableSignature()) {
+ return fieldSignature;
+ }
+ if (fieldSignature.isArrayTypeSignature()) {
+ fieldSignature.asArrayTypeSignature().visit(this);
+ return fieldSignature;
+ }
+ assert fieldSignature.isClassTypeSignature();
+ return fieldSignature.asClassTypeSignature().visit(this);
+ }
+
+ @Override
+ public List<FormalTypeParameter> visitFormalTypeParameters(
+ List<FormalTypeParameter> formalTypeParameters) {
+ formalTypeParameters.forEach(formalTypeParameter -> formalTypeParameter.visit(this));
+ return formalTypeParameters;
+ }
+
+ @Override
+ public FieldTypeSignature visitClassBound(FieldTypeSignature fieldSignature) {
+ return visitFieldTypeSignature(fieldSignature);
+ }
+
+ @Override
+ public List<FieldTypeSignature> visitInterfaceBounds(List<FieldTypeSignature> fieldSignatures) {
+ if (fieldSignatures == null) {
+ return null;
+ }
+ fieldSignatures.forEach(this::visitInterfaceBound);
+ return fieldSignatures;
+ }
+
+ @Override
+ public FieldTypeSignature visitInterfaceBound(FieldTypeSignature fieldSignature) {
+ return visitFieldTypeSignature(fieldSignature);
+ }
+
+ @Override
+ public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
+ return classTypeSignature.visit(this);
+ }
+
+ @Override
+ public List<ClassTypeSignature> visitSuperInterfaces(
+ List<ClassTypeSignature> interfaceSignatures) {
+ if (interfaceSignatures == null) {
+ return null;
+ }
+ interfaceSignatures.forEach(this::visitSuperInterface);
+ return interfaceSignatures;
+ }
+
+ @Override
+ public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
+ return classTypeSignature.visit(this);
+ }
+
+ @Override
+ public TypeSignature visitTypeSignature(TypeSignature typeSignature) {
+ if (typeSignature.isBaseTypeSignature()) {
+ return typeSignature;
+ }
+ assert typeSignature.isFieldTypeSignature();
+ return visitFieldTypeSignature(typeSignature.asFieldTypeSignature());
+ }
+
+ @Override
+ public ClassTypeSignature visitSimpleClass(ClassTypeSignature classTypeSignature) {
+ return classTypeSignature.visit(this);
+ }
+
+ @Override
+ public ReturnType visitReturnType(ReturnType returnType) {
+ if (returnType.isVoidDescriptor()) {
+ return returnType;
+ }
+ visitTypeSignature(returnType.typeSignature);
+ return returnType;
+ }
+
+ @Override
+ public List<TypeSignature> visitMethodTypeSignatures(List<TypeSignature> typeSignatures) {
+ typeSignatures.forEach(this::visitTypeSignature);
+ return typeSignatures;
+ }
+
+ @Override
+ public List<TypeSignature> visitThrowsSignatures(List<TypeSignature> typeSignatures) {
+ typeSignatures.forEach(this::visitTypeSignature);
+ return typeSignatures;
+ }
+
+ @Override
+ public List<FieldTypeSignature> visitTypeArguments(List<FieldTypeSignature> typeArguments) {
+ typeArguments.forEach(this::visitFieldTypeSignature);
+ return typeArguments;
+ }
+
+ @Override
+ public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
+ return formalTypeParameter.visit(this);
+ }
+
+ @Override
+ public DexType visitType(DexType type) {
+ visitedTypeConsumer.accept(type, context);
+ return type;
+ }
+}