blob: f2a6eb4ae8f0924d145c4e96af3603c99f123c25 [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.utils.Reporter;
import java.util.List;
import kotlinx.metadata.KmFlexibleTypeUpperBound;
import kotlinx.metadata.KmType;
import kotlinx.metadata.jvm.JvmExtensionsKt;
public class KotlinFlexibleTypeUpperBoundInfo extends KotlinTypeInfo {
private static final String KOTLIN_JVM_PLATFORMTYPE = "kotlin.jvm.PlatformType";
private static final KotlinFlexibleTypeUpperBoundInfo NO_FLEXIBLE_UPPER_BOUND =
new KotlinFlexibleTypeUpperBoundInfo(
0, null, null, null, null, null, null, KOTLIN_JVM_PLATFORMTYPE);
private final String typeFlexibilityId;
private KotlinFlexibleTypeUpperBoundInfo(
int flags,
KotlinClassifierInfo classifier,
KotlinTypeInfo abbreviatedType,
KotlinTypeInfo outerType,
List<KotlinTypeProjectionInfo> arguments,
List<KotlinAnnotationInfo> annotations,
KotlinFlexibleTypeUpperBoundInfo flexibleTypeUpperBoundInfo,
String typeFlexibilityId) {
super(
flags,
classifier,
abbreviatedType,
outerType,
arguments,
annotations,
flexibleTypeUpperBoundInfo);
this.typeFlexibilityId = typeFlexibilityId;
assert KOTLIN_JVM_PLATFORMTYPE.equals(typeFlexibilityId);
}
static KotlinFlexibleTypeUpperBoundInfo create(
KmFlexibleTypeUpperBound flexibleTypeUpperBound, DexItemFactory factory, Reporter reporter) {
if (flexibleTypeUpperBound == null) {
return NO_FLEXIBLE_UPPER_BOUND;
}
KmType kmType = flexibleTypeUpperBound.getType();
return new KotlinFlexibleTypeUpperBoundInfo(
kmType.getFlags(),
KotlinClassifierInfo.create(kmType.classifier, factory, reporter),
KotlinTypeInfo.create(kmType.getAbbreviatedType(), factory, reporter),
KotlinTypeInfo.create(kmType.getOuterType(), factory, reporter),
getArguments(kmType.getArguments(), factory, reporter),
KotlinAnnotationInfo.create(JvmExtensionsKt.getAnnotations(kmType), factory),
KotlinFlexibleTypeUpperBoundInfo.create(
kmType.getFlexibleTypeUpperBound(), factory, reporter),
flexibleTypeUpperBound.getTypeFlexibilityId());
}
boolean rewrite(
KmVisitorProviders.KmFlexibleUpperBoundVisitorProvider visitorProvider,
AppView<?> appView,
NamingLens namingLens) {
if (this == NO_FLEXIBLE_UPPER_BOUND) {
// Nothing to do.
return false;
}
return super.rewrite(
flags -> visitorProvider.get(flags, typeFlexibilityId), appView, namingLens);
}
@Override
public void trace(DexDefinitionSupplier definitionSupplier) {
if (this == NO_FLEXIBLE_UPPER_BOUND) {
return;
}
super.trace(definitionSupplier);
}
}