Add a few accessors

Change-Id: Idde6c9910b9dac7c70c45e2d338b4e857337e070
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 3f72483..b0aea08 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -777,7 +777,7 @@
       new PrimitiveTypesBoxedTypeFields();
   public final AtomicFieldUpdaterMethods atomicFieldUpdaterMethods =
       new AtomicFieldUpdaterMethods();
-  public final Kotlin kotlin;
+  private final Kotlin kotlin;
   public final PolymorphicMethods polymorphicMethods = new PolymorphicMethods();
   public final ProxyMethods proxyMethods = new ProxyMethods();
 
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
index 31237bb..a6d88f2 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
@@ -76,7 +76,7 @@
   }
 
   private boolean isUsingKotlinAssertionsEnabledField(DexField field) {
-    return field.isIdenticalTo(dexItemFactory.kotlin.assertions.enabledField);
+    return field.isIdenticalTo(dexItemFactory.kotlin().assertions().enabledField);
   }
 
   @Override
@@ -201,7 +201,7 @@
 
   @SuppressWarnings("ReferenceEquality")
   private boolean hasKotlincClinitAssertionCode(ProgramMethod method) {
-    if (method.getHolderType() == dexItemFactory.kotlin.assertions.type) {
+    if (method.getHolderType() == dexItemFactory.kotlin().assertions().type) {
       CfCode code = method.getDefinition().getCode().asCfCode();
       List<CfInstruction> instructions = code.getInstructions();
       for (int i = 1; i < instructions.size(); i++) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java b/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
index ecaa39d..eb5dfd6 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
@@ -32,8 +32,9 @@
     // Model that checkNotNullParameter() does not read any instance fields of the app. This is
     // currently needed for constructors that call checkNotNullParameter() not to be marked as
     // reading any field.
-    if (invokedMethod == appView.dexItemFactory().kotlin.intrinsics.checkNotNullParameter
-        || invokedMethod == appView.dexItemFactory().kotlin.intrinsics.checkParameterIsNotNull) {
+    if (invokedMethod == appView.dexItemFactory().kotlin().intrinsics().checkNotNullParameter
+        || invokedMethod
+            == appView.dexItemFactory().kotlin().intrinsics().checkParameterIsNotNull) {
       return EmptyFieldSet.getInstance();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
index 87e548e..28b242c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
@@ -135,7 +135,7 @@
             .map(entry -> new ConfigurationEntryWithDexString(entry, appView.dexItemFactory()))
             .collect(Collectors.toList());
     kotlinTransformation =
-        getTransformationForType(appView.dexItemFactory().kotlin.assertions.type);
+        getTransformationForType(appView.dexItemFactory().kotlin().assertions().type);
   }
 
   // Static method used by other analyses to see if additional analysis is required to support
@@ -439,7 +439,7 @@
       if (current.isInvokeMethod()) {
         InvokeMethod invoke = current.asInvokeMethod();
         if (invoke.getInvokedMethod() == dexItemFactory.classMethods.desiredAssertionStatus) {
-          if (method.getHolderType() == dexItemFactory.kotlin.assertions.type) {
+          if (method.getHolderType() == dexItemFactory.kotlin().assertions().type) {
             rewriteKotlinAssertionEnable(code, configuration, iterator, invoke);
           } else {
             iterator.replaceCurrentInstruction(code.createIntConstant(0, current.getLocalInfo()));
@@ -464,7 +464,7 @@
           }
         }
         // Rewrite kotlin._Assertions.ENABLED getter.
-        if (staticGet.getField() == dexItemFactory.kotlin.assertions.enabledField) {
+        if (staticGet.getField() == dexItemFactory.kotlin().assertions().enabledField) {
           // For assertion handler rewrite just leave the static get, as it will become dead code.
           if (!configuration.isAssertionHandler()) {
             iterator.replaceCurrentInstruction(
@@ -520,7 +520,7 @@
       Instruction nextInstruction = iterator.next();
       if (nextInstruction.isStaticPut()
           && nextInstruction.asStaticPut().getField().holder
-              == dexItemFactory.kotlin.assertions.type
+              == dexItemFactory.kotlin().assertions().type
           && nextInstruction.asStaticPut().getField().name == dexItemFactory.enabledFieldName
           && invoke.outValue().numberOfUsers() == 1
           && invoke.outValue().numberOfPhiUsers() == 0
@@ -559,7 +559,7 @@
 
   @SuppressWarnings("ReferenceEquality")
   private boolean isUsingKotlinAssertionsEnabledField(FieldInstruction instruction) {
-    return instruction.getField() == dexItemFactory.kotlin.assertions.enabledField;
+    return instruction.getField() == dexItemFactory.kotlin().assertions().enabledField;
   }
 
   private If isCheckAssertionsEnabledBlock(BasicBlock basicBlock) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 164a8c7..0568f12 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -691,7 +691,7 @@
       AppView<?> appView, InvokeStatic invoke, Value value) {
     // We need to ignore the holder, since Kotlin adds different versions of null-check machinery,
     // e.g., kotlin.collections.ArraysKt___ArraysKt... or kotlin.jvm.internal.ArrayIteratorKt...
-    Intrinsics intrinsics = appView.dexItemFactory().kotlin.intrinsics;
+    Intrinsics intrinsics = appView.dexItemFactory().kotlin().intrinsics();
     DexMethod originalInvokedMethod =
         appView.graphLens().getOriginalMethodSignature(invoke.getInvokedMethod());
     boolean isCheckNotNullMethod =
@@ -709,7 +709,7 @@
       AppView<?> appView, InvokeStatic invoke) {
     // We need to ignore the holder, since Kotlin adds different versions of null-check machinery,
     // e.g., kotlin.collections.ArraysKt___ArraysKt... or kotlin.jvm.internal.ArrayIteratorKt...
-    Intrinsics intrinsics = appView.dexItemFactory().kotlin.intrinsics;
+    Intrinsics intrinsics = appView.dexItemFactory().kotlin().intrinsics();
     DexMethod originalInvokedMethod =
         appView.graphLens().getOriginalMethodSignature(invoke.getInvokedMethod());
     return (originalInvokedMethod.match(intrinsics.throwParameterIsNullException)
diff --git a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
index 0d3b4d7..4ae2224 100644
--- a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
+++ b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
@@ -22,10 +22,10 @@
 
   public final DexItemFactory factory;
 
-  public final Functional functional;
-  public final Intrinsics intrinsics;
-  public final Metadata metadata;
-  public final _Assertions assertions;
+  private final Functional functional;
+  private final Intrinsics intrinsics;
+  private final Metadata metadata;
+  private final _Assertions assertions;
 
   public static final String NAME = "kotlin";
   public static final String PACKAGE_PREFIX = "L" + NAME + "/";
@@ -99,10 +99,22 @@
     this.assertions = new _Assertions();
   }
 
+  public Functional functional() {
+    return functional;
+  }
+
   public Intrinsics intrinsics() {
     return intrinsics;
   }
 
+  public Metadata metadata() {
+    return metadata;
+  }
+
+  public _Assertions assertions() {
+    return assertions;
+  }
+
   public final class Functional {
     // NOTE: Kotlin stdlib defines interface Function0 till Function22 explicitly, see:
     //    https://github.com/JetBrains/kotlin/blob/master/libraries/
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 411c29f..8750c74 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -88,7 +88,7 @@
               new StringDiagnostic(
                   "Class "
                       + clazz.type.toSourceString()
-                      + " has malformed kotlin.Metadata: "
+                      + " has malformed kotlin.metadata(): "
                       + e.getMessage()));
       return getInvalidKotlinInfo();
     } catch (Throwable e) {
@@ -101,7 +101,7 @@
               new StringDiagnostic(
                   "Unexpected error while reading "
                       + clazz.type.toSourceString()
-                      + "'s kotlin.Metadata: "
+                      + "'s kotlin.metadata(): "
                       + e.getMessage()));
       return getNoKotlinInfo();
     }
@@ -114,7 +114,7 @@
       DexAnnotation annotation,
       BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer)
       throws KotlinMetadataException {
-    Kotlin kotlin = appView.dexItemFactory().kotlin;
+    Kotlin kotlin = appView.dexItemFactory().kotlin();
     KotlinClassMetadata kMetadata = toKotlinClassMetadata(kotlin, annotation.annotation);
     if (kMetadata == null) {
       throw new KotlinMetadataException(
@@ -126,7 +126,7 @@
   public static boolean isLambda(
       AppView<?> appView, DexClass clazz, Supplier<Boolean> reportUnknownMetadata) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
-    Kotlin kotlin = dexItemFactory.kotlin;
+    Kotlin kotlin = dexItemFactory.kotlin();
     Flavour flavour = getFlavour(clazz, kotlin);
     if (flavour == Flavour.Unclassified) {
       return false;
@@ -158,7 +158,7 @@
               new StringDiagnostic(
                   "Class "
                       + clazz.type.toSourceString()
-                      + " has malformed kotlin.Metadata: "
+                      + " has malformed kotlin.metadata(): "
                       + exception.getMessage()));
       return false;
     }
@@ -186,17 +186,17 @@
       Kotlin kotlin, Map<DexString, DexAnnotationElement> elementMap)
       throws KotlinMetadataException {
     int k = getKind(kotlin, elementMap);
-    DexAnnotationElement metadataVersion = elementMap.get(kotlin.metadata.metadataVersion);
+    DexAnnotationElement metadataVersion = elementMap.get(kotlin.metadata().metadataVersion);
     int[] mv = metadataVersion == null ? null : getUnboxedIntArray(metadataVersion.value, "mv");
-    DexAnnotationElement data1 = elementMap.get(kotlin.metadata.data1);
+    DexAnnotationElement data1 = elementMap.get(kotlin.metadata().data1);
     String[] d1 = data1 == null ? null : getUnboxedStringArray(data1.value, "d1");
-    DexAnnotationElement data2 = elementMap.get(kotlin.metadata.data2);
+    DexAnnotationElement data2 = elementMap.get(kotlin.metadata().data2);
     String[] d2 = data2 == null ? null : getUnboxedStringArray(data2.value, "d2");
-    DexAnnotationElement extraString = elementMap.get(kotlin.metadata.extraString);
+    DexAnnotationElement extraString = elementMap.get(kotlin.metadata().extraString);
     String xs = extraString == null ? null : getUnboxedString(extraString.value, "xs");
-    DexAnnotationElement packageName = elementMap.get(kotlin.metadata.packageName);
+    DexAnnotationElement packageName = elementMap.get(kotlin.metadata().packageName);
     String pn = packageName == null ? null : getUnboxedString(packageName.value, "pn");
-    DexAnnotationElement extraInt = elementMap.get(kotlin.metadata.extraInt);
+    DexAnnotationElement extraInt = elementMap.get(kotlin.metadata().extraInt);
     Integer xi = extraInt == null ? null : (Integer) extraInt.value.getBoxedValue();
 
     try {
@@ -208,7 +208,7 @@
   }
 
   private static int getKind(Kotlin kotlin, Map<DexString, DexAnnotationElement> elementMap) {
-    DexAnnotationElement kind = elementMap.get(kotlin.metadata.kind);
+    DexAnnotationElement kind = elementMap.get(kotlin.metadata().kind);
     if (kind == null) {
       throw new MetadataError("element 'k' is missing.");
     }
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 e8a830c..8c3f780 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -76,7 +76,7 @@
   public KotlinMetadataRewriter(AppView<?> appView) {
     this.appView = appView;
     this.factory = appView.dexItemFactory();
-    this.kotlin = factory.kotlin;
+    this.kotlin = factory.kotlin();
   }
 
   @SuppressWarnings("ReferenceEquality")
@@ -97,13 +97,14 @@
         kotlinMetadata == null
             ? WriteMetadataFieldInfo.rewriteAll()
             : new WriteMetadataFieldInfo(
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.kind),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.metadataVersion),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.data1),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.data2),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.extraString),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.packageName),
-                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.extraInt));
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().kind),
+                kotlinMetadataFieldExists(
+                    kotlinMetadata, appView, kotlin.metadata().metadataVersion),
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().data1),
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().data2),
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().extraString),
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().packageName),
+                kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata().extraInt));
     ThreadUtils.processItems(
         appView.appInfo().classes(),
         clazz -> {
@@ -309,35 +310,36 @@
     if (writeMetadataFieldInfo.writeMetadataVersion) {
       elements.add(
           new DexAnnotationElement(
-              kotlin.metadata.metadataVersion,
+              kotlin.metadata().metadataVersion,
               createIntArray(KotlinJvmMetadataVersionUtils.toIntArray(metadataVersion))));
     }
     if (writeMetadataFieldInfo.writeKind) {
       elements.add(
-          new DexAnnotationElement(kotlin.metadata.kind, DexValueInt.create(metadata.k())));
+          new DexAnnotationElement(kotlin.metadata().kind, DexValueInt.create(metadata.k())));
     }
     if (writeMetadataFieldInfo.writeData1) {
       elements.add(
-          new DexAnnotationElement(kotlin.metadata.data1, createStringArray(metadata.d1())));
+          new DexAnnotationElement(kotlin.metadata().data1, createStringArray(metadata.d1())));
     }
     if (writeMetadataFieldInfo.writeData2) {
       elements.add(
-          new DexAnnotationElement(kotlin.metadata.data2, createStringArray(metadata.d2())));
+          new DexAnnotationElement(kotlin.metadata().data2, createStringArray(metadata.d2())));
     }
     if (writeMetadataFieldInfo.writePackageName && packageName != null && !packageName.isEmpty()) {
       elements.add(
           new DexAnnotationElement(
-              kotlin.metadata.packageName, new DexValueString(factory.createString(packageName))));
+              kotlin.metadata().packageName,
+              new DexValueString(factory.createString(packageName))));
     }
     if (writeMetadataFieldInfo.writeExtraString && !metadata.xs().isEmpty()) {
       elements.add(
           new DexAnnotationElement(
-              kotlin.metadata.extraString,
+              kotlin.metadata().extraString,
               new DexValueString(factory.createString(metadata.xs()))));
     }
     if (writeMetadataFieldInfo.writeExtraInt && metadata.xi() != 0) {
       elements.add(
-          new DexAnnotationElement(kotlin.metadata.extraInt, DexValueInt.create(metadata.xi())));
+          new DexAnnotationElement(kotlin.metadata().extraInt, DexValueInt.create(metadata.xi())));
     }
     DexEncodedAnnotation encodedAnnotation =
         new DexEncodedAnnotation(
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 48e79a9..3619c05 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -108,7 +108,7 @@
   public static Flavour getFlavour(DexClass clazz, Kotlin kotlin) {
     // Returns KotlinStyleLambda if the given clazz has shape of a Kotlin-style lambda:
     //   a class that directly extends kotlin.jvm.internal.Lambda
-    if (clazz.superType == kotlin.functional.lambdaType) {
+    if (clazz.superType == kotlin.functional().lambdaType) {
       return Flavour.KotlinStyleLambda;
     }
     // Returns JavaStyleLambda if the given clazz has shape of a Java-style lambda:
diff --git a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 645ec45..63dfcdb 100644
--- a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -567,7 +567,7 @@
     try {
       metadata =
           KotlinClassMetadataReader.toKotlinClassMetadata(
-              codeInspector.getFactory().kotlin, annotationSubject.getAnnotation());
+              codeInspector.getFactory().kotlin(), annotationSubject.getAnnotation());
     } catch (KotlinMetadataException e) {
       throw new RuntimeException(e);
     }
@@ -586,7 +586,7 @@
     try {
       metadata =
           KotlinClassMetadataReader.toKotlinClassMetadata(
-              codeInspector.getFactory().kotlin, annotationSubject.getAnnotation());
+              codeInspector.getFactory().kotlin(), annotationSubject.getAnnotation());
     } catch (KotlinMetadataException e) {
       throw new RuntimeException(e);
     }
@@ -610,7 +610,7 @@
     }
     try {
       return KotlinClassMetadataReader.toKotlinClassMetadata(
-          codeInspector.getFactory().kotlin, annotationSubject.getAnnotation());
+          codeInspector.getFactory().kotlin(), annotationSubject.getAnnotation());
     } catch (KotlinMetadataException e) {
       throw new RuntimeException(e);
     }