blob: 12a7d8d17bed56b15f4d9c0ecca722137f75a0da [file] [log] [blame]
// 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;
}
}