IDEA-141982 SOE, recursion eliminated

This commit is contained in:
Yaroslav Lepenkin
2015-06-29 16:43:00 +03:00
parent 0d99c10b7e
commit eea25059d8
3 changed files with 22 additions and 12 deletions
@@ -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<Block> iterator = createNewLineBlocksIterator();
while (iterator.hasNext()) {
iterator.next();
}
}
}
@@ -71,19 +71,18 @@ public class NewLineBlocksIterator implements Iterator<Block> {
}
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);
}
}