[ANN] InspectionGadgets 0.0.5 released
Announcing the release of InspectionGadgets version 0.0.5, available at http://www.intellij.org/twiki/bin/view/Main/InspectionGadgets. Requires Aurora version 944 or higher.
Changes since version 0.0.4
Recompiled to handle PSI changes in 944.
New Inspections
equals() between objects of inconvertible types
Implicit numeric conversion
Numeric cast that lose precision
Method overrides static method of superclass.
Method overrides private method of superclass
Manual array copying
Static collections
Zero-length array allocation
Use of java.lang.reflect
Busy wait
Single class import
Unused import
Redundant import
main() with signature other than public static void main(String[])
Class explicitly extends java.lang.Object
More auto corrections, including corrections for
C-style array declaration
Multiple variables in one declaration
Variables of different types in one declaration
Call to Thread.run
Call to notify() instead of notifyAll()
Transient field on non-serializable class
Bugfixes
请先登录再写评论。
class Base {
public static void method(Object a) {}
public void method(){}
}
class Sub {
public void method(){}
}
Invalid warning on Sub.method(): Method 'method' overrides a static method
of a superclass.
Base is a lib class, so I can't do anything about this :(
java.lang.NullPointerException
at
com.siyeh.ig.bugs.EqualsBetweenInconvertibleTypesInspection$EqualsBetweenInc
onvertibleTypesVisitor.visitMethodCallExpression(EqualsBetweenInconvertibleT
ypesInspection.java:83)
at com.intellij.psi.impl.source.g.a.bb.accept(bb.java:3)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:1
72)
at
com.intellij.psi.JavaElementVisitor.visitReturnStatement(JavaElementVisitor.
java:159)
at com.intellij.psi.impl.source.g.a.bj.accept(bj.java:2)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:5
9)
at com.intellij.psi.impl.source.g.a.bt.accept(bt.java:6)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:1
72)
at
com.intellij.psi.JavaElementVisitor.visitBlockStatement(JavaElementVisitor.j
ava:151)
at com.intellij.psi.impl.source.g.a.i.accept(i.java:2)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:1
72)
at
com.intellij.psi.JavaElementVisitor.visitIfStatement(JavaElementVisitor.java
:133)
at com.intellij.psi.impl.source.g.a.v.accept(v.java:6)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:5
9)
at com.intellij.psi.impl.source.g.a.bt.accept(bt.java:6)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:1
72)
at
com.intellij.psi.JavaElementVisitor.visitSwitchStatement(JavaElementVisitor.
java:20)
at com.intellij.psi.impl.source.g.a.bm.accept(bm.java:3)
at com.intellij.psi.impl.source.g.u.acceptChildren(u.java:75)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:5
9)
at com.intellij.psi.impl.source.g.a.bt.accept(bt.java:6)
at com.intellij.psi.impl.source.bg.acceptChildren(bg.java:46)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElement
Visitor.java)
at
com.intellij.psi.JavaElementVisitor.visitMethod(JavaElementVisitor.java:7)
at com.intellij.psi.impl.source.bt.accept(bt.java:86)
at
com.siyeh.ig.ExpressionInspection.checkMethod(ExpressionInspection.java:45)
at com.intellij.codeInsight.g.a.bw.a(bw.java:90)
at com.intellij.codeInsight.g.a.cn.run(cn.java:12)
at com.intellij.openapi.application.a.d.runReadAction(d.java:310)
at com.intellij.codeInsight.g.a.db.a(db.java:5)
at com.intellij.codeInsight.g.a.db.b(db.java:3)
at com.intellij.codeInsight.g.a.cm.run(cm.java:0)
at com.intellij.progress.c.a(c.java:9)
at com.intellij.codeInsight.g.a.db.run(db.java:15)
If I turn on the "inner class field hides outer class field" inspection,
I get complaints about nested serializable classes that declare a
serialVersionUID. Should this be a special case where you are allowed
to hide the outer class field without a warning?
(And "gauranteed" should be "guaranteed" in some inspection descriptions.)
Reasonable (to the extent that nested serializable classes are reasonable, but that's another story). I'll make the fix
Dave Griffith wrote:
Well, it's not exactly my idea... It's just that
javax.swing.AbstractAction is serializable and I don't want to make all
my Action classes top level classes.
I got an exception while viewing a file with lots of errors (playing
around with modules and trying to find a clean way of separating my
project into multiple modules with fewer dependencies).
Error message: Exception happened in local inspection tool: equals()
between objects of inconvertible types
java.lang.NullPointerException
at
com.siyeh.ig.bugs.EqualsBetweenInconvertibleTypesInspection$EqualsBetweenInconvertibleTypesVisitor.visitMethodCallExpression(EqualsBetweenInconvertibleTypesInspection.java:83)
at com.intellij.psi.impl.source.d.a.z.accept(z.java)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:52)
at
com.intellij.psi.JavaElementVisitor.visitIfStatement(JavaElementVisitor.java:81)
at com.intellij.psi.impl.source.d.a.t.accept(t.java:29)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:37)
at com.intellij.psi.impl.source.d.a.br.accept(br.java:1)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:52)
at
com.intellij.psi.JavaElementVisitor.visitBlockStatement(JavaElementVisitor.java:90)
at com.intellij.psi.impl.source.d.a.g.accept(g.java:3)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:52)
at
com.intellij.psi.JavaElementVisitor.visitForStatement(JavaElementVisitor.java:130)
at com.intellij.psi.impl.source.d.a.s.accept(s.java:1)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:37)
at com.intellij.psi.impl.source.d.a.br.accept(br.java:1)
at com.intellij.psi.impl.source.o.acceptChildren(o.java:5)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitMethod(JavaElementVisitor.java:158)
at com.intellij.psi.impl.source.bb.accept(bb.java:59)
at
com.siyeh.ig.ExpressionInspection.checkMethod(ExpressionInspection.java:45)
at com.intellij.codeInsight.a.a.w.a(w.java:34)
at com.intellij.codeInsight.a.a.bj$1.run(bj$1.java:2)
at com.intellij.openapi.application.a.b.runReadAction(b.java:252)
at com.intellij.codeInsight.a.a.bj.a(bj.java:20)
at com.intellij.codeInsight.a.a.bj.access$100(bj.java:16)
at com.intellij.codeInsight.a.a.bj$0.run(bj$0.java:0)
at com.intellij.progress.c.a(c.java:9)
at com.intellij.codeInsight.a.a.bj.run(bj.java:1)
FYI Exception found:
ERROR - emon.impl.LocalInspectionsPass - Exception happened
in local
inspection tool: Manual array copy
ERROR - emon.impl.LocalInspectionsPass - IntelliJ IDEA
(Aurora) Bui
ld #957
ERROR - emon.impl.LocalInspectionsPass - JDK: 1.4.2
ERROR - emon.impl.LocalInspectionsPass - VM: Java HotSpot(TM)
Client
VM
ERROR - emon.impl.LocalInspectionsPass - Vendor: Sun
Microsystems Inc
.
ERROR - emon.impl.LocalInspectionsPass - OS: Windows XP
ERROR - emon.impl.LocalInspectionsPass - Last Action:
EditorBackSpace
ERROR - emon.impl.LocalInspectionsPass - Exception happened
in local
inspection tool: Manual array copy
java.lang.NullPointerException
at
com.siyeh.ig.psiutils.SideEffectChecker.mayHaveSideEffects(SideEffect
Checker.java:14)
at
com.siyeh.ig.performance.ManualArrayCopyInspection$ManualArrayCopyVis
itor.expressionIsArrayMove(ManualArrayCopyInspection.java:241)
at
com.siyeh.ig.performance.ManualArrayCopyInspection$ManualArrayCopyVis
itor.bodyIsArrayMove(ManualArrayCopyInspection.java:191)
at
com.siyeh.ig.performance.ManualArrayCopyInspection$ManualArrayCopyVis
itor.bodyIsArrayMove(ManualArrayCopyInspection.java:209)
at
com.siyeh.ig.performance.ManualArrayCopyInspection$ManualArrayCopyVis
itor.visitForStatement(ManualArrayCopyInspection.java:169)
at com.intellij.psi.impl.source.d.a.s.accept(s.java:1)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursive
ElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor
.java:37)
at com.intellij.psi.impl.source.d.a.br.accept(br.java:1)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursive
ElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor
.java:52)
at
com.intellij.psi.JavaElementVisitor.visitBlockStatement(JavaElementVi
sitor.java:90)
at com.intellij.psi.impl.source.d.a.g.accept(g.java:3)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursive
ElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor
.java:52)
at
com.intellij.psi.JavaElementVisitor.visitIfStatement(JavaElementVisit
or.java:81)
at com.intellij.psi.impl.source.d.a.t.accept(t.java:29)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursive
ElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor
.java:37)
at com.intellij.psi.impl.source.d.a.br.accept(br.java:1)
at com.intellij.psi.impl.source.o.acceptChildren(o.java:5)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursive
ElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitMethod(JavaElementVisitor.ja
va:158)
at com.intellij.psi.impl.source.bb.accept(bb.java:59)
at
com.siyeh.ig.ExpressionInspection.checkMethod(ExpressionInspection.ja
va:45)
at com.intellij.codeInsight.a.a.w.a(w.java:34)
at com.intellij.codeInsight.a.a.bj$1.run(bj$1.java:2)
at com.intellij.openapi.application.a.b.runReadAction(b.java:252)
at com.intellij.codeInsight.a.a.bj.a(bj.java:20)
at com.intellij.codeInsight.a.a.bj.access$100(bj.java:16)
at com.intellij.codeInsight.a.a.bj$0.run(bj$0.java:0)
at com.intellij.progress.c.a(c.java:9)
at com.intellij.codeInsight.a.a.bj.run(bj.java:1)
Thanks for a great plugin!
One comment and one unrelated stack trace: we often have imports like
import java.util.*
import com.xxx.finance.*;
import com.xxx.finance.Currency;
This allows us to specify our Currency class over the java.util version
without individual imports or horrible FQN throught the code.
InspectionGadgets thinks that it's a redundant import :(
Here's the stack trace (with build 957, viewing java.awt.Window.java)
Error message: Exception happened in local inspection tool: Unused import
java.lang.NullPointerException
at
com.siyeh.ig.imports.ImportIsUsedVisitor.visitReferenceElement(ImportIsUsedVisitor.java:33)
at com.intellij.psi.impl.source.k.accept(k.java:238)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitTypeElement(JavaElementVisitor.java:9)
at com.intellij.psi.impl.source.l.accept(l.java:17)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitVariable(JavaElementVisitor.java:47)
at
com.intellij.psi.JavaElementVisitor.visitLocalVariable(JavaElementVisitor.java:26)
at com.intellij.psi.impl.source.d.a.y.accept(y.java:51)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitStatement(JavaElementVisitor.java:52)
at
com.intellij.psi.JavaElementVisitor.visitDeclarationStatement(JavaElementVisitor.java:162)
at com.intellij.psi.impl.source.d.a.l.accept(l.java)
at com.intellij.psi.impl.source.d.s.acceptChildren(s.java:32)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitCodeBlock(JavaElementVisitor.java:37)
at com.intellij.psi.impl.source.d.a.br.accept(br.java:1)
at com.intellij.psi.impl.source.o.acceptChildren(o.java:5)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitMethod(JavaElementVisitor.java:158)
at com.intellij.psi.impl.source.bb.accept(bb.java:59)
at com.intellij.psi.impl.source.o.acceptChildren(o.java:5)
at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:1)
at
com.intellij.psi.JavaElementVisitor.visitClass(JavaElementVisitor.java:126)
at com.intellij.psi.impl.source.r.accept(r.java:250)
at
com.siyeh.ig.imports.UnusedImportInspection$UnusedImportVisitor.isNecessaryImport(UnusedImportInspection.java:63)
at
com.siyeh.ig.imports.UnusedImportInspection$UnusedImportVisitor.visitClass(UnusedImportInspection.java:52)
at com.intellij.psi.impl.source.r.accept(r.java:250)
at com.siyeh.ig.ClassInspection.checkClass(ClassInspection.java:22)
at com.intellij.codeInsight.a.a.w.a(w.java:42)
at com.intellij.codeInsight.a.a.bj$1.run(bj$1.java:2)
at com.intellij.openapi.application.a.b.runReadAction(b.java:252)
at com.intellij.codeInsight.a.a.bj.a(bj.java:20)
at com.intellij.codeInsight.a.a.bj.access$100(bj.java:16)
at com.intellij.codeInsight.a.a.bj$0.run(bj$0.java:0)
at com.intellij.progress.c.a(c.java:9)
at com.intellij.codeInsight.a.a.bj.run(bj.java:1)
NPE when sorting missorted modifiers
java.lang.NullPointerException
at com.intellij.psi.impl.source.o.isWritable(o.java:81)
at com.intellij.psi.impl.j.a(j.java:2)
at com.intellij.psi.impl.source.bh.checkSetModifierProperty(bh.java:22)
at com.intellij.psi.impl.source.bh.setModifierProperty(bh.java:93)
at
com.siyeh.ig.style.MissortedModifiersInspection$SortModifiersFix.applyFix(MissortedModifiersInspection.java:89)
at com.intellij.codeInspection.v.r$2.run(r$2.java:2)
at com.intellij.openapi.application.a.b.runWriteAction(b.java:296)
at com.intellij.codeInspection.v.r$1.run(r$1.java:6)
at com.intellij.openapi.command.a.a.executeCommand(a.java:22)
at com.intellij.codeInspection.v.r.a(r.java:28)
at com.intellij.codeInspection.v.r.actionPerformed(r.java:37)
at com.intellij.openapi.actionSystem.a.c$0.run(c$0.java:4)
at com.intellij.ui.ba.a(ba.java:38)
at com.intellij.ui.ba$4.keyTyped(ba$4.java:5)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown
Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown
Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at com.intellij.ide.s.a(s.java:41)
at com.intellij.ide.s.dispatchEvent(s.java:67)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)