| // Copyright (c) 2020, 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.ir.optimize.library; |
| |
| import static com.android.tools.r8.graph.ClasspathOrLibraryClass.asClasspathOrLibraryClass; |
| |
| import com.android.tools.r8.dex.Constants; |
| import com.android.tools.r8.graph.AppView; |
| import com.android.tools.r8.graph.ClasspathOrLibraryClass; |
| import com.android.tools.r8.graph.DexEncodedField; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.graph.FieldAccessFlags; |
| |
| /** |
| * This class synthesizes classpath/library fields that we rely on for modeling. |
| * |
| * <p>For example, we synthesize the field `java.lang.String java.lang.Enum.name` if it is not |
| * present. We use this to model that the constructor `void java.lang.Enum.<init>(java.lang.String, |
| * int)` initializes `java.lang.String java.lang.Enum.name` to the first argument of the |
| * constructor. |
| */ |
| public class FieldSynthesis { |
| |
| public static void synthesizeEnumFields(AppView<?> appView) { |
| DexItemFactory dexItemFactory = appView.dexItemFactory(); |
| ClasspathOrLibraryClass enumClass = |
| asClasspathOrLibraryClass(appView.definitionFor(dexItemFactory.enumType)); |
| if (enumClass != null) { |
| dexItemFactory.enumMembers.forEachField( |
| field -> { |
| DexEncodedField definition = enumClass.lookupField(field); |
| if (definition == null) { |
| enumClass.appendInstanceField( |
| DexEncodedField.syntheticBuilder() |
| .setField(field) |
| .setAccessFlags( |
| FieldAccessFlags.fromCfAccessFlags( |
| Constants.ACC_PRIVATE | Constants.ACC_FINAL)) |
| .setApiLevel(appView.computedMinApiLevel()) |
| // Will be traced by the enqueuer. |
| .disableAndroidApiLevelCheck() |
| .build()); |
| } |
| }); |
| } |
| } |
| } |