Java: Detect trivial duplicates containing 'break' and 'continue' (IDEA-182195)

This commit is contained in:
Pavel Dolgov
2017-11-16 13:15:36 +03:00
parent 8bedc1a4e0
commit c6c42b1a32
6 changed files with 131 additions and 1 deletions
@@ -267,6 +267,9 @@ public class DuplicatesFinder {
if (returnValue == null) {
returnValue = myReturnValue;
}
if (returnValue instanceof GotoReturnValue) {
return false;
}
if (returnValue instanceof VariableReturnValue) {
final ReturnValue value = match.getOutputVariableValue(((VariableReturnValue)returnValue).getVariable());
if (value != null) {
@@ -284,7 +287,7 @@ public class DuplicatesFinder {
return true;
}
}
catch (AnalysisCanceledException e) {
catch (AnalysisCanceledException ignored) {
}
return false;
}
@@ -0,0 +1,20 @@
public class InferredNotNullInReturnStatementDuplicate {
void foo(java.util.List l) {
for (Object o : l) {
<selection>
if (o == null) continue;
Object x = bar(o);</selection>
System.out.println(x);
}
}
void bar(java.util.List l) {
for (Object o : l) {
if (o == null) continue;
Object x = bar(o);
System.out.println(x);
}
}
private String bar(Object o) {return "";}
}
@@ -0,0 +1,29 @@
import org.jetbrains.annotations.Nullable;
public class InferredNotNullInReturnStatementDuplicate {
void foo(java.util.List l) {
for (Object o : l) {
Object x = newMethod(o);
if (x == null) continue;
System.out.println(x);
}
}
@Nullable
private Object newMethod(Object o) {
if (o == null) return null;
Object x = bar(o);
return x;
}
void bar(java.util.List l) {
for (Object o : l) {
Object x = newMethod(o);
if (x == null) continue;
System.out.println(x);
}
}
private String bar(Object o) {return "";}
}
@@ -0,0 +1,31 @@
import java.util.List;
public class NullableCheckBreakDuplicate {
List<Pojo> things;
void foo() {
while (true) {
<selection>
Pojo x = things.get(0);
if (x.it > 0) break;
things.remove(x);</selection>
System.out.println(x.it);
}
}
void baz() {
while (true) {
Pojo x = things.get(0);
if (x.it > 0) break;
things.remove(x);
System.out.println(x.it);
}
}
static class Pojo {
double it;
Pojo(double w) { it = w; }
}
}
@@ -0,0 +1,38 @@
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class NullableCheckBreakDuplicate {
List<Pojo> things;
void foo() {
while (true) {
Pojo x = newMethod();
if (x == null) break;
System.out.println(x.it);
}
}
@Nullable
private Pojo newMethod() {
Pojo x = things.get(0);
if (x.it > 0) return null;
things.remove(x);
return x;
}
void baz() {
while (true) {
Pojo x = newMethod();
if (x == null) break;
System.out.println(x.it);
}
}
static class Pojo {
double it;
Pojo(double w) { it = w; }
}
}
@@ -1161,6 +1161,15 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
doTest();
}
public void testInferredNotNullInReturnStatementDuplicate() throws Exception {
doDuplicatesTest();
}
public void testNullableCheckBreakDuplicate() throws Exception {
doDuplicatesTest();
}
private void doTestDisabledParam() throws PrepareFailedException {
final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
settings.ELSE_ON_NEW_LINE = true;