mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
FIXED IDEA-195340 bad JSON kills IntelliJ
Break iteration beyond a theoretical max right margin
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user