diff --git a/java/java-tests/testData/psi/autodetect/bigFileWithOnlyErrorElements_DoNotProduceSOE.java b/java/java-tests/testData/psi/autodetect/bigFileWithOnlyErrorElements_DoNotProduceSOE.java new file mode 100644 index 000000000000..6dbafa673282 Binary files /dev/null and b/java/java-tests/testData/psi/autodetect/bigFileWithOnlyErrorElements_DoNotProduceSOE.java differ diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIteratorTest.java b/java/java-tests/testSrc/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIteratorTest.java index 2e3269ff02b9..38225ac553f5 100644 --- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIteratorTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/autodetect/NewLineBlocksIteratorTest.java @@ -16,8 +16,11 @@ package com.intellij.psi.codeStyle.autodetect; import com.intellij.JavaTestUtil; +import com.intellij.formatting.Block; import org.jetbrains.annotations.NotNull; +import java.util.Iterator; + public class NewLineBlocksIteratorTest extends AbstractNewLineBlocksIteratorTest { @NotNull @@ -46,5 +49,13 @@ public class NewLineBlocksIteratorTest extends AbstractNewLineBlocksIteratorTest checkNewLineBlocksStartOffsets(newLineBlocksStartOffsets); } + + public void testBigFileWithOnlyErrorElements_DoNotProduceSOE() { + configureByFile(getFileName() + ".java"); + Iterator iterator = createNewLineBlocksIterator(); + while (iterator.hasNext()) { + iterator.next(); + } + } } diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java b/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java index 5a170dfa0c0c..b42a109efb0f 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/common/NewLineBlocksIterator.java @@ -71,19 +71,18 @@ public class NewLineBlocksIterator implements Iterator { } private void popUntilTopBlockStartOffsetGreaterOrEqual(final int lineStartOffset) { - if (myStack.isEmpty()) return; - - Block current = myStack.peek(); - TextRange range = current.getTextRange(); - int currentStartOffset = range.getStartOffset(); - int currentEndOffset = range.getEndOffset(); - - if (currentStartOffset < lineStartOffset) { - myStack.pop(); - if (currentEndOffset > lineStartOffset) { - pushAll(current); + while (!myStack.isEmpty()) { + Block current = myStack.peek(); + TextRange range = current.getTextRange(); + if (range.getStartOffset() < lineStartOffset) { + myStack.pop(); + if (range.getEndOffset() > lineStartOffset) { + pushAll(current); + } + } + else { + break; } - popUntilTopBlockStartOffsetGreaterOrEqual(lineStartOffset); } }