package edu.umd.cs.findbugs.classfile.analysis;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Nonnull;
import org.objectweb.asm.Opcodes;
import edu.umd.cs.findbugs.classfile.ClassDescriptor;
import edu.umd.cs.findbugs.classfile.IClassConstants;
import edu.umd.cs.findbugs.classfile.ICodeBaseEntry;
public class ClassNameAndSuperclassInfo extends ClassDescriptor {
private final ClassDescriptor superclassDescriptor;
private final ClassDescriptor[] interfaceDescriptorList;
private final ICodeBaseEntry codeBaseEntry;
private final int accessFlags;
private final Set<ClassDescriptor> calledClassDescriptors;
private final int majorVersion, minorVersion;
public static class Builder {
ClassDescriptor classDescriptor;
ClassDescriptor superclassDescriptor;
ClassDescriptor[] interfaceDescriptorList;
ICodeBaseEntry codeBaseEntry;
int accessFlags;
int majorVersion, minorVersion;
Collection<ClassDescriptor> referencedClassDescriptorList;
Set<ClassDescriptor> calledClassDescriptors = Collections.<ClassDescriptor> emptySet();
public ClassNameAndSuperclassInfo build() {
return new ClassNameAndSuperclassInfo(classDescriptor, superclassDescriptor, interfaceDescriptorList, codeBaseEntry,
accessFlags, referencedClassDescriptorList, calledClassDescriptors, majorVersion, minorVersion);
}
public void setAccessFlags(int accessFlags) {
this.accessFlags = accessFlags;
}
public void setClassDescriptor(ClassDescriptor classDescriptor) {
this.classDescriptor = classDescriptor;
}
public void setCodeBaseEntry(ICodeBaseEntry codeBaseEntry) {
this.codeBaseEntry = codeBaseEntry;
}
public void setInterfaceDescriptorList(ClassDescriptor[] interfaceDescriptorList) {
this.interfaceDescriptorList = interfaceDescriptorList;
}
public void setSuperclassDescriptor(ClassDescriptor superclassDescriptor) {
this.superclassDescriptor = superclassDescriptor;
}
public void setClassfileVersion(int majorVersion, int minorVersion) {
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
}
public void setReferencedClassDescriptors(Collection<ClassDescriptor> referencedClassDescriptorList) {
if (referencedClassDescriptorList.size() == 0) {
this.referencedClassDescriptorList = Collections.emptyList();
} else {
this.referencedClassDescriptorList = new ArrayList<ClassDescriptor>(referencedClassDescriptorList);
}
}
public void setCalledClassDescriptors(Collection<ClassDescriptor> calledClassDescriptorList) {
if (calledClassDescriptorList.size() == 0) {
this.calledClassDescriptors = Collections.emptySet();
} else {
this.calledClassDescriptors = new HashSet<ClassDescriptor>(calledClassDescriptorList);
}
}
}
ClassNameAndSuperclassInfo(ClassDescriptor classDescriptor, ClassDescriptor superclassDescriptor,
ClassDescriptor[] interfaceDescriptorList, ICodeBaseEntry codeBaseEntry, int accessFlags,
Collection<ClassDescriptor> referencedClassDescriptorList,
@Nonnull Set<ClassDescriptor> calledClassDescriptors, int majorVersion, int minorVersion) {
super(classDescriptor.getClassName());
this.superclassDescriptor = superclassDescriptor;
this.interfaceDescriptorList = interfaceDescriptorList;
this.codeBaseEntry = codeBaseEntry;
this.accessFlags = accessFlags;
if (calledClassDescriptors == null) {
throw new NullPointerException("calledClassDescriptors must not be null");
}
this.calledClassDescriptors = calledClassDescriptors;
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
}
public int getAccessFlags() {
return accessFlags;
}
public int getMajorVersion() {
return majorVersion;
}
public int getMinorVersion() {
return minorVersion;
}
public ClassDescriptor getClassDescriptor() {
return this;
}
public ICodeBaseEntry getCodeBaseEntry() {
return codeBaseEntry;
}
public ClassDescriptor[] getInterfaceDescriptorList() {
return interfaceDescriptorList;
}
public Set<ClassDescriptor> getCalledClassDescriptors() {
return calledClassDescriptors;
}
public ClassDescriptor getSuperclassDescriptor() {
return superclassDescriptor;
}
private boolean isFlagSet(int flag) {
return (getAccessFlags() & flag) != 0;
}
public boolean isFinal() {
return isFlagSet(IClassConstants.ACC_FINAL);
}
public boolean isPrivate() {
return isFlagSet(IClassConstants.ACC_PRIVATE);
}
public boolean isProtected() {
return isFlagSet(IClassConstants.ACC_PROTECTED);
}
public boolean isPublic() {
return isFlagSet(IClassConstants.ACC_PUBLIC);
}
public boolean isStatic() {
return isFlagSet(IClassConstants.ACC_STATIC);
}
public boolean isInterface() {
return isFlagSet(IClassConstants.ACC_INTERFACE);
}
public boolean isAbstract() {
return isFlagSet(IClassConstants.ACC_ABSTRACT);
}
public boolean isAnnotation() {
return isFlagSet(IClassConstants.ACC_ANNOTATION);
}
public boolean isSynthetic() {
return isFlagSet(IClassConstants.ACC_SYNTHETIC);
}
public boolean isDeprecated() {
return isFlagSet(Opcodes.ACC_DEPRECATED);
}
}