dfa: highlight just method reference name on possible NPE warnings (IDEA-149904)

This commit is contained in:
peter
2016-01-20 14:28:04 +01:00
parent 3f53a3541e
commit b3c40ee773
41 changed files with 69 additions and 66 deletions

View File

@@ -435,9 +435,12 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool {
}
private void reportCallMayProduceNpe(ProblemsHolder holder, PsiMethodCallExpression callExpression, boolean onTheFly) {
LocalQuickFix[] fix = createNPEFixes(callExpression.getMethodExpression().getQualifierExpression(), callExpression, onTheFly);
PsiReferenceExpression methodExpression = callExpression.getMethodExpression();
LocalQuickFix[] fix = createNPEFixes(methodExpression.getQualifierExpression(), callExpression, onTheFly);
holder.registerProblem(callExpression,
PsiElement toHighlight = methodExpression.getReferenceNameElement();
if (toHighlight == null) toHighlight = methodExpression;
holder.registerProblem(toHighlight,
InspectionsBundle.message("dataflow.message.npe.method.invocation"),
fix);
}

View File

@@ -2,6 +2,6 @@
class A{
void test(){
Object container = null;
Runnable r = () -> container == null ? conta<caret>iner.toString() : "";
Runnable r = () -> container == null ? container.toS<caret>tring() : "";
}
}

View File

@@ -5,6 +5,6 @@ import java.lang.Integer;
class A{
void test(){
Integer integer = null;
int i = in<caret>teger.intValue();
int i = integer.int<caret>Value();
}
}

View File

@@ -2,6 +2,6 @@
class A {
void foo(){
String i = null;
<caret>i.hashCode();
i.has<caret>hCode();
}
}

View File

@@ -3,16 +3,16 @@
<problem>
<file>Test.java</file>
<line>9</line>
<description>Method invocation 'foo().foo()' may produce NullPointerException</description>
<description>Method invocation 'foo' may produce NullPointerException</description>
</problem>
<problem>
<file>Test.java</file>
<line>10</line>
<description>Method invocation 'foo().foo()' may produce NullPointerException</description>
<description>Method invocation 'foo' may produce NullPointerException</description>
</problem>
<problem>
<file>Test.java</file>
<line>10</line>
<description>Method invocation 'foo().foo().foo()' may produce NullPointerException</description>
<description>Method invocation 'foo' may produce NullPointerException</description>
</problem>
</problems>

View File

@@ -3,11 +3,11 @@
<problem>
<file>IDEADEV10489.java</file>
<line>10</line>
<description>Method invocation 's.length()' may produce NullPointerException</description>
<description>Method invocation 'length' may produce NullPointerException</description>
</problem>
<problem>
<file>IDEADEV10489.java</file>
<line>8</line>
<description>Method invocation 's.length()' may produce NullPointerException</description>
<description>Method invocation 'length' may produce NullPointerException</description>
</problem>
</problems>

View File

@@ -3,6 +3,6 @@
<problem>
<file>Npe.java</file>
<line>7</line>
<description>'o.hashCode()' may produce NullPointerException</description>
<description>'hashCode' may produce NullPointerException</description>
</problem>
</problems>

View File

@@ -3,6 +3,6 @@
<problem>
<file>Npe.java</file>
<line>6</line>
<description>Method invocation &lt;code&gt;((SomeInterfaceImpl)x).bar()&lt;/code&gt; may produce &lt;code&gt;java.lang.NullPointerException&lt;/code&gt;</description>
<description>Method invocation &lt;code&gt;bar&lt;/code&gt; may produce &lt;code&gt;java.lang.NullPointerException&lt;/code&gt;</description>
</problem>
</problems>

View File

@@ -3,7 +3,7 @@
<problem>
<file>Finally.java</file>
<line>9</line>
<description>Method invocation 'o.hashCode()' may produce java.lang.NullPointerException</description>
<description>Method invocation 'hashCode' may produce java.lang.NullPointerException</description>
</problem>
</problems>

View File

@@ -3,6 +3,6 @@
<problem>
<file>Test.java</file>
<line>72</line>
<description>Method invocation &lt;code&gt;foo.length()&lt;/code&gt; may produce &lt;code&gt;java.lang.NullPointerException&lt;/code&gt;</description>
<description>Method invocation &lt;code&gt;length&lt;/code&gt; may produce &lt;code&gt;java.lang.NullPointerException&lt;/code&gt;</description>
</problem>
</problems>

View File

@@ -8,7 +8,7 @@
<problem>
<file>CaseAndNpe.java</file>
<line>26</line>
<description>Method invocation 'o.equals(o)' may produce NullPointerException</description>
<description>Method invocation 'equals' may produce NullPointerException</description>
</problem>
<problem>
<file>CaseAndNpe.java</file>

View File

@@ -10,17 +10,17 @@ class BrokenAlignment {
}
data = new Data(null, <warning descr="Passing 'null' argument to non annotated parameter">null</warning>);
System.out.println(<warning descr="Method invocation 'data.getText().hashCode()' may produce 'java.lang.NullPointerException'">data.getText().hashCode()</warning>);
System.out.println(data.getText().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
if (data.getInner() != null) {
System.out.println(data.getInner().hashCode());
System.out.println(<warning descr="Method invocation 'data.getInner().getText().hashCode()' may produce 'java.lang.NullPointerException'">data.getInner().getText().hashCode()</warning>);
System.out.println(data.getInner().getText().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
if (data.getInner() != null) {
System.out.println(data.getInner().hashCode());
}
data = new Data(null, <warning descr="Passing 'null' argument to non annotated parameter">null</warning>);
System.out.println(<warning descr="Method invocation 'data.getInner().hashCode()' may produce 'java.lang.NullPointerException'">data.getInner().hashCode()</warning>);
System.out.println(data.getInner().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}
@@ -36,7 +36,7 @@ class BrokenAlignment {
System.out.println(data.getInnerOverridden().hashCode());
}
if (data.something() != null) {
System.out.println(<warning descr="Method invocation 'data.something().hashCode()' may produce 'java.lang.NullPointerException'">data.something().hashCode()</warning>);
System.out.println(data.something().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -7,17 +7,17 @@ class BrokenAlignment {
}
data = new Data(null, <warning descr="Passing 'null' argument to non annotated parameter">null</warning>);
System.out.println(<warning descr="Method invocation 'data.text.hashCode()' may produce 'java.lang.NullPointerException'">data.text.hashCode()</warning>);
System.out.println(data.text.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
if (data.inner != null) {
System.out.println(data.inner.hashCode());
System.out.println(<warning descr="Method invocation 'data.inner.text.hashCode()' may produce 'java.lang.NullPointerException'">data.inner.text.hashCode()</warning>);
System.out.println(data.inner.text.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
if (<warning descr="Condition 'data.inner != null' is always 'true'">data.inner != null</warning>) {
System.out.println(data.inner.hashCode());
}
data = new Data(null, <warning descr="Passing 'null' argument to non annotated parameter">null</warning>);
System.out.println(<warning descr="Method invocation 'data.inner.hashCode()' may produce 'java.lang.NullPointerException'">data.inner.hashCode()</warning>);
System.out.println(data.inner.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -8,7 +8,7 @@ class Bar3 {
public void foo(@Nullable Object element) {
final String elementType = element != null ? element.toString() : null;
if (elementType == nullableString()) {
System.out.println(<warning descr="Method invocation 'element.hashCode()' may produce 'java.lang.NullPointerException'">element.hashCode()</warning>);
System.out.println(element.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -8,7 +8,7 @@ class Bar3 {
public void foo(@Nullable Object element) {
final String elementType = element != null ? element.toString() : null;
if (elementType == someString()) {
System.out.println(<warning descr="Method invocation 'element.hashCode()' may produce 'java.lang.NullPointerException'">element.hashCode()</warning>);
System.out.println(element.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -40,7 +40,7 @@ class Bar3 {
System.out.println(first.hashCode());
}
if (first == null) {
System.out.println(<warning descr="Method invocation 'first.hashCode()' may produce 'java.lang.NullPointerException'">first.hashCode()</warning>);
System.out.println(first.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}
}

View File

@@ -8,7 +8,7 @@ class Doo {
void foo(@Nullable String s) {
if (isMaybeNotNull(s)) {
System.out.println(<warning descr="Method invocation 's.length()' may produce 'java.lang.NullPointerException'">s.length()</warning>);
System.out.println(s.<warning descr="Method invocation 'length' may produce 'java.lang.NullPointerException'">length</warning>());
}
}

View File

@@ -8,7 +8,7 @@ class TestCase {
String s = normalizeSpace(unknown()).trim();
String s3 = normalizeSpaceInverted(unknown()).trim();
String s4 = <warning descr="Method invocation 'normalizeSpace(null).trim()' may produce 'java.lang.NullPointerException'">normalizeSpace(null).trim()</warning>;
String s4 = normalizeSpace(null).<warning descr="Method invocation 'trim' may produce 'java.lang.NullPointerException'">trim</warning>();
}
public static native String unknown();

View File

@@ -18,7 +18,7 @@ class Test {
} else if ("Queues".equals(parentName)) {
System.out.println(parentNode.toString());
}
System.out.println(<warning descr="Method invocation 'parentNode.toString()' may produce 'java.lang.NullPointerException'">parentNode.toString()</warning>);
System.out.println(parentNode.<warning descr="Method invocation 'toString' may produce 'java.lang.NullPointerException'">toString</warning>());
}
public static int foo(String a, String b) {

View File

@@ -29,7 +29,7 @@ class Main {
}
@NotNull
private Object test7(@NotNull Object defVal, @Nullable final Object val) {
if (<warning descr="Method invocation 'val.equals(defVal)' may produce 'java.lang.NullPointerException'">val.equals(defVal)</warning>) {
if (val.<warning descr="Method invocation 'equals' may produce 'java.lang.NullPointerException'">equals</warning>(defVal)) {
return defVal;
}
return defVal;

View File

@@ -9,7 +9,7 @@ class Zoo2 {
new Runnable() {
int hc = foo.hashCode();
int hc2 = <warning descr="Method invocation 'bar.hashCode()' may produce 'java.lang.NullPointerException'">bar.hashCode()</warning>;
int hc2 = bar.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
public void run() {
}

View File

@@ -23,7 +23,7 @@ class Test {
private static final Object CONST = getNull();
public static void test() {
System.out.println(<warning descr="Method invocation 'CONST.toString()' may produce 'java.lang.NullPointerException'">CONST.toString()</warning>);
System.out.println(CONST.<warning descr="Method invocation 'toString' may produce 'java.lang.NullPointerException'">toString</warning>());
}
}

View File

@@ -21,7 +21,7 @@ class Doo {
int foo() {
if (<warning descr="Condition 'myB != null' is always 'true'">myB != null</warning> &&
<warning descr="Method invocation 'myA.equals(myB)' may produce 'java.lang.NullPointerException'">myA.equals(myB)</warning>) {
myA.<warning descr="Method invocation 'equals' may produce 'java.lang.NullPointerException'">equals</warning>(myB)) {
return 2;
}

View File

@@ -15,7 +15,7 @@ class Doo {
if (getMethod() == null && !isSomething()) {
return;
} else {
System.out.println(<warning descr="Method invocation 'getMethod().hashCode()' may produce 'java.lang.NullPointerException'">getMethod().hashCode()</warning>);
System.out.println(getMethod().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}
@@ -23,7 +23,7 @@ class Doo {
if (getMethod() == null && !pureSomething()) {
return;
} else {
System.out.println(<warning descr="Method invocation 'getMethod().hashCode()' may produce 'java.lang.NullPointerException'">getMethod().hashCode()</warning>);
System.out.println(getMethod().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -5,7 +5,7 @@ class Goo {
{
Object category = permission.getCategory();
System.out.println(<warning descr="Method invocation 'category.hashCode()' may produce 'java.lang.NullPointerException'">category.hashCode()</warning>);
System.out.println(category.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -15,7 +15,7 @@ class Test {
}
class Local {
void s(@Nullable String s) {
final int i = <warning descr="Method invocation 's.hashCode()' may produce 'java.lang.NullPointerException'">s.hashCode()</warning>;
final int i = s.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
}
}

View File

@@ -14,7 +14,7 @@ class X {
}
void foo3(String d1, String d2) {
if(d1 == null | <warning descr="Method invocation 'd1.compareTo(d2)' may produce 'java.lang.NullPointerException'">d1.compareTo(d2)</warning> > 0)
if(d1 == null | d1.<warning descr="Method invocation 'compareTo' may produce 'java.lang.NullPointerException'">compareTo</warning>(d2) > 0)
System.out.println("impossible");
}
}

View File

@@ -20,7 +20,7 @@ class Foo {
if (data != null) {
return;
}
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
System.out.println(data.hashCode());
}

View File

@@ -20,17 +20,17 @@ class Foo {
if (data != null) {
return;
}
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
System.out.println(data.hashCode());
}
void warnWhenNotCheckedOnce(Foo f) {
System.out.println(<warning descr="Method invocation 'f.data.hashCode()' may produce 'java.lang.NullPointerException'">f.data.hashCode()</warning>);
System.out.println(f.data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
System.out.println(f.data.hashCode());
}
void warnWhenNotCheckedThisOnce() {
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
System.out.println(data.hashCode());
}

View File

@@ -5,7 +5,7 @@ class Foo {
void checkNotNullAndUse(Foo f) {
if (f.data != null) {
System.out.println(<warning descr="Method invocation 'f.data.hashCode()' may produce 'java.lang.NullPointerException'">f.data.hashCode()</warning>);
System.out.println(f.data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}
@@ -13,23 +13,23 @@ class Foo {
if (f.data == null) {
return;
}
System.out.println(<warning descr="Method invocation 'f.data.hashCode()' may produce 'java.lang.NullPointerException'">f.data.hashCode()</warning>);
System.out.println(f.data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void warnWhenWrongCheck() {
if (data != null) {
return;
}
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void warnWhenNotChecked(Foo f) {
System.out.println(<warning descr="Method invocation 'f.data.hashCode()' may produce 'java.lang.NullPointerException'">f.data.hashCode()</warning>);
System.out.println(f.data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void warnWhenNotCheckedThis() {
System.out.println(<warning descr="Method invocation 'data.hashCode()' may produce 'java.lang.NullPointerException'">data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void dontWarnWhenDoubleChecked(Foo f) {
@@ -39,7 +39,7 @@ class Foo {
if (f.data == null) {
return;
}
System.out.println(<warning descr="Method invocation 'f.data.hashCode()' may produce 'java.lang.NullPointerException'">f.data.hashCode()</warning>);
System.out.println(f.data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void dontWarnWhenDoubleChecked_This_Synchronized() {
@@ -51,18 +51,18 @@ class Foo {
return;
}
}
System.out.println(<warning>data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
void dontWarnWhenDoubleChecked_This_WithMethodCall() {
if (data == null) {
return;
}
System.out.println(<warning>data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
if (data == null) {
return;
}
System.out.println(<warning>data.hashCode()</warning>);
System.out.println(data.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -4,6 +4,6 @@ class DDD {
@Nullable
String field;
int test() {
return <warning descr="Method invocation 'new DDD().field.hashCode()' may produce 'java.lang.NullPointerException'">new DDD().field.hashCode()</warning>;
return new DDD().field.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
}

View File

@@ -6,19 +6,19 @@ import java.util.List;
class Foo {
void foo1(List<Integer> list) {
for (@Nullable Integer i : list) {
System.out.println(<warning descr="Method invocation 'i.intValue()' may produce 'java.lang.NullPointerException'">i.intValue()</warning>);
System.out.println(i.<warning descr="Method invocation 'intValue' may produce 'java.lang.NullPointerException'">intValue</warning>());
}
}
void foo2(List<@Nullable Integer> list) {
for (@Nullable Integer i : list) {
System.out.println(<warning descr="Method invocation 'i.intValue()' may produce 'java.lang.NullPointerException'">i.intValue()</warning>);
System.out.println(i.<warning descr="Method invocation 'intValue' may produce 'java.lang.NullPointerException'">intValue</warning>());
}
}
void foo3() {
List<@Nullable String> list = new ArrayList<>();
list.add(null);
for (String s : list) {
System.out.println(<warning descr="Method invocation 's.length()' may produce 'java.lang.NullPointerException'">s.length()</warning>);
System.out.println(s.<warning descr="Method invocation 'length' may produce 'java.lang.NullPointerException'">length</warning>());
}
}

View File

@@ -4,15 +4,15 @@ class Test {
Object o;
void field() {
<warning descr="Method invocation 'o.hashCode()' may produce 'java.lang.NullPointerException'">o.hashCode()</warning>;
o.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
void parameter(Object o) {
<warning descr="Method invocation 'o.hashCode()' may produce 'java.lang.NullPointerException'">o.hashCode()</warning>;
o.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
void callUnknownMethod() {
<warning descr="Method invocation 'unknownObject().hashCode()' may produce 'java.lang.NullPointerException'">unknownObject().hashCode()</warning>;
unknownObject().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
void callNotNullMethod() {

View File

@@ -26,7 +26,7 @@ class Impl1 extends SomeSuper {
@Override
public void run() {
if (Impl1.this.o2 != null) {
System.out.println(<warning descr="Method invocation 'Impl2.this.o2.hashCode()' may produce 'java.lang.NullPointerException'">Impl2.this.o2.hashCode()</warning>);
System.out.println(Impl2.this.o2.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}
};

View File

@@ -20,7 +20,7 @@ class Test {
public void testDontReplaceQualifierWithNull(Object bar) {
if (bar == null) {
<warning descr="Method invocation 'bar.hashCode()' may produce 'java.lang.NullPointerException'">bar.hashCode()</warning>;
bar.<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>();
}
}

View File

@@ -9,7 +9,7 @@ class Test {
void m1() throws Exception {
MyResourceProvider provider = null;
try (MyResource r = <warning descr="Method invocation 'provider.getResource()' may produce 'java.lang.NullPointerException'">provider.getResource()</warning>) {
try (MyResource r = provider.<warning descr="Method invocation 'getResource' may produce 'java.lang.NullPointerException'">getResource</warning>()) {
System.out.println(r);
}
}

View File

@@ -9,6 +9,6 @@ class Doo {
public void main(String[] args) {
Object method = getMethod();
System.out.println(<warning descr="Method invocation 'getMethod().hashCode()' may produce 'java.lang.NullPointerException'">getMethod().hashCode()</warning>);
System.out.println(getMethod().<warning descr="Method invocation 'hashCode' may produce 'java.lang.NullPointerException'">hashCode</warning>());
}
}

View File

@@ -8,7 +8,7 @@ class Some {
while (parent != null) {
parent = parent.getParentFile();
}
System.out.println(<warning descr="Method invocation 'parent.getName()' may produce 'java.lang.NullPointerException'">parent.getName()</warning>);
System.out.println(parent.<warning descr="Method invocation 'getName' may produce 'java.lang.NullPointerException'">getName</warning>());
}
System.out.println(file.getName());
}

View File

@@ -4,7 +4,7 @@ class Test {
public void foo() {
if (x != null) {
System.out.println(<warning descr="Method invocation 'x.substring(1)' may produce 'java.lang.NullPointerException'">x.sub<caret>string(1)</warning>);
System.out.println(x.<warning descr="Method invocation 'substring' may produce 'java.lang.NullPointerException'">subs<caret>tring</warning>(1));
}
}
}

View File

@@ -3,7 +3,7 @@
<problem>
<file>Npe.java</file>
<line>7</line>
<description>Method invocation 'o.equals()' produce NullPointerException</description>
<description>Method invocation 'equals' produce NullPointerException</description>
</problem>
</problems>

View File

@@ -3,7 +3,7 @@
<problem>
<file>Test.java</file>
<line>6</line>
<description>'s.equals(s)' may produce NullPointerException</description>
<description>'equals' may produce NullPointerException</description>
</problem>
</problems>