diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java index 14d60b6df926..c3f468c34dc4 100644 --- a/python/src/com/jetbrains/python/psi/PyUtil.java +++ b/python/src/com/jetbrains/python/psi/PyUtil.java @@ -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 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; } diff --git a/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py index 2e52d144c8a7..9dfcdbc0166e 100644 --- a/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py +++ b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py @@ -96,4 +96,19 @@ def contains_even_number(l): print elt else: for elt in range(10): - pass \ No newline at end of file + 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' \ No newline at end of file