Populate D8 build metadata

Change-Id: I8012f376569894436498ddb817b7ba1508392d3e
diff --git a/src/main/java/com/android/tools/r8/metadata/BuildMetadataFactory.java b/src/main/java/com/android/tools/r8/metadata/BuildMetadataFactory.java
index 7ebfa5a..c8ae112 100644
--- a/src/main/java/com/android/tools/r8/metadata/BuildMetadataFactory.java
+++ b/src/main/java/com/android/tools/r8/metadata/BuildMetadataFactory.java
@@ -13,9 +13,11 @@
 
 public class BuildMetadataFactory {
 
-  @SuppressWarnings("UnusedParameter")
   public static D8BuildMetadata create(AppView<AppInfo> appView) {
-    return D8BuildMetadataImpl.builder().setVersion(Version.LABEL).build();
+    return D8BuildMetadataImpl.builder()
+        .setOptions(new D8OptionsImpl(appView.options()))
+        .setVersion(Version.LABEL)
+        .build();
   }
 
   public static R8BuildMetadata create(
diff --git a/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptions.java b/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptions.java
new file mode 100644
index 0000000..4531502
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptions.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.KeepForApi;
+
+@KeepForApi
+public interface D8ApiModelingOptions {}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptionsImpl.java
new file mode 100644
index 0000000..58f9f56
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8ApiModelingOptionsImpl.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.AnnotationPattern;
+import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.google.gson.annotations.SerializedName;
+
+@UsedByReflection(
+    description = "Keep and preserve @SerializedName for correct (de)serialization",
+    constraints = {KeepConstraint.LOOKUP},
+    constrainAnnotations = @AnnotationPattern(constant = SerializedName.class),
+    kind = KeepItemKind.CLASS_AND_FIELDS,
+    fieldAccess = {FieldAccessFlags.PRIVATE},
+    fieldAnnotatedByClassConstant = SerializedName.class)
+public class D8ApiModelingOptionsImpl implements D8ApiModelingOptions {
+
+  private D8ApiModelingOptionsImpl() {}
+
+  public static D8ApiModelingOptionsImpl create(InternalOptions options) {
+    return options.apiModelingOptions().enableLibraryApiModeling
+        ? new D8ApiModelingOptionsImpl()
+        : null;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8BuildMetadata.java b/src/main/java/com/android/tools/r8/metadata/D8BuildMetadata.java
index 652d320..eed136e 100644
--- a/src/main/java/com/android/tools/r8/metadata/D8BuildMetadata.java
+++ b/src/main/java/com/android/tools/r8/metadata/D8BuildMetadata.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializer;
 
 @KeepForApi
 public interface D8BuildMetadata {
@@ -12,10 +13,21 @@
   static D8BuildMetadata fromJson(String json) {
     return new GsonBuilder()
         .excludeFieldsWithoutExposeAnnotation()
+        .registerTypeAdapter(D8Options.class, deserializeTo(D8OptionsImpl.class))
+        .registerTypeAdapter(
+            D8ApiModelingOptions.class, deserializeTo(D8ApiModelingOptionsImpl.class))
+        .registerTypeAdapter(
+            D8LibraryDesugaringOptions.class, deserializeTo(D8LibraryDesugaringOptionsImpl.class))
         .create()
         .fromJson(json, D8BuildMetadataImpl.class);
   }
 
+  private static <T> JsonDeserializer<T> deserializeTo(Class<T> implClass) {
+    return (element, type, context) -> context.deserialize(element, implClass);
+  }
+
+  D8Options getOptions();
+
   String getVersion();
 
   String toJson();
diff --git a/src/main/java/com/android/tools/r8/metadata/D8BuildMetadataImpl.java b/src/main/java/com/android/tools/r8/metadata/D8BuildMetadataImpl.java
index 7e4239e..532027e 100644
--- a/src/main/java/com/android/tools/r8/metadata/D8BuildMetadataImpl.java
+++ b/src/main/java/com/android/tools/r8/metadata/D8BuildMetadataImpl.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.metadata.R8BuildMetadataImpl.Builder;
 import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
@@ -22,10 +23,15 @@
 public class D8BuildMetadataImpl implements D8BuildMetadata {
 
   @Expose
+  @SerializedName("options")
+  private final D8Options options;
+
+  @Expose
   @SerializedName("version")
   private final String version;
 
-  public D8BuildMetadataImpl(String version) {
+  public D8BuildMetadataImpl(D8Options options, String version) {
+    this.options = options;
     this.version = version;
   }
 
@@ -34,6 +40,11 @@
   }
 
   @Override
+  public D8Options getOptions() {
+    return options;
+  }
+
+  @Override
   public String getVersion() {
     return version;
   }
@@ -45,15 +56,21 @@
 
   public static class Builder {
 
+    private D8Options options;
     private String version;
 
+    public Builder setOptions(D8Options options) {
+      this.options = options;
+      return this;
+    }
+
     public Builder setVersion(String version) {
       this.version = version;
       return this;
     }
 
     public D8BuildMetadataImpl build() {
-      return new D8BuildMetadataImpl(version);
+      return new D8BuildMetadataImpl(options, version);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptions.java
new file mode 100644
index 0000000..893be57
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptions.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.KeepForApi;
+
+@KeepForApi
+public interface D8LibraryDesugaringOptions extends D8R8LibraryDesugaringOptions {}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptionsImpl.java
new file mode 100644
index 0000000..1d87662
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8LibraryDesugaringOptionsImpl.java
@@ -0,0 +1,33 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.AnnotationPattern;
+import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.google.gson.annotations.SerializedName;
+
+@UsedByReflection(
+    description = "Keep and preserve @SerializedName for correct (de)serialization",
+    constraints = {KeepConstraint.LOOKUP},
+    constrainAnnotations = @AnnotationPattern(constant = SerializedName.class),
+    kind = KeepItemKind.CLASS_AND_FIELDS,
+    fieldAccess = {FieldAccessFlags.PRIVATE},
+    fieldAnnotatedByClassConstant = SerializedName.class)
+public class D8LibraryDesugaringOptionsImpl extends D8R8LibraryDesugaringOptionsImpl
+    implements D8LibraryDesugaringOptions {
+
+  private D8LibraryDesugaringOptionsImpl(InternalOptions options) {
+    super(options);
+  }
+
+  public static D8LibraryDesugaringOptionsImpl create(InternalOptions options) {
+    return !options.machineDesugaredLibrarySpecification.isEmpty()
+        ? new D8LibraryDesugaringOptionsImpl(options)
+        : null;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8Options.java b/src/main/java/com/android/tools/r8/metadata/D8Options.java
new file mode 100644
index 0000000..c7bd25c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8Options.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.KeepForApi;
+
+@KeepForApi
+public interface D8Options extends D8R8Options<D8ApiModelingOptions, D8LibraryDesugaringOptions> {}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8OptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/D8OptionsImpl.java
new file mode 100644
index 0000000..021b9ba
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8OptionsImpl.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.AnnotationPattern;
+import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.google.gson.annotations.SerializedName;
+
+@UsedByReflection(
+    description = "Keep and preserve @SerializedName for correct (de)serialization",
+    constraints = {KeepConstraint.LOOKUP},
+    constrainAnnotations = @AnnotationPattern(constant = SerializedName.class),
+    kind = KeepItemKind.CLASS_AND_FIELDS,
+    fieldAccess = {FieldAccessFlags.PRIVATE},
+    fieldAnnotatedByClassConstant = SerializedName.class)
+public class D8OptionsImpl extends D8R8OptionsImpl<D8ApiModelingOptions, D8LibraryDesugaringOptions>
+    implements D8Options {
+
+  public D8OptionsImpl(InternalOptions options) {
+    super(
+        D8ApiModelingOptionsImpl.create(options),
+        D8LibraryDesugaringOptionsImpl.create(options),
+        options);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptions.java
new file mode 100644
index 0000000..9679857
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptions.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2024, 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.metadata;
+
+public interface D8R8LibraryDesugaringOptions {
+
+  String getIdentifier();
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptionsImpl.java
new file mode 100644
index 0000000..92cd481
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8R8LibraryDesugaringOptionsImpl.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.AnnotationPattern;
+import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+@UsedByReflection(
+    description = "Keep and preserve @SerializedName for correct (de)serialization",
+    constraints = {KeepConstraint.LOOKUP},
+    constrainAnnotations = @AnnotationPattern(constant = SerializedName.class),
+    kind = KeepItemKind.CLASS_AND_FIELDS,
+    fieldAccess = {FieldAccessFlags.PRIVATE},
+    fieldAnnotatedByClassConstant = SerializedName.class)
+abstract class D8R8LibraryDesugaringOptionsImpl implements D8R8LibraryDesugaringOptions {
+
+  @Expose
+  @SerializedName("identifier")
+  private final String identifier;
+
+  public D8R8LibraryDesugaringOptionsImpl(InternalOptions options) {
+    this.identifier = options.machineDesugaredLibrarySpecification.getIdentifier();
+  }
+
+  @Override
+  public String getIdentifier() {
+    return identifier;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8R8Options.java b/src/main/java/com/android/tools/r8/metadata/D8R8Options.java
new file mode 100644
index 0000000..07b4844
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8R8Options.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2024, 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.metadata;
+
+public interface D8R8Options<
+    ApiModelingOptions, LibraryDesugaringOptions extends D8R8LibraryDesugaringOptions> {
+
+  /**
+   * @return null if API modeling is disabled.
+   */
+  ApiModelingOptions getApiModelingOptions();
+
+  /**
+   * @return null if library desugaring is disabled.
+   */
+  LibraryDesugaringOptions getLibraryDesugaringOptions();
+
+  int getMinApiLevel();
+
+  boolean isDebugModeEnabled();
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/D8R8OptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/D8R8OptionsImpl.java
new file mode 100644
index 0000000..0e4801a
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/metadata/D8R8OptionsImpl.java
@@ -0,0 +1,71 @@
+// Copyright (c) 2024, 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.metadata;
+
+import com.android.tools.r8.keepanno.annotations.AnnotationPattern;
+import com.android.tools.r8.keepanno.annotations.FieldAccessFlags;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+@UsedByReflection(
+    description = "Keep and preserve @SerializedName for correct (de)serialization",
+    constraints = {KeepConstraint.LOOKUP},
+    constrainAnnotations = @AnnotationPattern(constant = SerializedName.class),
+    kind = KeepItemKind.CLASS_AND_FIELDS,
+    fieldAccess = {FieldAccessFlags.PRIVATE},
+    fieldAnnotatedByClassConstant = SerializedName.class)
+abstract class D8R8OptionsImpl<
+        ApiModelingOptions, LibraryDesugaringOptions extends D8R8LibraryDesugaringOptions>
+    implements D8R8Options<ApiModelingOptions, LibraryDesugaringOptions> {
+
+  @Expose
+  @SerializedName("apiModelingOptions")
+  private final ApiModelingOptions apiModelingOptions;
+
+  @Expose
+  @SerializedName("libraryDesugaringOptions")
+  private final LibraryDesugaringOptions libraryDesugaringOptions;
+
+  @Expose
+  @SerializedName("minApiLevel")
+  private final int minApiLevel;
+
+  @Expose
+  @SerializedName("isDebugModeEnabled")
+  private final boolean isDebugModeEnabled;
+
+  public D8R8OptionsImpl(
+      ApiModelingOptions apiModelingOptions,
+      LibraryDesugaringOptions libraryDesugaringOptions,
+      InternalOptions options) {
+    this.apiModelingOptions = apiModelingOptions;
+    this.libraryDesugaringOptions = libraryDesugaringOptions;
+    this.minApiLevel = options.getMinApiLevel().getLevel();
+    this.isDebugModeEnabled = options.debug;
+  }
+
+  @Override
+  public ApiModelingOptions getApiModelingOptions() {
+    return apiModelingOptions;
+  }
+
+  @Override
+  public LibraryDesugaringOptions getLibraryDesugaringOptions() {
+    return libraryDesugaringOptions;
+  }
+
+  @Override
+  public int getMinApiLevel() {
+    return minApiLevel;
+  }
+
+  @Override
+  public boolean isDebugModeEnabled() {
+    return isDebugModeEnabled;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/R8ApiModelingOptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/R8ApiModelingOptionsImpl.java
index c9d3e06..33be1b4 100644
--- a/src/main/java/com/android/tools/r8/metadata/R8ApiModelingOptionsImpl.java
+++ b/src/main/java/com/android/tools/r8/metadata/R8ApiModelingOptionsImpl.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.gson.annotations.SerializedName;
 
 @UsedByReflection(
@@ -17,4 +18,13 @@
     kind = KeepItemKind.CLASS_AND_FIELDS,
     fieldAccess = {FieldAccessFlags.PRIVATE},
     fieldAnnotatedByClassConstant = SerializedName.class)
-public class R8ApiModelingOptionsImpl implements R8ApiModelingOptions {}
+public class R8ApiModelingOptionsImpl implements R8ApiModelingOptions {
+
+  private R8ApiModelingOptionsImpl() {}
+
+  public static R8ApiModelingOptionsImpl create(InternalOptions options) {
+    return options.apiModelingOptions().enableLibraryApiModeling
+        ? new R8ApiModelingOptionsImpl()
+        : null;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptions.java
index 9a80853..5549ac8 100644
--- a/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptions.java
+++ b/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptions.java
@@ -6,4 +6,4 @@
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 
 @KeepForApi
-public interface R8LibraryDesugaringOptions {}
+public interface R8LibraryDesugaringOptions extends D8R8LibraryDesugaringOptions {}
diff --git a/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptionsImpl.java
index e65fcb0..c88249e 100644
--- a/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptionsImpl.java
+++ b/src/main/java/com/android/tools/r8/metadata/R8LibraryDesugaringOptionsImpl.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.gson.annotations.SerializedName;
 
 @UsedByReflection(
@@ -17,4 +18,16 @@
     kind = KeepItemKind.CLASS_AND_FIELDS,
     fieldAccess = {FieldAccessFlags.PRIVATE},
     fieldAnnotatedByClassConstant = SerializedName.class)
-public class R8LibraryDesugaringOptionsImpl implements R8LibraryDesugaringOptions {}
+public class R8LibraryDesugaringOptionsImpl extends D8R8LibraryDesugaringOptionsImpl
+    implements R8LibraryDesugaringOptions {
+
+  private R8LibraryDesugaringOptionsImpl(InternalOptions options) {
+    super(options);
+  }
+
+  public static R8LibraryDesugaringOptionsImpl create(InternalOptions options) {
+    return !options.machineDesugaredLibrarySpecification.isEmpty()
+        ? new R8LibraryDesugaringOptionsImpl(options)
+        : null;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/metadata/R8OptionsImpl.java b/src/main/java/com/android/tools/r8/metadata/R8OptionsImpl.java
index f5bf5bd..756f637 100644
--- a/src/main/java/com/android/tools/r8/metadata/R8OptionsImpl.java
+++ b/src/main/java/com/android/tools/r8/metadata/R8OptionsImpl.java
@@ -19,33 +19,18 @@
     kind = KeepItemKind.CLASS_AND_FIELDS,
     fieldAccess = {FieldAccessFlags.PRIVATE},
     fieldAnnotatedByClassConstant = SerializedName.class)
-public class R8OptionsImpl implements R8Options {
-
-  @Expose
-  @SerializedName("apiModelingOptions")
-  private final R8ApiModelingOptions apiModelingOptions;
+public class R8OptionsImpl extends D8R8OptionsImpl<R8ApiModelingOptions, R8LibraryDesugaringOptions>
+    implements R8Options {
 
   @Expose
   @SerializedName("keepAttributesOptions")
   private final R8KeepAttributesOptions keepAttributesOptions;
 
   @Expose
-  @SerializedName("libraryDesugaringOptions")
-  private final R8LibraryDesugaringOptions libraryDesugaringOptions;
-
-  @Expose
-  @SerializedName("minApiLevel")
-  private final int minApiLevel;
-
-  @Expose
   @SerializedName("isAccessModificationEnabled")
   private final boolean isAccessModificationEnabled;
 
   @Expose
-  @SerializedName("isDebugModeEnabled")
-  private final boolean isDebugModeEnabled;
-
-  @Expose
   @SerializedName("isProGuardCompatibilityModeEnabled")
   private final boolean isProGuardCompatibilityModeEnabled;
 
@@ -62,22 +47,16 @@
   private final boolean isShrinkingEnabled;
 
   public R8OptionsImpl(InternalOptions options) {
-    this.apiModelingOptions =
-        options.apiModelingOptions().enableLibraryApiModeling
-            ? new R8ApiModelingOptionsImpl()
-            : null;
+    super(
+        R8ApiModelingOptionsImpl.create(options),
+        R8LibraryDesugaringOptionsImpl.create(options),
+        options);
     this.keepAttributesOptions =
         options.hasProguardConfiguration()
             ? new R8KeepAttributesOptionsImpl(
                 options.getProguardConfiguration().getKeepAttributes())
             : null;
-    this.libraryDesugaringOptions =
-        !options.machineDesugaredLibrarySpecification.isEmpty()
-            ? new R8LibraryDesugaringOptionsImpl()
-            : null;
-    this.minApiLevel = options.getMinApiLevel().getLevel();
     this.isAccessModificationEnabled = options.isAccessModificationEnabled();
-    this.isDebugModeEnabled = options.debug;
     this.isProGuardCompatibilityModeEnabled = options.forceProguardCompatibility;
     this.isObfuscationEnabled = options.isMinifying();
     this.isOptimizationsEnabled = options.isOptimizing();
@@ -85,36 +64,16 @@
   }
 
   @Override
-  public R8ApiModelingOptions getApiModelingOptions() {
-    return apiModelingOptions;
-  }
-
-  @Override
   public R8KeepAttributesOptions getKeepAttributesOptions() {
     return keepAttributesOptions;
   }
 
   @Override
-  public R8LibraryDesugaringOptions getLibraryDesugaringOptions() {
-    return libraryDesugaringOptions;
-  }
-
-  @Override
-  public int getMinApiLevel() {
-    return minApiLevel;
-  }
-
-  @Override
   public boolean isAccessModificationEnabled() {
     return isAccessModificationEnabled;
   }
 
   @Override
-  public boolean isDebugModeEnabled() {
-    return isDebugModeEnabled;
-  }
-
-  @Override
   public boolean isProGuardCompatibilityModeEnabled() {
     return isProGuardCompatibilityModeEnabled;
   }