diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
index 967cf05..deba026 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -120,8 +120,30 @@
     assert clazz != null;
 
     KmDeclarationContainer kmDeclarationContainer = getDeclarations();
-    Map<String, KmPropertyGroup.Builder> propertyGroupBuilderMap = new HashMap<>();
+    rewriteFunctions(appView, lens, kmDeclarationContainer.getFunctions());
+    rewriteProperties(appView, lens, kmDeclarationContainer.getProperties());
+  }
 
+  private void rewriteFunctions(
+      AppView<AppInfoWithLiveness> appView, NamingLens lens, List<KmFunction> functions) {
+    functions.clear();
+    for (DexEncodedMethod method : clazz.methods()) {
+      if (method.isInitializer()) {
+        continue;
+      }
+      if (method.isKotlinFunction() || method.isKotlinExtensionFunction()) {
+        KmFunction function = toRenamedKmFunction(method, appView, lens);
+        if (function != null) {
+          functions.add(function);
+        }
+      }
+      // TODO(b/151194869): What should we do for methods that fall into this category---no mark?
+    }
+  }
+
+  private void rewriteProperties(
+      AppView<AppInfoWithLiveness> appView, NamingLens lens, List<KmProperty> properties) {
+    Map<String, KmPropertyGroup.Builder> propertyGroupBuilderMap = new HashMap<>();
     // Backing fields for a companion object are declared in its host class.
     Iterable<DexEncodedField> fields = clazz.fields();
     Predicate<DexEncodedField> backingFieldTester = DexEncodedField::isKotlinBackingField;
@@ -132,7 +154,6 @@
         backingFieldTester = DexEncodedField::isKotlinBackingFieldForCompanionObject;
       }
     }
-
     for (DexEncodedField field : fields) {
       if (backingFieldTester.test(field)) {
         String name = field.getKotlinMemberInfo().propertyName;
@@ -144,21 +165,10 @@
         builder.foundBackingField(field);
       }
     }
-
-    List<KmFunction> functions = kmDeclarationContainer.getFunctions();
-    functions.clear();
     for (DexEncodedMethod method : clazz.methods()) {
       if (method.isInitializer()) {
         continue;
       }
-
-      if (method.isKotlinFunction() || method.isKotlinExtensionFunction()) {
-        KmFunction function = toRenamedKmFunction(method, appView, lens);
-        if (function != null) {
-          functions.add(function);
-        }
-        continue;
-      }
       if (method.isKotlinProperty() || method.isKotlinExtensionProperty()) {
         String name = method.getKotlinMemberInfo().propertyName;
         assert name != null;
@@ -190,13 +200,9 @@
           default:
             throw new Unreachable("Not a Kotlin property: " + method.getKotlinMemberInfo());
         }
-        continue;
       }
-
       // TODO(b/151194869): What should we do for methods that fall into this category---no mark?
     }
-
-    List<KmProperty> properties = kmDeclarationContainer.getProperties();
     properties.clear();
     for (KmPropertyGroup.Builder builder : propertyGroupBuilderMap.values()) {
       KmPropertyGroup group = builder.build();
