blob: a00455f6eee80de17637964638efa611e11a0a97 [file] [log] [blame]
// 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.naming;
import com.android.tools.r8.naming.MemberNaming.Signature;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
/**
* Stores name information for a class.
* <p>
* This includes how the class was renamed and information on the classes members.
*/
public class ClassNaming {
public final String originalName;
final String renamedName;
/**
* Mapping from the renamed signature to the naming information for a member.
* <p>
* A renamed signature is a signature where the member's name has been obfuscated but not the type
* information.
**/
final Map<Signature, MemberNaming> members = new LinkedHashMap<>();
ClassNaming(String renamedName, String originalName) {
this.renamedName = renamedName;
this.originalName = originalName;
}
void addMemberEntry(MemberNaming entry) {
Signature renamedSignature = entry.renamedSignature;
members.put(renamedSignature, entry);
}
public MemberNaming lookup(Signature renamedSignature) {
return members.get(renamedSignature);
}
public MemberNaming lookupByOriginalSignature(Signature original) {
for (MemberNaming naming : members.values()) {
if (naming.signature.equals(original)) {
return naming;
}
}
return null;
}
public void forAllMemberNaming(Consumer<MemberNaming> consumer) {
members.values().forEach(consumer);
}
void write(Writer writer, boolean collapseRanges) throws IOException {
writer.append(originalName);
writer.append(" -> ");
writer.append(renamedName);
writer.append(":\n");
for (MemberNaming member : members.values()) {
member.write(writer, collapseRanges, true);
}
}
@Override
public String toString() {
try {
StringWriter writer = new StringWriter();
write(writer, false);
return writer.toString();
} catch (IOException e) {
return e.toString();
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ClassNaming)) {
return false;
}
ClassNaming that = (ClassNaming) o;
return originalName.equals(that.originalName)
&& renamedName.equals(that.renamedName)
&& members.equals(that.members);
}
@Override
public int hashCode() {
int result = originalName.hashCode();
result = 31 * result + renamedName.hashCode();
result = 31 * result + members.hashCode();
return result;
}
}