package org.jetbrains.ether.dependencyView;
import groovyjarjarasm.asm.Opcodes;
import org.jetbrains.ether.RW;
import java.io.BufferedReader;
import java.io.BufferedWriter;
/**
* Created by IntelliJ IDEA.
* User: db
* Date: 01.03.11
* Time: 17:57
* To change this template use File | Settings | File Templates.
*/
public abstract class Proto implements RW.Writable {
public final int access;
public final StringCache.S signature;
public final StringCache.S name;
protected Proto(final int access, final String signature, final StringCache.S name) {
this.access = access;
this.signature = StringCache.get(signature != null ? signature : "");
this.name = name;
}
protected Proto (final BufferedReader r) {
access = RW.readInt (r);
signature = StringCache.get(RW.readString(r));
name = StringCache.get(RW.readString(r));
}
public void write (final BufferedWriter w) {
RW.writeln(w, Integer.toString (access));
RW.writeln(w, signature.value);
RW.writeln(w, name.value);
}
public Difference difference (final Proto past) {
int diff = Difference.NONE;
if (past.access != access) {
diff |= Difference.ACCESS;
}
if (! past.signature.equals(signature)) {
diff |= Difference.SIGNATURE;
}
final int base = diff;
return new Difference() {
@Override
public int base() {
return base;
}
@Override
public boolean no() {
return base == Difference.NONE;
}
@Override
public int addedModifiers() {
return ~past.access & access;
}
@Override
public int removedModifiers() {
return ~access & past.access;
}
@Override
public boolean packageLocalOn() {
return
((past.access & Opcodes.ACC_PRIVATE) != 0 ||
(past.access & Opcodes.ACC_PUBLIC) != 0 ||
(past.access & Opcodes.ACC_PROTECTED) != 0
)
&&
((access & Opcodes.ACC_PRIVATE) == 0 &&
(access & Opcodes.ACC_PROTECTED) == 0 &&
(access & Opcodes.ACC_PUBLIC) == 0);
}
};
}
}