| // Copyright (c) 2018, 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.position; | |
| import com.android.tools.r8.Keep; | |
| import com.android.tools.r8.graph.DexEncodedMethod; | |
| import com.android.tools.r8.graph.DexMethod; | |
| import com.android.tools.r8.graph.ProgramMethod; | |
| import com.android.tools.r8.references.MethodReference; | |
| import com.android.tools.r8.references.TypeReference; | |
| import java.util.List; | |
| import java.util.stream.Collectors; | |
| /** A {@link Position} denoting a method. */ | |
| @Keep | |
| public class MethodPosition implements Position { | |
| private final MethodReference method; | |
| private final Position textPosition; | |
| @Deprecated | |
| public MethodPosition(DexMethod method) { | |
| this(method.asMethodReference()); | |
| } | |
| @Deprecated | |
| public MethodPosition(MethodReference method) { | |
| this(method, Position.UNKNOWN); | |
| } | |
| private MethodPosition(MethodReference method, Position textPosition) { | |
| this.method = method; | |
| this.textPosition = textPosition; | |
| } | |
| public static MethodPosition create(ProgramMethod method) { | |
| return create(method.getDefinition()); | |
| } | |
| public static MethodPosition create(DexEncodedMethod method) { | |
| Position position = UNKNOWN; | |
| if (method.hasCode() && method.getCode().isCfCode()) { | |
| position = method.getCode().asCfCode().getDiagnosticPosition(); | |
| } | |
| return create(method.getReference().asMethodReference(), position); | |
| } | |
| public static MethodPosition create(MethodReference method) { | |
| return new MethodPosition(method, Position.UNKNOWN); | |
| } | |
| public static MethodPosition create(MethodReference method, Position position) { | |
| return new MethodPosition(method, position); | |
| } | |
| /** The method */ | |
| public MethodReference getMethod() { | |
| return method; | |
| } | |
| /** The unqualified name of the method. */ | |
| public String getName() { | |
| return method.getMethodName(); | |
| } | |
| /** The type descriptor of the method holder. */ | |
| public String getHolder() { | |
| return method.getHolderClass().getDescriptor(); | |
| } | |
| /** The type descriptor of the methods return type. */ | |
| public String getReturnType() { | |
| return method.getReturnType().getDescriptor(); | |
| } | |
| /** The type descriptors for the methods formal parameter types. */ | |
| public List<String> getParameterTypes() { | |
| return method.getFormalTypes().stream() | |
| .map(TypeReference::getDescriptor) | |
| .collect(Collectors.toList()); | |
| } | |
| public Position getTextPosition() { | |
| return textPosition; | |
| } | |
| @Override | |
| public String toString() { | |
| return method.toString(); | |
| } | |
| @Override | |
| public String getDescription() { | |
| return toString(); | |
| } | |
| @Override | |
| public int hashCode() { | |
| return method.hashCode(); | |
| } | |
| @Override | |
| public boolean equals(Object o) { | |
| if (o instanceof MethodPosition) { | |
| return method.equals(((MethodPosition) o).method); | |
| } | |
| return false; | |
| } | |
| } |