|  | // 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.referenceTypeFromBinaryName; | 
|  |  | 
|  | import com.android.tools.r8.graph.AppView; | 
|  | import com.android.tools.r8.graph.DexDefinitionSupplier; | 
|  | import com.android.tools.r8.graph.DexString; | 
|  | import com.android.tools.r8.graph.DexType; | 
|  | import com.android.tools.r8.naming.NamingLens; | 
|  | import com.android.tools.r8.shaking.AppInfoWithLiveness; | 
|  | import com.android.tools.r8.utils.DescriptorUtils; | 
|  | import com.google.common.collect.ImmutableList; | 
|  | import java.util.List; | 
|  | import java.util.Map; | 
|  | import kotlinx.metadata.KmAnnotation; | 
|  | import kotlinx.metadata.KmAnnotationArgument; | 
|  |  | 
|  | // Holds information about a KmAnnotation | 
|  | public class KotlinAnnotationInfo { | 
|  |  | 
|  | private static final List<KotlinAnnotationInfo> EMPTY_ANNOTATIONS = ImmutableList.of(); | 
|  |  | 
|  | private final DexType annotationType; | 
|  | // TODO(b/155053894): Model KmAnnotationArgument. | 
|  | private final Map<String, KmAnnotationArgument<?>> arguments; | 
|  |  | 
|  | private KotlinAnnotationInfo( | 
|  | DexType annotationType, Map<String, KmAnnotationArgument<?>> arguments) { | 
|  | this.annotationType = annotationType; | 
|  | this.arguments = arguments; | 
|  | } | 
|  |  | 
|  | private static KotlinAnnotationInfo create( | 
|  | KmAnnotation annotation, DexDefinitionSupplier definitionSupplier) { | 
|  | return new KotlinAnnotationInfo( | 
|  | referenceTypeFromBinaryName(annotation.getClassName(), definitionSupplier), | 
|  | annotation.getArguments()); | 
|  | } | 
|  |  | 
|  | static List<KotlinAnnotationInfo> create( | 
|  | List<KmAnnotation> annotations, DexDefinitionSupplier definitionSupplier) { | 
|  | if (annotations.isEmpty()) { | 
|  | return EMPTY_ANNOTATIONS; | 
|  | } | 
|  | ImmutableList.Builder<KotlinAnnotationInfo> builder = ImmutableList.builder(); | 
|  | for (KmAnnotation annotation : annotations) { | 
|  | builder.add(create(annotation, definitionSupplier)); | 
|  | } | 
|  | return builder.build(); | 
|  | } | 
|  |  | 
|  | public void rewrite( | 
|  | KmVisitorProviders.KmAnnotationVisitorProvider visitorProvider, | 
|  | AppView<AppInfoWithLiveness> appView, | 
|  | NamingLens namingLens) { | 
|  | if (appView.appInfo().wasPruned(annotationType)) { | 
|  | return; | 
|  | } | 
|  | DexString descriptor = namingLens.lookupDescriptor(annotationType); | 
|  | String classifier = DescriptorUtils.descriptorToKotlinClassifier(descriptor.toString()); | 
|  | KmAnnotation annotation = new KmAnnotation(classifier, arguments); | 
|  | visitorProvider.get(annotation); | 
|  | } | 
|  | } |