Introduce new KotlinMetadataUseRegistry

This changes the accept(DexDefinitionSupplier) method of the EnqueuerMetadataTraceable interface to accept(KotlinMetadataUseRegistry).

The KotlinMetadataUseRegistry interface declares a single acceptType(Dextype) method.

Bug: b/409260720
Change-Id: I4b5aa15a0cb53f49cdee06c503712d253a0539df
diff --git a/src/main/java/com/android/tools/r8/kotlin/ConcreteKotlinPropertyInfo.java b/src/main/java/com/android/tools/r8/kotlin/ConcreteKotlinPropertyInfo.java
index aa46ee2..6fa9e6b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/ConcreteKotlinPropertyInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/ConcreteKotlinPropertyInfo.java
@@ -9,7 +9,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -201,30 +200,30 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    returnType.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    returnType.trace(registry);
     if (receiverParameterType != null) {
-      receiverParameterType.trace(definitionSupplier);
+      receiverParameterType.trace(registry);
     }
     if (setterParameter != null) {
-      setterParameter.trace(definitionSupplier);
+      setterParameter.trace(registry);
     }
-    forEachApply(typeParameters, param -> param::trace, definitionSupplier);
-    forEachApply(contextReceiverTypes, type -> type::trace, definitionSupplier);
+    forEachApply(typeParameters, param -> param::trace, registry);
+    forEachApply(contextReceiverTypes, type -> type::trace, registry);
     if (fieldSignature != null) {
-      fieldSignature.trace(definitionSupplier);
+      fieldSignature.trace(registry);
     }
     if (getterSignature != null) {
-      getterSignature.trace(definitionSupplier);
+      getterSignature.trace(registry);
     }
     if (setterSignature != null) {
-      setterSignature.trace(definitionSupplier);
+      setterSignature.trace(registry);
     }
     if (syntheticMethodForAnnotations != null) {
-      syntheticMethodForAnnotations.trace(definitionSupplier);
+      syntheticMethodForAnnotations.trace(registry);
     }
     if (syntheticMethodForDelegate != null) {
-      syntheticMethodForDelegate.trace(definitionSupplier);
+      syntheticMethodForDelegate.trace(registry);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java
index ffbbe57..75249b6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -71,8 +70,8 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
-      value.trace(definitionSupplier);
+    public void trace(KotlinMetadataUseRegistry registry) {
+      value.trace(registry);
     }
 
     @Override
@@ -102,8 +101,8 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
-      enumClassName.trace(definitionSupplier);
+    public void trace(KotlinMetadataUseRegistry registry) {
+      enumClassName.trace(registry);
     }
 
     @Override
@@ -131,8 +130,8 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
-      value.trace(definitionSupplier);
+    public void trace(KotlinMetadataUseRegistry registry) {
+      value.trace(registry);
     }
 
     @Override
@@ -170,9 +169,9 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       for (KotlinAnnotationArgumentInfo kotlinAnnotationArgumentInfo : value) {
-        kotlinAnnotationArgumentInfo.trace(definitionSupplier);
+        kotlinAnnotationArgumentInfo.trace(registry);
       }
     }
 
@@ -208,7 +207,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // Nothing to trace
     }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
index 85fd152..5022d8c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.BooleanBox;
@@ -80,8 +79,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    annotationType.trace(definitionSupplier);
-    arguments.forEach((ignored, arg) -> arg.trace(definitionSupplier));
+  public void trace(KotlinMetadataUseRegistry registry) {
+    annotationType.trace(registry);
+    arguments.forEach((ignored, arg) -> arg.trace(registry));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index 023937c..4197ffc 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -12,7 +12,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -458,18 +457,18 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(constructorsWithNoBacking, constructor -> constructor::trace, definitionSupplier);
-    declarationContainerInfo.trace(definitionSupplier);
-    forEachApply(typeParameters, param -> param::trace, definitionSupplier);
-    forEachApply(superTypes, type -> type::trace, definitionSupplier);
-    forEachApply(sealedSubClasses, sealedClass -> sealedClass::trace, definitionSupplier);
-    forEachApply(nestedClasses, nested -> nested::trace, definitionSupplier);
-    forEachApply(contextReceiverTypes, nested -> nested::trace, definitionSupplier);
-    localDelegatedProperties.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(constructorsWithNoBacking, constructor -> constructor::trace, registry);
+    declarationContainerInfo.trace(registry);
+    forEachApply(typeParameters, param -> param::trace, registry);
+    forEachApply(superTypes, type -> type::trace, registry);
+    forEachApply(sealedSubClasses, sealedClass -> sealedClass::trace, registry);
+    forEachApply(nestedClasses, nested -> nested::trace, registry);
+    forEachApply(contextReceiverTypes, nested -> nested::trace, registry);
+    localDelegatedProperties.trace(registry);
     // TODO(b/154347404): trace enum entries.
     if (anonymousObjectOrigin != null) {
-      anonymousObjectOrigin.trace(definitionSupplier);
+      anonymousObjectOrigin.trace(registry);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
index 715d376..018c084 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationElement;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -142,11 +141,8 @@
     }
   }
 
-  public static boolean hasKotlinClassMetadataAnnotation(
-      DexClass clazz, DexDefinitionSupplier definitionSupplier) {
-    return clazz
-        .annotations()
-        .hasAnnotation(definitionSupplier.dexItemFactory().kotlinMetadataType);
+  public static boolean hasKotlinClassMetadataAnnotation(DexClass clazz, DexItemFactory factory) {
+    return clazz.annotations().hasAnnotation(factory.kotlinMetadataType);
   }
 
   public static KotlinClassMetadata toKotlinClassMetadata(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
index 83f3612..c3eb30f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getKotlinLocalOrAnonymousNameFromDescriptor;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.lens.GraphLens;
@@ -77,8 +76,8 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
-      type.trace(definitionSupplier);
+    public void trace(KotlinMetadataUseRegistry registry) {
+      type.trace(registry);
     }
 
     @Override
@@ -102,7 +101,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // Intentionally empty.
     }
   }
@@ -122,7 +121,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // Intentionally empty.
     }
   }
@@ -141,7 +140,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // Intentionally empty.
     }
   }
@@ -160,7 +159,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // Intentionally empty.
     }
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinCompanionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinCompanionInfo.java
index 7cbe845..3994d6e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinCompanionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinCompanionInfo.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.naming.NamingLens;
@@ -37,7 +36,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     // Do nothing.
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
index 44fb122..1ef627c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.utils.Reporter;
@@ -80,10 +79,10 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(valueParameters, param -> param::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(valueParameters, param -> param::trace, registry);
     if (signature != null) {
-      signature.trace(definitionSupplier);
+      signature.trace(registry);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java
index 4fb6774..73656ff 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -45,8 +44,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(effects, effect -> effect::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(effects, effect -> effect::trace, registry);
   }
 
   boolean rewrite(Consumer<KmContract> consumer, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index d1d9441..0c28fa7 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -11,7 +11,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -269,10 +268,10 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(typeAliases, alias -> alias::trace, definitionSupplier);
-    forEachApply(functionsWithNoBacking, function -> function::trace, definitionSupplier);
-    forEachApply(propertiesWithNoBacking, property -> property::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(typeAliases, alias -> alias::trace, registry);
+    forEachApply(functionsWithNoBacking, function -> function::trace, registry);
+    forEachApply(propertiesWithNoBacking, property -> property::trace, registry);
   }
 
   public static class KotlinPropertyGroup {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java
index f87cd78..4cd7159 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java
@@ -9,7 +9,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -67,15 +66,15 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (this == NO_EXPRESSION) {
       return;
     }
     if (isInstanceType != null) {
-      isInstanceType.trace(definitionSupplier);
+      isInstanceType.trace(registry);
     }
-    forEachApply(andArguments, arg -> arg::trace, definitionSupplier);
-    forEachApply(orArguments, arg -> arg::trace, definitionSupplier);
+    forEachApply(andArguments, arg -> arg::trace, registry);
+    forEachApply(orArguments, arg -> arg::trace, registry);
   }
 
   boolean rewrite(Consumer<KmEffectExpression> consumer, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java
index 6fc3950..1d1dfdd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -45,9 +44,9 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(constructorArguments, arg -> arg::trace, definitionSupplier);
-    conclusion.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(constructorArguments, arg -> arg::trace, registry);
+    conclusion.trace(registry);
   }
 
   boolean rewrite(Consumer<KmEffect> consumer, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinEnumEntryInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinEnumEntryInfo.java
index 4c3197d..b7cd142 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinEnumEntryInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinEnumEntryInfo.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.naming.NamingLens;
@@ -37,7 +36,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     // Do nothing.
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
index c845cea..91a92cc 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.Pair;
 import java.util.function.Consumer;
@@ -78,7 +77,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    packageInfo.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    packageInfo.trace(registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java
index 08e7085..db35d6f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -53,7 +52,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (this == NO_FLEXIBLE_UPPER_BOUND) {
       return;
     }
@@ -61,6 +60,6 @@
       assert false;
       return;
     }
-    kotlinTypeInfo.trace(definitionSupplier);
+    kotlinTypeInfo.trace(registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
index c880a0e..ac718b1 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -9,7 +9,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.utils.ListUtils;
@@ -195,20 +194,20 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(valueParameters, param -> param::trace, definitionSupplier);
-    returnType.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(valueParameters, param -> param::trace, registry);
+    returnType.trace(registry);
     if (receiverParameterType != null) {
-      receiverParameterType.trace(definitionSupplier);
+      receiverParameterType.trace(registry);
     }
-    forEachApply(typeParameters, param -> param::trace, definitionSupplier);
-    forEachApply(contextReceiverTypes, type -> type::trace, definitionSupplier);
+    forEachApply(typeParameters, param -> param::trace, registry);
+    forEachApply(contextReceiverTypes, type -> type::trace, registry);
     if (signature != null) {
-      signature.trace(definitionSupplier);
+      signature.trace(registry);
     }
     if (lambdaClassOrigin != null) {
-      lambdaClassOrigin.trace(definitionSupplier);
+      lambdaClassOrigin.trace(registry);
     }
-    contract.trace(definitionSupplier);
+    contract.trace(registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
index 2c5598d..43c41b6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -56,7 +55,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    type.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    type.trace(registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
index 917f242..62f77de 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -121,12 +120,12 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (invalidDescriptor != null) {
       return;
     }
     assert returnType != null;
-    returnType.trace(definitionSupplier);
-    forEachApply(parameters, param -> param::trace, definitionSupplier);
+    returnType.trace(registry);
+    forEachApply(parameters, param -> param::trace, registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index d9ecef0..86f7b3d 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -66,7 +65,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    function.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    function.trace(registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java
index 94a2001..1428dac 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -48,8 +47,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(propertyInfos, prop -> prop::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(propertyInfos, prop -> prop::trace, registry);
   }
 
   boolean rewrite(Consumer<KmProperty> consumer, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index 26a1258..4cad91a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -7,12 +7,9 @@
 import static com.android.tools.r8.kotlin.KotlinClassMetadataReader.hasKotlinClassMetadataAnnotation;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
 
-import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -39,6 +36,7 @@
 
   private final AppView<?> appView;
   private final EnqueuerDefinitionSupplier enqueuerDefinitionSupplier;
+  private final DexItemFactory factory;
   private final Set<DexType> prunedTypes;
   private final AtomicBoolean reportedUnknownMetadataVersion = new AtomicBoolean(false);
 
@@ -48,6 +46,7 @@
       Set<DexType> prunedTypes) {
     this.appView = appView;
     this.enqueuerDefinitionSupplier = enqueuerDefinitionSupplier;
+    this.factory = appView.dexItemFactory();
     this.prunedTypes = prunedTypes;
   }
 
@@ -78,7 +77,7 @@
     // In the first round of tree shaking build up all metadata such that it can be traced later.
     boolean keepKotlinMetadata =
         KeepClassInfo.isKotlinMetadataClassKept(
-            appView.dexItemFactory(),
+            factory,
             appView.options(),
             appView.appInfo()::definitionForWithoutExistenceAssert,
             enqueuer::getKeepInfo);
@@ -100,8 +99,7 @@
               clazz.clearKotlinInfo();
               clazz.removeAnnotations(
                   annotation ->
-                      annotation.getAnnotationType()
-                          == appView.dexItemFactory().kotlinMetadataType);
+                      annotation.getAnnotationType().isIdenticalTo(factory.kotlinMetadataType));
             } else {
               clazz.setKotlinInfo(
                   KotlinClassMetadataReader.getKotlinInfo(
@@ -119,8 +117,8 @@
         EnclosingMethodAttribute enclosingAttribute =
             localOrAnonymousClass.getEnclosingMethodAttribute();
         DexClass holder =
-            definitionsForContext(localOrAnonymousClass)
-                .definitionForHolder(enclosingAttribute.getEnclosingMethod());
+            enqueuerDefinitionSupplier.definitionFor(
+                enclosingAttribute.getEnclosingMethod().getHolderType(), localOrAnonymousClass);
         if (holder == null) {
           continue;
         }
@@ -147,12 +145,11 @@
               clazz.members().forEach(DexEncodedMember::clearKotlinInfo);
               clazz.removeAnnotations(
                   annotation ->
-                      annotation.getAnnotationType()
-                          == appView.dexItemFactory().kotlinMetadataType);
+                      annotation.getAnnotationType().isIdenticalTo(factory.kotlinMetadataType));
             } else {
               // Use the concrete getNoKotlinInfo() instead of isNoKotlinInformation() to handle
               // invalid kotlin info as well.
-              assert hasKotlinClassMetadataAnnotation(clazz, definitionsForContext(clazz))
+              assert hasKotlinClassMetadataAnnotation(clazz, factory)
                       == (clazz.getKotlinInfo() != getNoKotlinInfo())
                   : clazz.toSourceString()
                       + " "
@@ -170,7 +167,7 @@
         });
   }
 
-  public class KotlinMetadataDefinitionSupplier implements DexDefinitionSupplier {
+  private static class KotlinMetadataDefinitionSupplier implements KotlinMetadataUseRegistry {
 
     private final ProgramDefinition context;
     private final EnqueuerDefinitionSupplier enqueuerDefinitionSupplier;
@@ -186,24 +183,14 @@
     }
 
     @Override
-    public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
-      throw new Unreachable("Not yet used");
-    }
-
-    @Override
-    public DexClass definitionFor(DexType type) {
+    public void registerType(DexType type) {
       // TODO(b/157700128) Metadata cannot at this point keep anything alive. Therefore, if a type
       //  has been pruned it may still be referenced, so we do an early check here to ensure it will
       //  not end up as. Ideally, those types should be removed by a pass on the modeled data.
       if (prunedTypes != null && prunedTypes.contains(type)) {
-        return null;
+        return;
       }
-      return enqueuerDefinitionSupplier.definitionFor(type, context);
-    }
-
-    @Override
-    public DexItemFactory dexItemFactory() {
-      return appView.dexItemFactory();
+      enqueuerDefinitionSupplier.definitionFor(type, context);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index a7cb201..ae75ef0 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -9,14 +9,11 @@
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataWriter.kotlinMetadataToString;
 
-import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationElement;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -197,36 +194,20 @@
       DexProgramClass clazz, KotlinClassLevelInfo kotlinInfo) {
     if (appView.options().partialSubCompilationConfiguration != null) {
       assert appView.options().partialSubCompilationConfiguration.isR8();
-      DexDefinitionSupplier definitionSupplier =
-          new DexDefinitionSupplier() {
-            @Override
-            public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(
-                DexType type) {
-              throw new Unreachable();
-            }
-
-            @Override
-            public DexClass definitionFor(DexType type) {
-              DexClass result = appView.appInfo().definitionForWithoutExistenceAssert(type);
-              if (result == null) {
-                appView
-                    .options()
-                    .partialSubCompilationConfiguration
-                    .asR8()
-                    .d8MissingClasses
-                    .add(type);
-              }
-              return result;
-            }
-
-            @Override
-            public DexItemFactory dexItemFactory() {
-              throw new Unreachable();
+      KotlinMetadataUseRegistry registry =
+          type -> {
+            DexClass result = appView.appInfo().definitionForWithoutExistenceAssert(type);
+            if (result == null) {
+              appView
+                  .options()
+                  .partialSubCompilationConfiguration
+                  .asR8()
+                  .d8MissingClasses
+                  .add(type);
             }
           };
-      kotlinInfo.trace(definitionSupplier);
-      clazz.forEachProgramMember(
-          member -> member.getDefinition().getKotlinInfo().trace(definitionSupplier));
+      kotlinInfo.trace(registry);
+      clazz.forEachProgramMember(member -> member.getDefinition().getKotlinInfo().trace(registry));
     }
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUseRegistry.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUseRegistry.java
new file mode 100644
index 0000000..b6408c5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUseRegistry.java
@@ -0,0 +1,11 @@
+// Copyright (c) 2025, 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.kotlin;
+
+import com.android.tools.r8.graph.DexType;
+
+public interface KotlinMetadataUseRegistry {
+
+  void registerType(DexType type);
+}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index a4c7ec6..a3ee56a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
@@ -72,7 +71,7 @@
     }
 
     @Override
-    public void trace(DexDefinitionSupplier definitionSupplier) {
+    public void trace(KotlinMetadataUseRegistry registry) {
       // No information needed to trace.
     }
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
index f29f38b..8a7efd8 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
@@ -89,7 +88,7 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(partClassNames, type -> type::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(partClassNames, type -> type::trace, registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
index 2f8381b..b127f0a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.Pair;
 import java.util.function.Consumer;
@@ -76,8 +75,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    packageInfo.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    packageInfo.trace(registry);
   }
 
   public String getFacadeClassName() {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
index 2771257..36bfab9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -88,9 +87,9 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    containerInfo.trace(definitionSupplier);
-    localDelegatedProperties.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    containerInfo.trace(registry);
+    localDelegatedProperties.trace(registry);
   }
 
   public String getModuleName() {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfoDelegate.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfoDelegate.java
index 095f87a..fc11196 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfoDelegate.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfoDelegate.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import java.util.function.Consumer;
@@ -71,8 +70,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    delegate.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    delegate.trace(registry);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index c45373e..4c34c40 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.Pair;
 import kotlin.Metadata;
@@ -85,9 +84,9 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (lambda != null) {
-      lambda.trace(definitionSupplier);
+      lambda.trace(registry);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java
index 9371fa1..bb87bb2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -73,10 +72,10 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    underlyingType.trace(definitionSupplier);
-    expandedType.trace(definitionSupplier);
-    forEachApply(typeParameters, typeParam -> typeParam::trace, definitionSupplier);
-    forEachApply(annotations, annotation -> annotation::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    underlyingType.trace(registry);
+    expandedType.trace(registry);
+    forEachApply(typeParameters, typeParam -> typeParam::trace, registry);
+    forEachApply(annotations, annotation -> annotation::trace, registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
index 25dc018..518e769 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
@@ -9,7 +9,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.lens.GraphLens;
@@ -113,17 +112,17 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    classifier.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    classifier.trace(registry);
     if (abbreviatedType != null) {
-      abbreviatedType.trace(definitionSupplier);
+      abbreviatedType.trace(registry);
     }
     if (outerType != null) {
-      outerType.trace(definitionSupplier);
+      outerType.trace(registry);
     }
-    forEachApply(arguments, argument -> argument::trace, definitionSupplier);
-    flexibleTypeUpperBound.trace(definitionSupplier);
-    forEachApply(annotations, annotation -> annotation::trace, definitionSupplier);
+    forEachApply(arguments, argument -> argument::trace, registry);
+    flexibleTypeUpperBound.trace(registry);
+    forEachApply(annotations, annotation -> annotation::trace, registry);
   }
 
   public DexType rewriteType(GraphLens graphLens, GraphLens codeLens) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java
index 4ba90b6..6a8cb9a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -92,8 +91,8 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    forEachApply(originalUpperBounds, upperBound -> upperBound::trace, definitionSupplier);
-    forEachApply(annotations, annotation -> annotation::trace, definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    forEachApply(originalUpperBounds, upperBound -> upperBound::trace, registry);
+    forEachApply(annotations, annotation -> annotation::trace, registry);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
index d526cfc..1b7f2bd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -46,9 +45,9 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (typeInfo != null) {
-      typeInfo.trace(definitionSupplier);
+      typeInfo.trace(registry);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
index 196b6ba..89b0955 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getKotlinLocalOrAnonymousNameFromDescriptor;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.lens.GraphLens;
@@ -177,10 +176,9 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
+  public void trace(KotlinMetadataUseRegistry registry) {
     if (known != null && known.isClassType()) {
-      // Lookup the definition, ignoring the result. This populates the sets in the Enqueuer.
-      definitionSupplier.contextIndependentDefinitionFor(known);
+      registry.registerType(known);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
index 5f54ce1..1d31906 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteIfNotNull;
 
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
@@ -78,10 +77,10 @@
   }
 
   @Override
-  public void trace(DexDefinitionSupplier definitionSupplier) {
-    type.trace(definitionSupplier);
+  public void trace(KotlinMetadataUseRegistry registry) {
+    type.trace(registry);
     if (varargElementType != null) {
-      varargElementType.trace(definitionSupplier);
+      varargElementType.trace(registry);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerMetadataTraceable.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerMetadataTraceable.java
index e17e571..5fc0f37 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerMetadataTraceable.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerMetadataTraceable.java
@@ -4,9 +4,9 @@
 
 package com.android.tools.r8.shaking;
 
-import com.android.tools.r8.graph.DexDefinitionSupplier;
+import com.android.tools.r8.kotlin.KotlinMetadataUseRegistry;
 
 public interface EnqueuerMetadataTraceable {
 
-  void trace(DexDefinitionSupplier definitionSupplier);
+  void trace(KotlinMetadataUseRegistry registry);
 }