|  | // 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.rewriteList; | 
|  | import static com.android.tools.r8.utils.FunctionUtils.forEachApply; | 
|  |  | 
|  | 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.List; | 
|  | import java.util.function.Consumer; | 
|  | import kotlinx.metadata.KmEffect; | 
|  | import kotlinx.metadata.KmEffectInvocationKind; | 
|  | import kotlinx.metadata.KmEffectType; | 
|  |  | 
|  | public class KotlinEffectInfo implements EnqueuerMetadataTraceable { | 
|  |  | 
|  | private final KmEffectType type; | 
|  | private final KmEffectInvocationKind invocationKind; | 
|  | private final List<KotlinEffectExpressionInfo> constructorArguments; | 
|  | private final KotlinEffectExpressionInfo conclusion; | 
|  |  | 
|  | public KotlinEffectInfo( | 
|  | KmEffectType type, | 
|  | KmEffectInvocationKind invocationKind, | 
|  | List<KotlinEffectExpressionInfo> constructorArguments, | 
|  | KotlinEffectExpressionInfo conclusion) { | 
|  | this.type = type; | 
|  | this.invocationKind = invocationKind; | 
|  | this.constructorArguments = constructorArguments; | 
|  | this.conclusion = conclusion; | 
|  | } | 
|  |  | 
|  | static KotlinEffectInfo create(KmEffect effect, DexItemFactory factory, Reporter reporter) { | 
|  | return new KotlinEffectInfo( | 
|  | effect.getType(), | 
|  | effect.getInvocationKind(), | 
|  | KotlinEffectExpressionInfo.create(effect.getConstructorArguments(), factory, reporter), | 
|  | KotlinEffectExpressionInfo.create(effect.getConclusion(), factory, reporter)); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void trace(DexDefinitionSupplier definitionSupplier) { | 
|  | forEachApply(constructorArguments, arg -> arg::trace, definitionSupplier); | 
|  | conclusion.trace(definitionSupplier); | 
|  | } | 
|  |  | 
|  | boolean rewrite(Consumer<KmEffect> consumer, AppView<?> appView) { | 
|  | KmEffect kmEffect = consume(new KmEffect(type, invocationKind), consumer); | 
|  | boolean rewritten = conclusion.rewrite(kmEffect::setConclusion, appView); | 
|  | rewritten |= | 
|  | rewriteList( | 
|  | appView, | 
|  | constructorArguments, | 
|  | kmEffect.getConstructorArguments(), | 
|  | KotlinEffectExpressionInfo::rewrite); | 
|  | return rewritten; | 
|  | } | 
|  | } |