diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java
index b1458e6434f7..93380dba8fbe 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java
@@ -150,7 +150,11 @@ public class AutoHardWrapHandler {
new VisualPosition(caretModel.getVisualPosition().line, margin - FormatConstants.RESERVED_LINE_WRAP_WIDTH_IN_COLUMNS)
));
- int wrapOffset = strategy.calculateWrapPosition(document.getCharsSequence(), startOffset, endOffset, maxPreferredOffset, true);
+ int wrapOffset = strategy.calculateWrapPosition(document, startOffset, endOffset, maxPreferredOffset, true);
+ if (wrapOffset < 0) {
+ return;
+ }
+
WhiteSpaceFormattingStrategy formattingStrategy = WhiteSpaceFormattingStrategyFactory.getStrategy(editor);
if (wrapOffset <= startOffset || wrapOffset > maxPreferredOffset
|| formattingStrategy.check(document.getCharsSequence(), startOffset, wrapOffset) >= wrapOffset)
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java
index b765cb3f1a90..3281830d930d 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java
@@ -370,8 +370,11 @@ public class CodeFormatterFacade {
// We know that current line exceeds right margin if control flow reaches this place, so, wrap it.
int wrapOffset = strategy.calculateWrapPosition(
- text, Math.max(startLineOffset, startOffsetToUse), Math.min(endLineOffset, endOffsetToUse), preferredWrapPosition, false
+ document, Math.max(startLineOffset, startOffsetToUse), Math.min(endLineOffset, endOffsetToUse), preferredWrapPosition, false
);
+ if (wrapOffset < 0) {
+ continue;
+ }
editor.getCaretModel().moveToOffset(wrapOffset);
final DataContext dataContext = DataManager.getInstance().getDataContext(editor.getComponent());
diff --git a/platform/platform-api/platform-api.iml b/platform/platform-api/platform-api.iml
index b48b010793c7..8dde337c2b2d 100644
--- a/platform/platform-api/platform-api.iml
+++ b/platform/platform-api/platform-api.iml
@@ -28,6 +28,7 @@
+
diff --git a/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java b/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java
index 49a11039ef65..e2151c99d906 100644
--- a/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java
+++ b/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java
@@ -41,7 +41,7 @@ public class GenericLineWrapPositionStrategy implements LineWrapPositionStrategy
private final Storage myOffset2weight = new Storage();
@Override
- public int calculateWrapPosition(@NotNull CharSequence text,
+ public int calculateWrapPosition(@NotNull Document document,
int startOffset,
int endOffset,
int maxPreferredOffset,
@@ -53,6 +53,7 @@ public class GenericLineWrapPositionStrategy implements LineWrapPositionStrategy
myOffset2weight.clear();
myOffset2weight.anchor = startOffset;
+ CharSequence text = document.getCharsSequence();
// Normalization.
int maxPreferredOffsetToUse = maxPreferredOffset >= endOffset ? endOffset - 1 : maxPreferredOffset;
diff --git a/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java b/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java
index 78d56a2b071c..5463c323c295 100644
--- a/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java
+++ b/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java
@@ -32,7 +32,7 @@ public interface LineWrapPositionStrategy {
/**
* Allows to calculate the most appropriate position to wrap target line.
*
- * @param text target text holder
+ * @param document target document which text is being processed
* @param startOffset start offset to use with the given text holder (inclusive)
* @param endOffset end offset to use with the given text holder (exclusive)
* @param maxPreferredOffset this method is expected to do its best to return offset that belongs to
@@ -43,9 +43,10 @@ public interface LineWrapPositionStrategy {
* (maxPreferredOffset; endOffset] interval in case of inability to
* find appropriate offset from (startOffset; maxPreferredOffset] interval
* @return offset from (startOffset; endOffset] interval where
- * target line should be wrapped
+ * target line should be wrapped OR -1 if no wrapping should be performed
*/
int calculateWrapPosition(
- @NotNull CharSequence text, int startOffset, int endOffset, int maxPreferredOffset, boolean allowToBeyondMaxPreferredOffset
+ @NotNull Document document, int startOffset, int endOffset, int maxPreferredOffset,
+ boolean allowToBeyondMaxPreferredOffset
);
}
diff --git a/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java b/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java
index ef976fcabb96..756a3521cc0d 100644
--- a/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java
+++ b/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java
@@ -15,6 +15,11 @@
*/
package com.intellij.openapi.editor;
+import org.jetbrains.annotations.NotNull;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.Before;
import org.junit.Test;
@@ -29,11 +34,16 @@ public class DefaultLineWrapPositionStrategyTest {
private static final String EDGE_MARKER = "";
private static final String WRAP_MARKER = "";
+ private Mockery myMockery;
private DefaultLineWrapPositionStrategy myStrategy;
@Before
public void setUp() {
myStrategy = new DefaultLineWrapPositionStrategy();
+
+ myMockery = new JUnit4Mockery() {{
+ setImposteriser(ClassImposteriser.INSTANCE);
+ }};
}
@Test
@@ -65,11 +75,19 @@ public class DefaultLineWrapPositionStrategyTest {
final Context context = new Context(document);
context.init();
int actual = myStrategy.calculateWrapPosition(
- context.document, 0, context.document.length(), context.edgeIndex, allowToBeyondMaxPreferredOffset
+ createMockDocument(context.document), 0, context.document.length(), context.edgeIndex, allowToBeyondMaxPreferredOffset
);
assertSame(context.wrapIndex, actual);
}
+ private Document createMockDocument(@NotNull final String text) {
+ final Document result = myMockery.mock(Document.class);
+ myMockery.checking(new Expectations() {{
+ allowing(result).getCharsSequence(); will(returnValue(text));
+ }});
+ return result;
+ }
+
/**
* Utility class for parsing and initialising test data.
*
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java
index 168866225cb3..a07e84c797a8 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java
@@ -517,12 +517,10 @@ public class SoftWrapApplianceManager implements FoldingListener, DocumentListen
myLineWrapPositionStrategy = LanguageLineWrapPositionStrategy.INSTANCE.forEditor(myEditor);
}
- softWrapOffset = myLineWrapPositionStrategy.calculateWrapPosition(
- document.getCharsSequence(), minOffset, maxOffset, preferredOffset, true
- );
+ softWrapOffset = myLineWrapPositionStrategy.calculateWrapPosition(document, minOffset, maxOffset, preferredOffset, true);
}
- if (softWrapOffset >= lineData.endLineOffset) {
+ if (softWrapOffset >= lineData.endLineOffset || softWrapOffset < 0) {
return null;
}