diff --git a/platform/core-api/src/com/intellij/openapi/editor/Document.java b/platform/core-api/src/com/intellij/openapi/editor/Document.java index 58ac12ffe7c1..2a98b7a494b0 100644 --- a/platform/core-api/src/com/intellij/openapi/editor/Document.java +++ b/platform/core-api/src/com/intellij/openapi/editor/Document.java @@ -141,6 +141,13 @@ public interface Document extends UserDataHolder { @Contract(pure=true) int getLineEndOffset(int line); + /** + * @return whether the line with the given index has been modified since the document has been saved + */ + default boolean isLineModified(int line) { + return false; + } + /** * Inserts the specified text at the specified offset in the document. Line breaks in * the inserted text must be normalized as \n. diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java index cea90c8c809b..3042ff9c82b8 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java @@ -180,6 +180,12 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx { return stripTrailingSpaces(project, inChangedLinesOnly, true, new int[0]); } + @Override + public boolean isLineModified(int line) { + LineSet lineSet = myLineSet; + return lineSet != null && lineSet.isModified(line); + } + /** * @return true if stripping was completed successfully, false if the document prevented stripping by e.g. caret(s) being in the way */ diff --git a/platform/lang-impl/src/com/intellij/injected/editor/DocumentWindowImpl.java b/platform/lang-impl/src/com/intellij/injected/editor/DocumentWindowImpl.java index 89a470a01fad..ca742ee61114 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/DocumentWindowImpl.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/DocumentWindowImpl.java @@ -518,6 +518,11 @@ public class DocumentWindowImpl extends UserDataHolderBase implements Disposable } } + @Override + public boolean isLineModified(int line) { + return myDelegate.isLineModified(injectedToHostLine(line)); + } + @Override @NotNull public Segment[] getHostRanges() {