| // Copyright (c) 2016, 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.graph; |
| |
| import com.android.tools.r8.dex.IndexedItemCollection; |
| import com.android.tools.r8.naming.NamingLens; |
| |
| public class DexProto extends IndexedDexItem implements PresortedComparable<DexProto> { |
| |
| public static final DexProto SENTINEL = new DexProto(null, null, null); |
| |
| public final DexString shorty; |
| public final DexType returnType; |
| public final DexTypeList parameters; |
| |
| DexProto(DexString shorty, DexType returnType, DexTypeList parameters) { |
| this.shorty = shorty; |
| this.returnType = returnType; |
| this.parameters = parameters; |
| } |
| |
| public DexType getParameter(int index) { |
| return parameters.values[index]; |
| } |
| |
| @Override |
| public int computeHashCode() { |
| return shorty.hashCode() |
| + returnType.hashCode() * 7 |
| + parameters.hashCode() * 31; |
| } |
| |
| @Override |
| public boolean computeEquals(Object other) { |
| if (other instanceof DexProto) { |
| DexProto o = (DexProto) other; |
| return shorty.equals(o.shorty) |
| && returnType.equals(o.returnType) |
| && parameters.equals(o.parameters); |
| } |
| return false; |
| } |
| |
| @Override |
| public String toString() { |
| return "Proto " + shorty + " " + returnType + " " + parameters; |
| } |
| |
| @Override |
| public void collectIndexedItems(IndexedItemCollection indexedItems, |
| DexMethod method, int instructionOffset) { |
| if (indexedItems.addProto(this)) { |
| shorty.collectIndexedItems(indexedItems, method, instructionOffset); |
| returnType.collectIndexedItems(indexedItems, method, instructionOffset); |
| parameters.collectIndexedItems(indexedItems, method, instructionOffset); |
| } |
| } |
| |
| @Override |
| public int getOffset(ObjectToOffsetMapping mapping) { |
| return mapping.getOffsetFor(this); |
| } |
| |
| @Override |
| public int slowCompareTo(DexProto other) { |
| int result = returnType.slowCompareTo(other.returnType); |
| if (result == 0) { |
| result = parameters.slowCompareTo(other.parameters); |
| } |
| return result; |
| } |
| |
| @Override |
| public int slowCompareTo(DexProto other, NamingLens namingLens) { |
| int result = returnType.slowCompareTo(other.returnType, namingLens); |
| if (result == 0) { |
| result = parameters.slowCompareTo(other.parameters, namingLens); |
| } |
| return result; |
| } |
| |
| @Override |
| public String toSmaliString() { |
| return toDescriptorString(); |
| } |
| |
| public String toDescriptorString() { |
| return toDescriptorString(NamingLens.getIdentityLens()); |
| } |
| |
| public String toDescriptorString(NamingLens lens) { |
| StringBuilder builder = new StringBuilder(); |
| builder.append("("); |
| for (int i = 0; i < parameters.values.length; i++) { |
| builder.append(lens.lookupDescriptor(parameters.values[i])); |
| } |
| builder.append(")"); |
| builder.append(lens.lookupDescriptor(returnType)); |
| return builder.toString(); |
| } |
| } |