mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-71808 (incorrect reporting of ListIterator 'while' loop replaceable with 'for each')
This commit is contained in:
+16
-13
@@ -134,7 +134,7 @@ public class WhileCanBeForeachInspection extends BaseInspection {
|
||||
isIteratorNextDeclaration(firstStatement, iterator,
|
||||
contentType);
|
||||
final PsiStatement statementToSkip;
|
||||
String contentVariableName;
|
||||
@NonNls String contentVariableName;
|
||||
if (isDeclaration) {
|
||||
final PsiDeclarationStatement declarationStatement =
|
||||
(PsiDeclarationStatement)firstStatement;
|
||||
@@ -548,10 +548,10 @@ public class WhileCanBeForeachInspection extends BaseInspection {
|
||||
|
||||
private static boolean isIteratorRemoveCalled(PsiVariable iterator,
|
||||
PsiElement context) {
|
||||
final IteratorRemoveVisitor visitor =
|
||||
new IteratorRemoveVisitor(iterator);
|
||||
final IteratorMethodCallVisitor visitor =
|
||||
new IteratorMethodCallVisitor(iterator);
|
||||
context.accept(visitor);
|
||||
return visitor.isRemoveCalled();
|
||||
return visitor.isMethodCalled();
|
||||
}
|
||||
|
||||
private static boolean isIteratorHasNextCalled(PsiVariable iterator,
|
||||
@@ -613,29 +613,32 @@ public class WhileCanBeForeachInspection extends BaseInspection {
|
||||
}
|
||||
}
|
||||
|
||||
private static class IteratorRemoveVisitor
|
||||
private static class IteratorMethodCallVisitor
|
||||
extends JavaRecursiveElementVisitor {
|
||||
|
||||
private boolean removeCalled = false;
|
||||
private boolean methodCalled = false;
|
||||
private final PsiVariable iterator;
|
||||
|
||||
private IteratorRemoveVisitor(@NotNull PsiVariable iterator) {
|
||||
IteratorMethodCallVisitor(PsiVariable iterator) {
|
||||
this.iterator = iterator;
|
||||
}
|
||||
|
||||
@Override public void visitElement(@NotNull PsiElement element) {
|
||||
if (!removeCalled) {
|
||||
if (!methodCalled) {
|
||||
super.visitElement(element);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void visitMethodCallExpression(
|
||||
@NotNull PsiMethodCallExpression expression) {
|
||||
if (methodCalled) {
|
||||
return;
|
||||
}
|
||||
super.visitMethodCallExpression(expression);
|
||||
final PsiReferenceExpression methodExpression =
|
||||
expression.getMethodExpression();
|
||||
@NonNls final String name = methodExpression.getReferenceName();
|
||||
if (!HardcodedMethodConstants.REMOVE.equals(name)) {
|
||||
final String name = methodExpression.getReferenceName();
|
||||
if (HardcodedMethodConstants.NEXT.equals(name)) {
|
||||
return;
|
||||
}
|
||||
final PsiExpression qualifier =
|
||||
@@ -647,12 +650,12 @@ public class WhileCanBeForeachInspection extends BaseInspection {
|
||||
(PsiReferenceExpression)qualifier;
|
||||
final PsiElement target = referenceExpression.resolve();
|
||||
if (iterator.equals(target)) {
|
||||
removeCalled = true;
|
||||
methodCalled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isRemoveCalled() {
|
||||
return removeCalled;
|
||||
public boolean isMethodCalled() {
|
||||
return methodCalled;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+13
@@ -77,4 +77,17 @@ public class WhileCanBeForeachInspection {
|
||||
return total;
|
||||
}
|
||||
|
||||
void foo(List<String> list, String newCd) {
|
||||
final ListIterator<String> iter = list.listIterator();
|
||||
while( iter.hasNext() )
|
||||
{
|
||||
final String cd = iter.next();
|
||||
if( cd.getBytes().equals( newCd.getBytes() ) )
|
||||
{
|
||||
iter.add( newCd );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user