IDEA-131342 Commenting XML line containing just - produces invalid XML

This commit is contained in:
Dmitry Avdeev
2014-10-21 12:42:22 +04:00
parent 64bca16158
commit 2f327d83d2
4 changed files with 18 additions and 9 deletions
@@ -532,12 +532,11 @@ public class CommentByBlockCommentHandler extends MultiCaretCodeInsightActionHan
static TextRange processDocument(Document document, RangeMarker marker, Commenter commenter, boolean escape) {
if (commenter instanceof EscapingCommenter) {
TextRange range = TextRange.create(marker.getStartOffset(), marker.getEndOffset());
if (escape) {
((EscapingCommenter)commenter).escape(document, range);
((EscapingCommenter)commenter).escape(document, marker);
}
else {
((EscapingCommenter)commenter).unescape(document, range);
((EscapingCommenter)commenter).unescape(document, marker);
}
}
return TextRange.create(marker.getStartOffset(), marker.getEndOffset());
@@ -600,6 +600,8 @@ public class CommentByLineCommentHandler extends MultiCaretCodeInsightActionHand
String prefix = commenter.getLineCommentPrefix();
int endOffset = document.getLineEndOffset(line);
RangeMarker marker = document.createRangeMarker(offset, endOffset);
marker.setGreedyToLeft(true);
marker.setGreedyToRight(true);
if (prefix != null) {
if (commenter instanceof CommenterWithLineSuffix) {
endOffset = CharArrayUtil.shiftBackward(document.getCharsSequence(), endOffset, " \t");
@@ -17,14 +17,14 @@ package com.intellij.codeInsight.generation;
import com.intellij.lang.Commenter;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.editor.RangeMarker;
/**
* @author Dmitry Avdeev
*/
public interface EscapingCommenter extends Commenter {
void escape(Document document, TextRange range);
void escape(Document document, RangeMarker range);
void unescape(Document document, TextRange range);
void unescape(Document document, RangeMarker range);
}
@@ -17,7 +17,7 @@ package com.intellij.lang.xml;
import com.intellij.codeInsight.generation.EscapingCommenter;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
@@ -59,7 +59,7 @@ public class XmlCommenter implements EscapingCommenter {
}
@Override
public void escape(Document document, TextRange range) {
public void escape(Document document, RangeMarker range) {
String prefix = getBlockCommentPrefix();
String suffix = getBlockCommentSuffix();
@@ -71,6 +71,8 @@ public class XmlCommenter implements EscapingCommenter {
if (CharArrayUtil.regionMatches(document.getCharsSequence(), end - suffix.length(), suffix)) {
end -= suffix.length();
}
if (start >= end) return;
for (int i = end - DOUBLE_DASH.length(); i >= start; i--) {
if (CharArrayUtil.regionMatches(document.getCharsSequence(), i, DOUBLE_DASH) &&
!CharArrayUtil.regionMatches(document.getCharsSequence(), i, suffix) &&
@@ -81,10 +83,16 @@ public class XmlCommenter implements EscapingCommenter {
if (CharArrayUtil.regionMatches(document.getCharsSequence(), start, GT)) {
document.replaceString(start, start + GT.length(), ESCAPED_GT);
}
if (CharArrayUtil.regionMatches(document.getCharsSequence(), range.getStartOffset(), prefix + "-")) {
document.insertString(start, " ");
}
if (CharArrayUtil.regionMatches(document.getCharsSequence(), range.getEndOffset() - suffix.length() - 1, "-" + suffix)) {
document.insertString(range.getEndOffset() - suffix.length(), " ");
}
}
@Override
public void unescape(Document document, TextRange range) {
public void unescape(Document document, RangeMarker range) {
final int start = range.getStartOffset();
for (int i = range.getEndOffset(); i >= start; i--) {
if (CharArrayUtil.regionMatches(document.getCharsSequence(), i, ESCAPED_DOUBLE_DASH)) {