|  | // 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.kotlin; | 
|  |  | 
|  | import static com.android.tools.r8.kotlin.KotlinMetadataUtils.consume; | 
|  | import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteIfNotNull; | 
|  |  | 
|  | import com.android.tools.r8.graph.AppView; | 
|  | import com.android.tools.r8.graph.DexDefinitionSupplier; | 
|  | import com.android.tools.r8.graph.DexItemFactory; | 
|  | import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; | 
|  | import com.android.tools.r8.utils.Reporter; | 
|  | import com.google.common.collect.ImmutableList; | 
|  | import java.util.List; | 
|  | import java.util.function.Consumer; | 
|  | import kotlinx.metadata.KmType; | 
|  | import kotlinx.metadata.KmValueParameter; | 
|  | import kotlinx.metadata.internal.metadata.deserialization.Flags; | 
|  |  | 
|  | // Provides access to Kotlin information about value parameter. | 
|  | class KotlinValueParameterInfo implements EnqueuerMetadataTraceable { | 
|  | private static final List<KotlinValueParameterInfo> EMPTY_VALUE_PARAMETERS = ImmutableList.of(); | 
|  | // Original parameter name. | 
|  | final String name; | 
|  | // Original parameter flags, e.g., has default value. | 
|  | final int flags; | 
|  | // Original information about the type. | 
|  | final KotlinTypeInfo type; | 
|  | // Indicates whether the formal parameter is originally `vararg`. | 
|  | final KotlinTypeInfo varargElementType; | 
|  |  | 
|  | private KotlinValueParameterInfo( | 
|  | int flags, String name, KotlinTypeInfo type, KotlinTypeInfo varargElementType) { | 
|  | this.name = name; | 
|  | this.flags = flags; | 
|  | this.type = type; | 
|  | this.varargElementType = varargElementType; | 
|  | } | 
|  |  | 
|  | boolean isCrossInline() { | 
|  | return Flags.IS_CROSSINLINE.get(flags); | 
|  | } | 
|  |  | 
|  | static KotlinValueParameterInfo create( | 
|  | KmValueParameter kmValueParameter, DexItemFactory factory, Reporter reporter) { | 
|  | if (kmValueParameter == null) { | 
|  | return null; | 
|  | } | 
|  | KmType kmType = kmValueParameter.getType(); | 
|  | return new KotlinValueParameterInfo( | 
|  | kmValueParameter.getFlags(), | 
|  | kmValueParameter.getName(), | 
|  | KotlinTypeInfo.create(kmType, factory, reporter), | 
|  | KotlinTypeInfo.create(kmValueParameter.getVarargElementType(), factory, reporter)); | 
|  | } | 
|  |  | 
|  | static List<KotlinValueParameterInfo> create( | 
|  | List<KmValueParameter> parameters, DexItemFactory factory, Reporter reporter) { | 
|  | if (parameters.isEmpty()) { | 
|  | return EMPTY_VALUE_PARAMETERS; | 
|  | } | 
|  | ImmutableList.Builder<KotlinValueParameterInfo> builder = ImmutableList.builder(); | 
|  | for (KmValueParameter parameter : parameters) { | 
|  | builder.add(create(parameter, factory, reporter)); | 
|  | } | 
|  | return builder.build(); | 
|  | } | 
|  |  | 
|  | boolean rewrite(Consumer<KmValueParameter> consumer, AppView<?> appView) { | 
|  | KmValueParameter kmValueParameter = consume(new KmValueParameter(flags, name), consumer); | 
|  | boolean rewritten = type.rewrite(kmValueParameter::setType, appView); | 
|  | rewritten |= | 
|  | rewriteIfNotNull( | 
|  | appView, | 
|  | varargElementType, | 
|  | kmValueParameter::setVarargElementType, | 
|  | KotlinTypeInfo::rewrite); | 
|  | return rewritten; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void trace(DexDefinitionSupplier definitionSupplier) { | 
|  | type.trace(definitionSupplier); | 
|  | if (varargElementType != null) { | 
|  | varargElementType.trace(definitionSupplier); | 
|  | } | 
|  | } | 
|  | } |