Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28921/src/com/mebigfatguy/fbcontrib/detect
Added Files:
FinalParameters.java
Log Message:
Initial Checkin: FinalParameters
--- NEW FILE: FinalParameters.java ---
package com.mebigfatguy.fbcontrib.detect;
import java.util.HashSet;
import java.util.Set;
import org.apache.bcel.Constants;
import org.apache.bcel.classfile.Code;
import org.apache.bcel.classfile.LocalVariable;
import org.apache.bcel.classfile.LocalVariableTable;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.Type;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.BytecodeScanningDetector;
import edu.umd.cs.findbugs.StatelessDetector;
public class FinalParameters extends BytecodeScanningDetector implements StatelessDetector
{
private BugReporter bugReporter;
private Set<Integer> changedParms;
private int parmCount;
private boolean isStatic;
private boolean isAbstract;
public FinalParameters(BugReporter bugReporter) {
this.bugReporter = bugReporter;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void visitMethod(Method obj) {
isStatic = (obj.getAccessFlags() & Constants.ACC_STATIC) != 0;
isAbstract = (obj.getAccessFlags() & Constants.ACC_ABSTRACT) != 0;
parmCount = Type.getArgumentTypes(obj.getSignature()).length;
super.visitMethod(obj);
}
public void visitCode(Code obj) {
if (isAbstract)
return;
changedParms = new HashSet<Integer>();
super.visitCode(obj);
for (int i = 0; i < parmCount; i++) {
if (changedParms.remove(new Integer(i)))
continue;
int reg;
if (!isStatic)
reg = i + 1;
else
reg = i;
String parmName = getRegisterName(obj, reg);
bugReporter.reportBug( new BugInstance( this, "FP_FINAL_PARAMETERS", LOW_PRIORITY)
.addClass(this)
.addMethod(this)
.addSourceLine(this, 0)
.addString(parmName));
}
}
public void sawOpcode(int seen) {
if ((seen == ASTORE) || ((seen >= ASTORE_0) && (seen <= ASTORE_3))) {
int parm = getAStoreParameter(seen);
if (parm >= 0)
changedParms.add(new Integer(parm));
}
}
private String getRegisterName(Code obj, int reg) {
LocalVariableTable lvt = obj.getLocalVariableTable();
if (lvt != null) {
LocalVariable lv = lvt.getLocalVariable(reg, 0);
if (lv != null)
return lv.getName();
}
return String.valueOf(reg);
}
private int getAStoreParameter(int seen) {
int reg;
if (seen == ASTORE)
reg = getRegisterOperand();
else
reg = seen - ASTORE_0;
if (!isStatic)
reg--;
if (reg >= parmCount)
reg = -1;
return reg;
}
}
|