| // Copyright (c) 2021, 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.desugar.desugaredlibrary.humanspecification; |
| |
| import com.android.tools.r8.StringResource; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.utils.Reporter; |
| import com.google.gson.JsonElement; |
| import com.google.gson.JsonObject; |
| import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; |
| import it.unimi.dsi.fastutil.ints.Int2ObjectMap; |
| |
| public class MultiAPILevelHumanDesugaredLibrarySpecificationParser |
| extends HumanDesugaredLibrarySpecificationParser { |
| |
| public MultiAPILevelHumanDesugaredLibrarySpecificationParser( |
| DexItemFactory dexItemFactory, Reporter reporter) { |
| super(dexItemFactory, reporter, false, 1); |
| } |
| |
| public MultiAPILevelHumanDesugaredLibrarySpecification parseMultiLevelConfiguration( |
| StringResource stringResource) { |
| |
| String jsonConfigString = parseJson(stringResource); |
| |
| HumanTopLevelFlags topLevelFlags = parseTopLevelFlags(jsonConfigString, builder -> {}); |
| |
| Int2ObjectMap<HumanRewritingFlags> commonFlags = parseAllFlags(COMMON_FLAGS_KEY); |
| Int2ObjectMap<HumanRewritingFlags> libraryFlags = parseAllFlags(LIBRARY_FLAGS_KEY); |
| Int2ObjectMap<HumanRewritingFlags> programFlags = parseAllFlags(PROGRAM_FLAGS_KEY); |
| |
| return new MultiAPILevelHumanDesugaredLibrarySpecification( |
| getOrigin(), topLevelFlags, commonFlags, libraryFlags, programFlags); |
| } |
| |
| private Int2ObjectMap<HumanRewritingFlags> parseAllFlags(String flagKey) { |
| JsonElement jsonFlags = required(getJsonConfig(), flagKey); |
| Int2ObjectMap<HumanRewritingFlags> flags = new Int2ObjectArrayMap<>(); |
| for (JsonElement jsonFlagSet : jsonFlags.getAsJsonArray()) { |
| JsonObject flag = jsonFlagSet.getAsJsonObject(); |
| int api_level_below_or_equal = required(flag, API_LEVEL_BELOW_OR_EQUAL_KEY).getAsInt(); |
| HumanRewritingFlags.Builder builder = |
| flags.containsKey(api_level_below_or_equal) |
| ? flags |
| .get(api_level_below_or_equal) |
| .newBuilder(dexItemFactory(), reporter(), getOrigin()) |
| : HumanRewritingFlags.builder(dexItemFactory(), reporter(), getOrigin()); |
| parseFlags(flag, builder); |
| flags.put(api_level_below_or_equal, builder.build()); |
| } |
| return flags; |
| } |
| } |