[Fb-contrib-commit] fb-contrib/src/com/mebigfatguy/fbcontrib/detect FinalParameters.java,1.4,1.5
Brought to you by:
dbrosius
|
From: Dave B. <dbr...@us...> - 2005-10-20 06:33:23
|
Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6733/src/com/mebigfatguy/fbcontrib/detect Modified Files: FinalParameters.java Log Message: conventional wisdom says you shouldn't try to revive a bad idea, but, dag gummit, it looks like thats what i done did. Get FinalParameters working thru source line annotations Index: FinalParameters.java =================================================================== RCS file: /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/FinalParameters.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- FinalParameters.java 1 Oct 2005 07:38:02 -0000 1.4 +++ FinalParameters.java 20 Oct 2005 06:33:15 -0000 1.5 @@ -18,7 +18,12 @@ */ package com.mebigfatguy.fbcontrib.detect; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.apache.bcel.Constants; @@ -31,15 +36,25 @@ import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs.findbugs.BugReporter; import edu.umd.cs.findbugs.BytecodeScanningDetector; +import edu.umd.cs.findbugs.SourceLineAnnotation; import edu.umd.cs.findbugs.StatelessDetector; +import edu.umd.cs.findbugs.ba.AnalysisContext; +import edu.umd.cs.findbugs.ba.ClassContext; +import edu.umd.cs.findbugs.ba.SourceFile; +import edu.umd.cs.findbugs.ba.SourceFinder; public class FinalParameters extends BytecodeScanningDetector implements StatelessDetector { private BugReporter bugReporter; private Set<Integer> changedParms; + private String methodName; private int parmCount; private boolean isStatic; private boolean isAbstract; + private boolean srcInited; + private SourceLineAnnotation srcLineAnnotation; + private String[] sourceLines; + public FinalParameters(final BugReporter bugReporter) { this.bugReporter = bugReporter; @@ -51,7 +66,19 @@ } @Override - public void visitMethod(final Method obj) { + public void visitClassContext(ClassContext classContext) { + srcInited = false; + super.visitClassContext(classContext); + } + + @Override + public void visitMethod(final Method obj) { + methodName = obj.getName(); + if ("<clinit>".equals(methodName) || "<init>".equals(methodName)) + return; + + sourceLines = getSourceLines(obj); + isStatic = (obj.getAccessFlags() & Constants.ACC_STATIC) != 0; isAbstract = (obj.getAccessFlags() & Constants.ACC_ABSTRACT) != 0; parmCount = Type.getArgumentTypes(obj.getSignature()).length; @@ -59,13 +86,76 @@ super.visitMethod(obj); } + private String[] getSourceLines(Method obj) { + + BufferedReader sourceReader = null; + + if (srcInited) + return sourceLines; + + try { + srcLineAnnotation = SourceLineAnnotation.forEntireMethod(getClassContext().getJavaClass(), obj); + if (srcLineAnnotation != null) + { + SourceFinder sourceFinder = AnalysisContext.currentAnalysisContext().getSourceFinder(); + SourceFile sourceFile = sourceFinder.findSourceFile(srcLineAnnotation.getPackageName(), srcLineAnnotation.getSourceFile()); + sourceReader = new BufferedReader(new InputStreamReader(sourceFile.getInputStream())); + + List<String> lines = new ArrayList<String>(); + String line; + while ((line = sourceReader.readLine()) != null) + lines.add(line); + sourceLines = lines.toArray(new String[lines.size()]); + } + } catch (IOException ioe) { + //noop + } + finally { + try { + if (sourceReader != null) + sourceReader.close(); + } catch (IOException ioe2) { + //noop + } + } + srcInited = true; + return sourceLines; + } + @Override public void visitCode(final Code obj) { + if (sourceLines == null) + return; + if (isAbstract) return; - + + if ("<clinit>".equals(methodName) || "<init>".equals(methodName)) + return; + + int methodStart = srcLineAnnotation.getStartLine() - 2; + int methodLine = methodStart; + String line; + while (methodLine >= 0) { + line = sourceLines[methodLine]; + if (line.indexOf(methodName) >= 0) + break; + methodLine--; + } + + if (methodLine < 0) + return; + + for (int i = methodLine; i <= methodStart; i++) { + line = sourceLines[i]; + if (line.indexOf("final") >= 0) + return; + } + changedParms = new HashSet<Integer>(); super.visitCode(obj); + + for (int i = 0; i < parmCount; i++) { if (changedParms.remove(new Integer(i))) continue; |