StreamToLoop: disable in this()/super() constructor invocation as we cannot generate statements before this/super call.

This commit is contained in:
Tagir Valeev
2016-12-12 19:12:02 +07:00
parent 787de0aeda
commit f25764d72f
4 changed files with 65 additions and 0 deletions
@@ -119,6 +119,12 @@ public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool {
if(parent instanceof PsiConditionalExpression && ((PsiConditionalExpression)parent).getCondition() != cur) {
return false;
}
if(parent instanceof PsiMethodCallExpression) {
PsiReferenceExpression methodExpression = ((PsiMethodCallExpression)parent).getMethodExpression();
if(methodExpression.textMatches("this") || methodExpression.textMatches("super")) {
return false;
}
}
cur = parent;
parent = cur.getParent();
}
@@ -0,0 +1,26 @@
// "Replace Stream API chain with loop" "true"
import java.util.Arrays;
import java.util.stream.Stream;
import java.util.Objects;
public class Main {
Main(boolean b) {}
void test(boolean b) {}
static class Child extends Main {
// cannot replace as replacement would generate a statement before "super" call
Child() {
super(false);
boolean found = false;
for (String s : Arrays.asList("a", "b", "c")) {
if (Objects.nonNull(s)) {
found = true;
break;
}
}
super.test(found);
}
}
}
@@ -0,0 +1,15 @@
// "Replace Stream API chain with loop" "false"
import java.util.stream.Stream;
import java.util.Objects;
public class Main {
Main(boolean b) {}
static class Child extends Main {
// cannot replace as replacement would generate a statement before "super" call
Child() {
super(Stream.of("a", "b", "c").an<caret>yMatch(Objects::nonNull));
}
}
}
@@ -0,0 +1,18 @@
// "Replace Stream API chain with loop" "true"
import java.util.stream.Stream;
import java.util.Objects;
public class Main {
Main(boolean b) {}
void test(boolean b) {}
static class Child extends Main {
// cannot replace as replacement would generate a statement before "super" call
Child() {
super(false);
super.test(Stream.of("a", "b", "c").an<caret>yMatch(Objects::nonNull));
}
}
}