PY-20553: Store checked elements to prevent loop

* Loop "someElement -> getReference -> resolve -> someElement" is broken
This commit is contained in:
Ilya.Kazakevich
2016-08-26 18:43:28 +03:00
parent 274b3f4313
commit edeb96c21d
2 changed files with 21 additions and 3 deletions
@@ -61,7 +61,8 @@ import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.*;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.*;
import com.intellij.util.containers.HashSet;
import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
@@ -609,16 +610,18 @@ public class PyUtil {
@NotNull
public static PsiElement resolveToTheTop(@NotNull final PsiElement elementToResolve) {
PsiElement currentElement = elementToResolve;
final Set<PsiElement> checkedElements = new HashSet<>(); // To prevent PY-20553
while (true) {
final PsiReference reference = currentElement.getReference();
if (reference == null) {
break;
}
final PsiElement resolve = reference.resolve();
if ((resolve == null) || resolve.equals(currentElement) || !inSameFile(resolve, currentElement)) {
if ((resolve == null) || checkedElements.contains(resolve) || resolve.equals(currentElement) || !inSameFile(resolve, currentElement)) {
break;
}
currentElement = resolve;
checkedElements.add(resolve);
}
return currentElement;
}
@@ -96,4 +96,19 @@ def contains_even_number(l):
print elt
else:
for elt in range(10):
pass
pass
def write_data():
lines = ''
line = ''
while True:
next_char = 'a'
line += next_char
if 100 > 999:
line = ''
last_ok = ''
if len(lines) <= 2:
for line in lines:
next_char += 'b'