blob: 293c35ad01aa50ab3ede81c218bd091e3654624d [file] [log] [blame]
// 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 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.naming.NamingLens;
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 kotlinx.metadata.KmType;
import kotlinx.metadata.KmValueParameter;
import kotlinx.metadata.KmValueParameterVisitor;
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(
KmVisitorProviders.KmValueParameterVisitorProvider visitorProvider,
AppView<?> appView,
NamingLens namingLens) {
KmValueParameterVisitor kmValueParameterVisitor = visitorProvider.get(flags, name);
boolean rewritten = type.rewrite(kmValueParameterVisitor::visitType, appView, namingLens);
if (varargElementType != null) {
rewritten |=
varargElementType.rewrite(
kmValueParameterVisitor::visitVarargElementType, appView, namingLens);
}
return rewritten;
}
@Override
public void trace(DexDefinitionSupplier definitionSupplier) {
type.trace(definitionSupplier);
if (varargElementType != null) {
varargElementType.trace(definitionSupplier);
}
}
}