FIXED IDEA-195340 bad JSON kills IntelliJ

Break iteration beyond a theoretical max right margin
This commit is contained in:
Rustam Vishnyakov
2018-09-27 19:06:26 +03:00
parent 6ada2b00c0
commit ed7b2fb9a8
5 changed files with 1983 additions and 10 deletions
@@ -96,9 +96,9 @@ public class JsonFormattingTest extends JsonTestCase {
public void testIndentForElements() { doTest();}
public void testNoExtraNewLineByWrap() { doTest();}
public void _testHugeJsonFile() {
public void testHugeJsonFile() {
// IDEA-195340 bad JSON kills IntelliJ
PlatformTestUtil.startPerformanceTest(getTestName(false), 10000, this::doTest).attempts(1).usesAllCPUCores().assertTiming();
PlatformTestUtil.startPerformanceTest(getTestName(false), 20000, this::doTest).attempts(1).usesAllCPUCores().assertTiming();
}
private void doTest() {
File diff suppressed because it is too large Load Diff
@@ -96,7 +96,7 @@ public class DependantSpacingImpl extends SpacingImpl {
boolean atLeastOneDependencyRangeContainsLf = false;
for (TextRange dependency : myDependentRegionRanges) {
atLeastOneDependencyRangeContainsLf |= helper.containsLineFeeds(dependency);
atLeastOneDependencyRangeContainsLf |= helper.containsLineFeedsOrTooLong(dependency);
}
if (atLeastOneDependencyRangeContainsLf) myFlags |= DEPENDENCE_CONTAINS_LF_MASK;
@@ -17,6 +17,7 @@ package com.intellij.formatting.engine;
import com.intellij.formatting.LeafBlockWrapper;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.codeStyle.CodeStyleConstraints;
import gnu.trove.TIntObjectHashMap;
import org.jetbrains.annotations.Nullable;
@@ -39,16 +40,19 @@ public class BlockRangesMap {
return result;
}
public boolean containsLineFeeds(final TextRange dependency) {
public boolean containsLineFeedsOrTooLong(final TextRange dependency) {
LeafBlockWrapper child = myTextRangeToWrapper.get(dependency.getStartOffset());
if (child == null) return false;
if (child.containsLineFeeds()) return true;
final int endOffset = dependency.getEndOffset();
while (child.getEndOffset() < endOffset) {
final int startOffset = child.getStartOffset();
while (child != null && child.getEndOffset() < endOffset) {
if (child.containsLineFeeds() || (child.getStartOffset() - startOffset) > CodeStyleConstraints.MAX_RIGHT_MARGIN) return true;
child = child.getNextBlock();
if (child == null) return false;
if (child.getWhiteSpace().containsLineFeeds()) return true;
if (child.containsLineFeeds()) return true;
if (child != null &&
child.getWhiteSpace().getEndOffset() <= endOffset &&
child.getWhiteSpace().containsLineFeeds()) {
return true;
}
}
return false;
}
@@ -82,7 +82,7 @@ public class DependentSpacingEngine {
}
final boolean containedLineFeeds = spacing.getMinLineFeeds() > 0;
final boolean containsLineFeeds = myBlockRangesMap.containsLineFeeds(textRange);
final boolean containsLineFeeds = myBlockRangesMap.containsLineFeedsOrTooLong(textRange);
if (containedLineFeeds != containsLineFeeds) {
spacing.setDependentRegionLinefeedStatusChanged();