| // Copyright (c) 2021, 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.diagnostic.internal; |
| |
| import com.android.tools.r8.diagnostic.DefinitionClassContext; |
| import com.android.tools.r8.diagnostic.DefinitionContext; |
| import com.android.tools.r8.diagnostic.DefinitionFieldContext; |
| import com.android.tools.r8.diagnostic.DefinitionMethodContext; |
| import com.android.tools.r8.errors.Unreachable; |
| import com.android.tools.r8.graph.Definition; |
| import com.android.tools.r8.graph.ProgramDerivedContext; |
| import com.android.tools.r8.utils.FieldReferenceUtils; |
| import com.android.tools.r8.utils.MethodReferenceUtils; |
| import java.util.function.Consumer; |
| import java.util.function.Function; |
| |
| public class DefinitionContextUtils { |
| |
| public static void accept( |
| DefinitionContext definitionContext, |
| Consumer<DefinitionClassContext> definitionClassContextConsumer, |
| Consumer<DefinitionFieldContext> definitionFieldContextConsumer, |
| Consumer<DefinitionMethodContext> definitionMethodContextConsumer) { |
| if (definitionContext.isClassContext()) { |
| definitionClassContextConsumer.accept(definitionContext.asClassContext()); |
| } else if (definitionContext.isFieldContext()) { |
| definitionFieldContextConsumer.accept(definitionContext.asFieldContext()); |
| } else { |
| assert definitionContext.isMethodContext(); |
| definitionMethodContextConsumer.accept(definitionContext.asMethodContext()); |
| } |
| } |
| |
| public static <T> T apply( |
| DefinitionContext definitionContext, |
| Function<DefinitionClassContext, T> definitionClassContextFn, |
| Function<DefinitionFieldContext, T> definitionFieldContextFn, |
| Function<DefinitionMethodContext, T> definitionMethodContextFn) { |
| if (definitionContext.isClassContext()) { |
| return definitionClassContextFn.apply(definitionContext.asClassContext()); |
| } else if (definitionContext.isFieldContext()) { |
| return definitionFieldContextFn.apply(definitionContext.asFieldContext()); |
| } else { |
| assert definitionContext.isMethodContext(); |
| return definitionMethodContextFn.apply(definitionContext.asMethodContext()); |
| } |
| } |
| |
| public static DefinitionContext create(ProgramDerivedContext programDerivedContext) { |
| Definition context = programDerivedContext.getContext(); |
| DefinitionContextBase.Builder<?> builder; |
| if (context.isClass()) { |
| builder = |
| DefinitionClassContextImpl.builder() |
| .setClassContext(context.asClass().getClassReference()); |
| } else if (context.isField()) { |
| builder = |
| DefinitionFieldContextImpl.builder() |
| .setFieldContext(context.asField().getFieldReference()); |
| } else if (context.isMethod()) { |
| builder = |
| DefinitionMethodContextImpl.builder() |
| .setMethodContext(context.asMethod().getMethodReference()); |
| } else { |
| throw new Unreachable(); |
| } |
| return builder.setOrigin(context.getOrigin()).build(); |
| } |
| |
| public static String toSourceString(DefinitionContext definitionContext) { |
| return DefinitionContextUtils.apply( |
| definitionContext, |
| classContext -> classContext.getClassReference().getTypeName(), |
| fieldContext -> FieldReferenceUtils.toSourceString(fieldContext.getFieldReference()), |
| methodContext -> MethodReferenceUtils.toSourceString(methodContext.getMethodReference())); |
| } |
| } |