Revert "Replace pruned type variables with concrete instantiations"

This reverts commit f756610facefd203a3c3b2db797f942a5e470766.


Revert "Add test for generic signatures that should be pruned in fullmode"

This reverts commit fd7d193ed2e7d2e743e206d4c4d2b32e208eaf13.


Revert "Move generic signature visitor to top-level class"

This reverts commit f42347ccbaf806c4db39a5376726ca9288171c1b.

Change-Id: Ifa5f1c2ae9a305e0ae164d966b5553101cc5f35a
diff --git a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
index 9cec3cb..82f34d7 100644
--- a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
+++ b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
@@ -55,10 +55,6 @@
     return enclosingClass;
   }
 
-  public DexType getEnclosingType() {
-    return enclosingMethod != null ? enclosingMethod.getHolderType() : enclosingClass;
-  }
-
   @Override
   public int hashCode() {
     assert (enclosingClass == null) != (enclosingMethod == null);
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
index 9f259ba..bf7c42b 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -139,10 +139,6 @@
       return false;
     }
 
-    default boolean isValid() {
-      return !isInvalid();
-    }
-
     DexDefinitionSignature<T> toInvalid();
   }
 
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 e889a40..ea66ba7 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
@@ -4,9 +4,17 @@
 
 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 {
 
@@ -18,20 +26,164 @@
 
   @Override
   public void processNewlyLiveClass(DexProgramClass clazz, EnqueuerWorklist worklist) {
-    new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier::definitionFor)
+    new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier)
         .visitClassSignature(clazz.getClassSignature());
   }
 
   @Override
   public void processNewlyLiveField(ProgramField field, ProgramDefinition context) {
-    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
+    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier)
         .visitFieldTypeSignature(field.getDefinition().getGenericSignature());
   }
 
   @Override
   public void processNewlyLiveMethod(ProgramMethod method, ProgramDefinition context) {
-    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
+    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier)
         .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/GenericSignaturePartialTypeArgumentApplier.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
deleted file mode 100644
index b9d7386..0000000
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ /dev/null
@@ -1,202 +0,0 @@
-// 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.StarFieldTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.TypeSignature;
-import com.android.tools.r8.graph.GenericSignature.WildcardIndicator;
-import com.android.tools.r8.utils.ListUtils;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class GenericSignaturePartialTypeArgumentApplier implements GenericSignatureVisitor {
-
-  private final Map<String, DexType> substitutions;
-  private final DexType objectType;
-  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;
-    this.objectType = objectType;
-  }
-
-  public static GenericSignaturePartialTypeArgumentApplier build(
-      AppView<?> appView, ClassSignature classSignature, Map<String, DexType> substitutions) {
-    GenericSignaturePartialTypeArgumentApplier applier =
-        new GenericSignaturePartialTypeArgumentApplier(
-            substitutions, appView.dexItemFactory().objectType);
-    classSignature.formalTypeParameters.forEach(
-        parameter -> applier.introducedClassTypeVariables.add(parameter.name));
-    return applier;
-  }
-
-  @Override
-  public ClassSignature visitClassSignature(ClassSignature classSignature) {
-    return classSignature.visit(this);
-  }
-
-  @Override
-  public MethodTypeSignature visitMethodSignature(MethodTypeSignature methodSignature) {
-    assert introducedMethodTypeVariables.isEmpty();
-    methodSignature.formalTypeParameters.forEach(
-        parameter -> introducedMethodTypeVariables.add(parameter.name));
-    MethodTypeSignature rewritten = methodSignature.visit(this);
-    introducedMethodTypeVariables.clear();
-    return rewritten;
-  }
-
-  @Override
-  public DexType visitType(DexType type) {
-    return type;
-  }
-
-  @Override
-  public TypeSignature visitTypeSignature(TypeSignature typeSignature) {
-    if (typeSignature.isBaseTypeSignature()) {
-      return typeSignature;
-    }
-    return visitFieldTypeSignature(typeSignature.asFieldTypeSignature());
-  }
-
-  @Override
-  public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
-    return formalTypeParameter.visit(this);
-  }
-
-  @Override
-  public List<FieldTypeSignature> visitInterfaceBounds(List<FieldTypeSignature> fieldSignatures) {
-    if (fieldSignatures == null || fieldSignatures.isEmpty()) {
-      return fieldSignatures;
-    }
-    return ListUtils.mapOrElse(fieldSignatures, this::visitFieldTypeSignature);
-  }
-
-  @Override
-  public List<ClassTypeSignature> visitSuperInterfaces(
-      List<ClassTypeSignature> interfaceSignatures) {
-    if (interfaceSignatures.isEmpty()) {
-      return interfaceSignatures;
-    }
-    canUseWildcardInArguments = false;
-    List<ClassTypeSignature> map =
-        ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
-    canUseWildcardInArguments = true;
-    return map;
-  }
-
-  @Override
-  public List<FieldTypeSignature> visitTypeArguments(List<FieldTypeSignature> typeArguments) {
-    if (typeArguments.isEmpty()) {
-      return typeArguments;
-    }
-    return ListUtils.mapOrElse(typeArguments, this::visitFieldTypeSignature);
-  }
-
-  @Override
-  public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
-    return classTypeSignature.visit(this);
-  }
-
-  @Override
-  public FieldTypeSignature visitClassBound(FieldTypeSignature fieldSignature) {
-    return visitFieldTypeSignature(fieldSignature);
-  }
-
-  @Override
-  public FieldTypeSignature visitInterfaceBound(FieldTypeSignature fieldSignature) {
-    return visitFieldTypeSignature(fieldSignature);
-  }
-
-  @Override
-  public ClassTypeSignature visitSimpleClass(ClassTypeSignature classTypeSignature) {
-    return classTypeSignature.visit(this);
-  }
-
-  @Override
-  public List<TypeSignature> visitThrowsSignatures(List<TypeSignature> typeSignatures) {
-    if (typeSignatures.isEmpty()) {
-      return typeSignatures;
-    }
-    return ListUtils.mapOrElse(typeSignatures, this::visitTypeSignature);
-  }
-
-  @Override
-  public ReturnType visitReturnType(ReturnType returnType) {
-    if (returnType.isVoidDescriptor()) {
-      return returnType;
-    }
-    TypeSignature originalSignature = returnType.typeSignature;
-    TypeSignature rewrittenSignature = visitTypeSignature(originalSignature);
-    if (originalSignature == rewrittenSignature) {
-      return returnType;
-    }
-    return new ReturnType(rewrittenSignature);
-  }
-
-  @Override
-  public List<FormalTypeParameter> visitFormalTypeParameters(
-      List<FormalTypeParameter> formalTypeParameters) {
-    if (formalTypeParameters.isEmpty()) {
-      return formalTypeParameters;
-    }
-    return ListUtils.mapOrElse(formalTypeParameters, this::visitFormalTypeParameter);
-  }
-
-  @Override
-  public List<TypeSignature> visitMethodTypeSignatures(List<TypeSignature> typeSignatures) {
-    if (typeSignatures.isEmpty()) {
-      return typeSignatures;
-    }
-    return ListUtils.mapOrElse(typeSignatures, this::visitTypeSignature);
-  }
-
-  @Override
-  public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
-    canUseWildcardInArguments = false;
-    ClassTypeSignature visit = classTypeSignature.visit(this);
-    canUseWildcardInArguments = true;
-    return visit;
-  }
-
-  @Override
-  public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
-    if (fieldSignature.isStar()) {
-      return fieldSignature;
-    } else if (fieldSignature.isClassTypeSignature()) {
-      return fieldSignature.asClassTypeSignature().visit(this);
-    } else if (fieldSignature.isArrayTypeSignature()) {
-      return fieldSignature.asArrayTypeSignature().visit(this);
-    } else {
-      assert fieldSignature.isTypeVariableSignature();
-      String typeVariableName = fieldSignature.asTypeVariableSignature().typeVariable();
-      if (substitutions.containsKey(typeVariableName)
-          && !introducedClassTypeVariables.contains(typeVariableName)
-          && !introducedMethodTypeVariables.contains(typeVariableName)) {
-        DexType substitution = substitutions.get(typeVariableName);
-        if (substitution == null) {
-          substitution = objectType;
-        }
-        return substitution == objectType && canUseWildcardInArguments
-            ? StarFieldTypeSignature.getStarFieldTypeSignature()
-            : new ClassTypeSignature(substitution).asArgument(WildcardIndicator.NONE);
-      }
-      return fieldSignature;
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index 0a0124d..6d31cca 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -4,7 +4,10 @@
 
 package com.android.tools.r8.graph;
 
+import static com.android.tools.r8.graph.GenericSignature.EMPTY_SUPER_INTERFACES;
 import static com.android.tools.r8.graph.GenericSignature.EMPTY_TYPE_ARGUMENTS;
+import static com.android.tools.r8.graph.GenericSignature.EMPTY_TYPE_PARAMS;
+import static com.android.tools.r8.graph.GenericSignature.EMPTY_TYPE_SIGNATURES;
 import static com.google.common.base.Predicates.alwaysFalse;
 
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
@@ -117,7 +120,7 @@
     public List<FormalTypeParameter> visitFormalTypeParameters(
         List<FormalTypeParameter> formalTypeParameters) {
       if (formalTypeParameters.isEmpty()) {
-        return formalTypeParameters;
+        return EMPTY_TYPE_PARAMS;
       }
       return ListUtils.mapOrElse(formalTypeParameters, this::visitFormalTypeParameter);
     }
@@ -139,7 +142,7 @@
     public List<ClassTypeSignature> visitSuperInterfaces(
         List<ClassTypeSignature> interfaceSignatures) {
       if (interfaceSignatures.isEmpty()) {
-        return interfaceSignatures;
+        return EMPTY_SUPER_INTERFACES;
       }
       return ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
     }
@@ -153,7 +156,7 @@
     @Override
     public List<TypeSignature> visitMethodTypeSignatures(List<TypeSignature> typeSignatures) {
       if (typeSignatures.isEmpty()) {
-        return typeSignatures;
+        return EMPTY_TYPE_SIGNATURES;
       }
       return ListUtils.mapOrElse(
           typeSignatures,
@@ -183,7 +186,7 @@
     @Override
     public List<TypeSignature> visitThrowsSignatures(List<TypeSignature> typeSignatures) {
       if (typeSignatures.isEmpty()) {
-        return typeSignatures;
+        return EMPTY_TYPE_SIGNATURES;
       }
       // If a throwing type is no longer found we remove it from the signature.
       return ListUtils.mapOrElse(typeSignatures, this::visitTypeSignature);
@@ -196,8 +199,11 @@
 
     @Override
     public List<FieldTypeSignature> visitInterfaceBounds(List<FieldTypeSignature> fieldSignatures) {
-      if (fieldSignatures == null || fieldSignatures.isEmpty()) {
-        return fieldSignatures;
+      if (fieldSignatures == null) {
+        return null;
+      }
+      if (fieldSignatures.isEmpty()) {
+        return EMPTY_TYPE_ARGUMENTS;
       }
       return ListUtils.mapOrElse(fieldSignatures, this::visitFieldTypeSignature);
     }
@@ -215,7 +221,7 @@
     @Override
     public List<FieldTypeSignature> visitTypeArguments(List<FieldTypeSignature> typeArguments) {
       if (typeArguments.isEmpty()) {
-        return typeArguments;
+        return EMPTY_TYPE_ARGUMENTS;
       }
       return ListUtils.mapOrElse(
           typeArguments,
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java
deleted file mode 100644
index 4e674fb..0000000
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVariableRemover.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// 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.FieldTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-
-public class GenericSignatureTypeVariableRemover {
-
-  private final AppView<?> appView;
-  private final Predicate<InnerClassAttribute> innerClassPruned;
-  private final Predicate<EnclosingMethodAttribute> enclosingClassOrMethodPruned;
-
-  public GenericSignatureTypeVariableRemover(
-      AppView<?> appView,
-      Predicate<InnerClassAttribute> innerClassPruned,
-      Predicate<EnclosingMethodAttribute> enclosingClassOrMethodPruned) {
-    this.appView = appView;
-    this.innerClassPruned = innerClassPruned;
-    this.enclosingClassOrMethodPruned = enclosingClassOrMethodPruned;
-  }
-
-  public void removeDeadGenericSignatureTypeVariables(DexProgramClass clazz) {
-    if (clazz.getClassSignature().hasNoSignature() || clazz.getClassSignature().isInvalid()) {
-      return;
-    }
-    Map<String, DexType> substitutions = new HashMap<>();
-    getPrunedTypeParameters(clazz, substitutions, false);
-    if (substitutions.isEmpty()) {
-      return;
-    }
-    GenericSignaturePartialTypeArgumentApplier genericSignatureTypeArgumentApplier =
-        GenericSignaturePartialTypeArgumentApplier.build(
-            appView, clazz.getClassSignature(), substitutions);
-    clazz.setClassSignature(
-        genericSignatureTypeArgumentApplier.visitClassSignature(clazz.getClassSignature()));
-    clazz
-        .methods()
-        .forEach(
-            method -> {
-              if (method.getGenericSignature().hasSignature()
-                  && method.getGenericSignature().isValid()
-                  && method.isVirtualMethod()) {
-                method.setGenericSignature(
-                    genericSignatureTypeArgumentApplier.visitMethodSignature(
-                        method.getGenericSignature()));
-              }
-            });
-    clazz
-        .instanceFields()
-        .forEach(
-            field -> {
-              if (field.getGenericSignature().hasSignature()
-                  && field.getGenericSignature().isValid()) {
-                field.setGenericSignature(
-                    genericSignatureTypeArgumentApplier.visitFieldTypeSignature(
-                        field.getGenericSignature()));
-              }
-            });
-  }
-
-  private void getPrunedTypeParameters(
-      DexClass clazz, Map<String, DexType> substitutions, boolean seenPruned) {
-    InnerClassAttribute innerClassAttribute = clazz.getInnerClassAttributeForThisClass();
-    if (innerClassAttribute != null
-        && innerClassAttribute.getOuter() != null
-        && (seenPruned || innerClassPruned.test(innerClassAttribute))) {
-      DexClass outerClass = appView.definitionFor(innerClassAttribute.getOuter());
-      if (outerClass != null && outerClass.getClassSignature().isValid()) {
-        updateMap(outerClass.getClassSignature().getFormalTypeParameters(), substitutions);
-        getPrunedTypeParameters(outerClass, substitutions, true);
-      }
-    }
-    if (clazz.getEnclosingMethodAttribute() != null
-        && (seenPruned || enclosingClassOrMethodPruned.test(clazz.getEnclosingMethodAttribute()))) {
-      DexClass outerClass =
-          appView.definitionFor(clazz.getEnclosingMethodAttribute().getEnclosingType());
-      if (outerClass == null) {
-        return;
-      }
-      if (clazz.getEnclosingMethodAttribute().getEnclosingMethod() != null) {
-        DexEncodedMethod enclosingMethod =
-            outerClass.lookupMethod(clazz.getEnclosingMethodAttribute().getEnclosingMethod());
-        if (enclosingMethod != null) {
-          updateMap(enclosingMethod.getGenericSignature().getFormalTypeParameters(), substitutions);
-          if (enclosingMethod.isStatic()) {
-            return;
-          }
-        }
-      }
-      if (outerClass.getClassSignature().isValid()) {
-        updateMap(outerClass.getClassSignature().getFormalTypeParameters(), substitutions);
-      }
-      getPrunedTypeParameters(outerClass, substitutions, true);
-    }
-  }
-
-  private void updateMap(
-      List<FormalTypeParameter> formalTypeParameters, Map<String, DexType> substitutions) {
-    // We are updating the map going from inner most to outer, thus the any overriding formal type
-    // parameters will be in the substitution map already.
-    formalTypeParameters.forEach(
-        parameter -> {
-          if (substitutions.containsKey(parameter.getName())) {
-            return;
-          }
-          // The null substitution will use the wildcard as argument, which is smaller than using
-          // Ljava/lang/Object;
-          DexType substitution = null;
-          FieldTypeSignature classBound = parameter.getClassBound();
-          if (classBound != null && classBound.isClassTypeSignature()) {
-            substitution = classBound.asClassTypeSignature().type();
-          }
-          substitutions.put(parameter.getName(), substitution);
-        });
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
deleted file mode 100644
index 34500a4..0000000
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// 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;
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index 3893e32..2c57aa4 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.GenericSignatureTypeRewriter;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -19,11 +20,13 @@
   private final AppView<?> appView;
   private final NamingLens namingLens;
   private final InternalOptions options;
+  private final Reporter reporter;
 
   public GenericSignatureRewriter(AppView<?> appView, NamingLens namingLens) {
     this.appView = appView;
     this.namingLens = namingLens;
     this.options = appView.options();
+    this.reporter = options.reporter;
   }
 
   public void run(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 577ecc2..ef2f149 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.GenericSignatureTypeVariableRemover;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.NestMemberClassAttribute;
 import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
@@ -46,7 +45,6 @@
   private final UnusedItemsPrinter unusedItemsPrinter;
   private final Set<DexType> prunedTypes = Sets.newIdentityHashSet();
   private final Set<DexMethod> methodsToKeepForConfigurationDebugging = Sets.newIdentityHashSet();
-  private final GenericSignatureTypeVariableRemover typeVariableRemover;
 
   public TreePruner(AppView<AppInfoWithLiveness> appView) {
     this(appView, DefaultTreePrunerConfiguration.getInstance());
@@ -63,11 +61,6 @@
                     ExceptionUtils.withConsumeResourceHandler(
                         options.reporter, options.usageInformationConsumer, s))
             : UnusedItemsPrinter.DONT_PRINT;
-    this.typeVariableRemover =
-        new GenericSignatureTypeVariableRemover(
-            appView,
-            this::isAttributeReferencingMissingOrPrunedType,
-            this::isAttributeReferencingPrunedItem);
   }
 
   public DirectMappedDexApplication run(ExecutorService executorService) throws ExecutionException {
@@ -200,7 +193,6 @@
     if (reachableStaticFields != null) {
       clazz.setStaticFields(reachableStaticFields);
     }
-    typeVariableRemover.removeDeadGenericSignatureTypeVariables(clazz);
     clazz.removeInnerClasses(this::isAttributeReferencingMissingOrPrunedType);
     clazz.removeEnclosingMethodAttribute(this::isAttributeReferencingPrunedItem);
     rewriteNestAttributes(clazz);
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepReferencesPruneTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepReferencesPruneTest.java
deleted file mode 100644
index 1c3ddbb..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepReferencesPruneTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// 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.genericsignature;
-
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.graph.genericsignature.testclasses.Foo;
-import com.android.tools.r8.graph.genericsignature.testclasses.I;
-import com.android.tools.r8.graph.genericsignature.testclasses.J;
-import com.android.tools.r8.graph.genericsignature.testclasses.K;
-import com.android.tools.r8.graph.genericsignature.testclasses.L;
-import com.android.tools.r8.graph.genericsignature.testclasses.Main;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class GenericSignatureKeepReferencesPruneTest extends TestBase {
-
-  private final String[] EXPECTED =
-      new String[] {
-        Foo.class.getTypeName() + "<java.lang.String>",
-        I.class.getTypeName()
-            + "<java.lang.Integer, "
-            + Foo.class.getTypeName()
-            + "<java.lang.Integer>>",
-        I.class.getTypeName()
-            + "<java.lang.String, "
-            + Foo.class.getTypeName()
-            + "<java.lang.String>>",
-        "Hello world"
-      };
-
-  private final TestParameters parameters;
-  private final boolean isCompat;
-
-  @Parameters(name = "{0}, isCompat: {1}")
-  public static List<Object[]> data() {
-    return buildParameters(
-        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
-  }
-
-  public GenericSignatureKeepReferencesPruneTest(TestParameters parameters, boolean isCompat) {
-    this.parameters = parameters;
-    this.isCompat = isCompat;
-  }
-
-  @Test
-  public void testJvm() throws Exception {
-    assumeTrue(parameters.isCfRuntime());
-    testForJvm()
-        .addProgramClasses(I.class, Foo.class, J.class, K.class, L.class)
-        .addProgramClassesAndInnerClasses(Main.class)
-        .run(parameters.getRuntime(), Main.class)
-        .assertSuccessWithOutputLines(EXPECTED);
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    (isCompat ? testForR8Compat(parameters.getBackend()) : testForR8(parameters.getBackend()))
-        .addProgramClasses(I.class, Foo.class, J.class, K.class, L.class)
-        .addProgramClassesAndInnerClasses(Main.class)
-        .addKeepClassAndMembersRules(Main.class)
-        .setMinApi(parameters.getApiLevel())
-        .addKeepAttributeSignature()
-        .addKeepAttributeInnerClassesAndEnclosingMethod()
-        .enableInliningAnnotations()
-        .enableNeverClassInliningAnnotations()
-        .noMinification()
-        .run(parameters.getRuntime(), Main.class)
-        // TODO(b/184927364): Should have different output due to pruning the inner class.
-        .assertSuccessWithOutputLines(EXPECTED)
-        .inspect(this::inspectSignatures);
-  }
-
-  private void inspectSignatures(CodeInspector inspector) {
-    ClassSubject fooClass = inspector.clazz(Foo.class);
-    assertThat(fooClass, isPresent());
-    // TODO(b/184927364): Fullmode should not keep the interface bound.
-    assertEquals(
-        "<T::Ljava/lang/Comparable<TT;>;>Ljava/lang/Object;",
-        fooClass.getFinalSignatureAttribute());
-    ClassSubject iClass = inspector.clazz(I.class);
-    assertThat(iClass, isPresent());
-    // TODO(b/184927364): Fullmode should not keep the interface and class bound.
-    assertEquals(
-        "<T::Ljava/lang/Comparable<TT;>;R:L" + binaryName(Foo.class) + "<TT;>;>Ljava/lang/Object;",
-        iClass.getFinalSignatureAttribute());
-    ClassSubject fooInnerClass = inspector.clazz(Main.class.getTypeName() + "$1");
-    assertThat(fooInnerClass, isPresent());
-    // TODO(b/184927364): Fullmode should completely remove this signature
-    assertEquals(
-        "Ljava/lang/Object;L"
-            + binaryName(I.class)
-            + "<Ljava/lang/String;L"
-            + binaryName(Foo.class)
-            + "<Ljava/lang/String;>;>;",
-        fooInnerClass.getFinalSignatureAttribute());
-  }
-}
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
deleted file mode 100644
index 608b8d3..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.genericsignature;
-
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class GenericSignaturePrunedOuterTest extends TestBase {
-
-  private final TestParameters parameters;
-  private final boolean isCompat;
-
-  @Parameters(name = "{0}, isCompat: {1}")
-  public static List<Object[]> data() {
-    return buildParameters(
-        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
-  }
-
-  public GenericSignaturePrunedOuterTest(TestParameters parameters, boolean isCompat) {
-    this.parameters = parameters;
-    this.isCompat = isCompat;
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    (isCompat ? testForR8Compat(parameters.getBackend()) : testForR8(parameters.getBackend()))
-        .addInnerClasses(getClass())
-        .addKeepClassAndMembersRules(Foo.class)
-        .addKeepMainRule(Main.class)
-        .addKeepAttributeSignature()
-        .addKeepAttributeInnerClassesAndEnclosingMethod()
-        .setMinApi(parameters.getApiLevel())
-        .addOptionsModification(options -> options.horizontalClassMergerOptions().disable())
-        .run(parameters.getRuntime(), Main.class)
-        .assertSuccessWithOutputLines(
-            "Bar::enclosingMethod", "Hello World", "Bar::enclosingMethod2", "Hello World")
-        .inspect(this::checkSignatures);
-  }
-
-  public void checkSignatures(CodeInspector inspector) {
-    checkSignature(
-        inspector.clazz(Bar.class.getTypeName() + "$1"),
-        "L"
-            + binaryName(Foo.class)
-            + "<"
-            + descriptor(Object.class)
-            + descriptor(Main.class)
-            + ">;");
-    checkSignature(
-        inspector.clazz(Bar.class.getTypeName() + "$2"),
-        "L"
-            + binaryName(Foo.class)
-            + "<"
-            + descriptor(Object.class)
-            + descriptor(Object.class)
-            + ">;");
-  }
-
-  private void checkSignature(ClassSubject classSubject, String expectedSignature) {
-    assertThat(classSubject, isPresent());
-    // TODO(b/185098797): Make sure to work for full mode.
-    if (!isCompat) {
-      return;
-    }
-    assertEquals(expectedSignature, classSubject.getFinalSignatureAttribute());
-  }
-
-  public abstract static class Foo<T, R> {
-
-    R foo(T r) {
-      System.out.println("Hello World");
-      return null;
-    }
-  }
-
-  public static class Bar {
-
-    public static <T, R extends Main> Foo<T, R> enclosingMethod() {
-      return new Foo<T, R>() {
-        @Override
-        R foo(T r) {
-          System.out.println("Bar::enclosingMethod");
-          return super.foo(r);
-        }
-      };
-    }
-
-    public static <T, R> Foo<T, R> enclosingMethod2() {
-      return new Foo<T, R>() {
-        @Override
-        R foo(T r) {
-          System.out.println("Bar::enclosingMethod2");
-          return super.foo(r);
-        }
-      };
-    }
-
-    public static void run() {
-      enclosingMethod().foo(null);
-      enclosingMethod2().foo(null);
-    }
-  }
-
-  public static class Main {
-
-    public static void main(String[] args) {
-      Bar.run();
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Foo.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Foo.java
deleted file mode 100644
index 81000d6..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Foo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.genericsignature.testclasses;
-
-import com.android.tools.r8.NeverClassInline;
-import com.android.tools.r8.NeverInline;
-
-@NeverClassInline
-public class Foo<T extends Comparable<T>> implements J, K<T> {
-
-  @Override
-  @NeverInline
-  public String bar(String t) {
-    System.out.println("Foo::bar");
-    return t;
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/I.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/I.java
deleted file mode 100644
index 089286d..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/I.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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.genericsignature.testclasses;
-
-import com.android.tools.r8.NeverInline;
-
-public interface I<T extends Comparable<T>, R extends Foo<T>> extends L<R> {
-  @NeverInline
-  T method(T t);
-}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/J.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/J.java
deleted file mode 100644
index 8deed10..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/J.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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.genericsignature.testclasses;
-
-public interface J {
-
-  String bar(String t);
-}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/K.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/K.java
deleted file mode 100644
index 608c12d..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/K.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// 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.genericsignature.testclasses;
-
-public interface K<T> {}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/L.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/L.java
deleted file mode 100644
index bf3895b..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/L.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// 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.genericsignature.testclasses;
-
-public interface L<T> {}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Main.java b/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Main.java
deleted file mode 100644
index ccf9f04..0000000
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/testclasses/Main.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.genericsignature.testclasses;
-
-import java.lang.reflect.Type;
-
-public class Main extends Foo<String> implements I<Integer, Foo<Integer>> {
-
-  public static <T extends I<String, Foo<String>>> T test(T t) {
-    for (Type genericInterface : t.getClass().getGenericInterfaces()) {
-      System.out.println(genericInterface);
-    }
-    t.method("Hello world");
-    return t;
-  }
-
-  public static void main(String[] args) {
-    System.out.println(Main.class.getGenericSuperclass());
-    for (Type genericInterface : Main.class.getGenericInterfaces()) {
-      System.out.println(genericInterface);
-    }
-    test(
-        new I<String, Foo<String>>() {
-          @Override
-          public String method(String s) {
-            System.out.println(s);
-            return s;
-          }
-        });
-  }
-
-  @Override
-  public Integer method(Integer integer) {
-    System.out.println("Main::method");
-    return integer;
-  }
-}