| // 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.shaking.EnqueuerMetadataTraceable; |
| import com.android.tools.r8.utils.Reporter; |
| import java.util.function.Consumer; |
| import kotlinx.metadata.KmTypeProjection; |
| import kotlinx.metadata.KmVariance; |
| |
| // Provides access to Kotlin information about the type projection of a type (arguments). |
| public class KotlinTypeProjectionInfo implements EnqueuerMetadataTraceable { |
| |
| final KmVariance variance; |
| final KotlinTypeInfo typeInfo; |
| |
| private KotlinTypeProjectionInfo(KmVariance variance, KotlinTypeInfo typeInfo) { |
| this.variance = variance; |
| this.typeInfo = typeInfo; |
| } |
| |
| static KotlinTypeProjectionInfo create( |
| KmTypeProjection kmTypeProjection, DexItemFactory factory, Reporter reporter) { |
| return new KotlinTypeProjectionInfo( |
| kmTypeProjection.getVariance(), |
| KotlinTypeInfo.create(kmTypeProjection.getType(), factory, reporter)); |
| } |
| |
| private boolean isStarProjection() { |
| return variance == null && typeInfo == null; |
| } |
| |
| boolean rewrite(Consumer<KmTypeProjection> consumer, AppView<?> appView) { |
| if (isStarProjection()) { |
| consumer.accept(KmTypeProjection.STAR); |
| return false; |
| } else { |
| return typeInfo.rewrite( |
| kmType -> consumer.accept(new KmTypeProjection(variance, kmType)), appView); |
| } |
| } |
| |
| @Override |
| public void trace(DexDefinitionSupplier definitionSupplier) { |
| if (typeInfo != null) { |
| typeInfo.trace(definitionSupplier); |
| } |
| } |
| } |