Skip to content

Commit

Permalink
Fix unexpected behavior of xml.format.preservedNewlines with experime…
Browse files Browse the repository at this point in the history
…ntal formatter

Signed-off-by: Jessica He <[email protected]>
  • Loading branch information
JessicaJHee committed Oct 21, 2022
1 parent 0e41326 commit 0df183a
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,11 @@ public void formatComment(DOMComment commentNode, XMLFormattingConstraints paren
if (currentNewLineCount > preservedNewLines && startRange < start) {
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, 0, start,
preservedNewLines + 1, edits);
availableLineWidth = getMaxLineWidth() - getTabSize();
availableLineWidth = getMaxLineWidth() - getTabSize() * indentLevel;
} else if (addLineSeparator && startRange < start) {
replaceLeftSpacesWithIndentation(indentLevel, leftWhitespaceOffset, start,
addLineSeparator, edits);
int newLineCount = currentNewLineCount == 0 && !addLineSeparator ? 1 : currentNewLineCount;
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, 0, start,
newLineCount, edits);
availableLineWidth = getMaxLineWidth() - getTabSize() * indentLevel;
}
int spaceStart = -1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public void formatDocType(DOMDocumentType docType, XMLFormattingConstraints pare
if (isDTD) {
formatDTD(docType, parentConstraints, start, end, edits);
} else {
replaceLeftSpacesWithIndentation(parentConstraints.getIndentLevel(), docType.getParentNode().getStart(), docType.getStart(), true, edits);
replaceLeftSpacesWithIndentation(parentConstraints.getIndentLevel(), docType.getParentNode().getStart(),
docType.getStart(), true, edits);
List<DTDDeclParameter> parameters = docType.getParameters();
if (!parameters.isEmpty()) {
for (DTDDeclParameter parameter : parameters) {
Expand Down Expand Up @@ -89,7 +90,7 @@ public void formatDocType(DOMDocumentType docType, XMLFormattingConstraints pare
// Remove space between end brackets
// Exmaple Before: <!DOCTYPE person [...
// <!ENTITY AUTHOR \"John Doe\">]|>
removeLeftSpaces(internalSubset.getEnd(), docType.getEnd()-1, edits);
removeLeftSpaces(internalSubset.getEnd(), docType.getEnd() - 1, edits);
}
}

Expand Down Expand Up @@ -129,15 +130,27 @@ private void formatDTDNodeDecl(DTDDeclNode nodeDecl, XMLFormattingConstraints pa
// 1) indent the DTD element, entity, notation declaration
// before formatting : [space][space]<!ELEMENT>
// after formatting : <!ELEMENT>
replaceLeftSpacesWithIndentation(parentConstraints.getIndentLevel(), nodeDecl.getParentNode().getStart(),
nodeDecl.getStart(), addLineSeparator, edits);
int parentNodeStart = nodeDecl.getParentNode().getStart();
int nodeDeclStart = nodeDecl.getStart();
int indentLevel = parentConstraints.getIndentLevel();
int preservedNewLines = getPreservedNewlines();
int currentNewLineCount = XMLFormatterDocumentNew.getExistingNewLineCount(formatterDocument.getText(),
nodeDeclStart, formatterDocument.getLineDelimiter());
if (currentNewLineCount > preservedNewLines) {
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, parentNodeStart,
nodeDeclStart, preservedNewLines + 1, edits);
} else {
int newLineCount = currentNewLineCount == 0 ? 1 : currentNewLineCount;
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, parentNodeStart, nodeDeclStart,
newLineCount, edits);
}

// 2 separate each parameters with one space
// before formatting : <!ELEMENT[space][space]note>
// after formatting : <!ELEMENT[space]note>
DTDAttlistDecl attlist = nodeDecl.isDTDAttListDecl() ? (DTDAttlistDecl) nodeDecl : null;
if (attlist != null) {
int indentLevel = nodeDecl.getOwnerDocument().isDTD() ? 1 : 2;
indentLevel = nodeDecl.getOwnerDocument().isDTD() ? 1 : 2;
List<DTDAttlistDecl> internalDecls = attlist.getInternalChildren();
if (internalDecls == null) {
int previousOffset = attlist.getStart();
Expand Down Expand Up @@ -192,7 +205,7 @@ private void formatDTDNodeDecl(DTDDeclNode nodeDecl, XMLFormattingConstraints pa
} else {
List<DTDDeclParameter> parameters = nodeDecl.getParameters();
if (!parameters.isEmpty()) {
int previousOffset = nodeDecl.getStart();
int previousOffset = nodeDeclStart;
for (DTDDeclParameter parameter : parameters) {
// Normalize space at the start of parameter to a single space for non-ATTLIST,
// for example:
Expand Down Expand Up @@ -220,6 +233,12 @@ private int replaceLeftSpacesWithIndentation(int indentLevel, int from, int to,
return formatterDocument.replaceLeftSpacesWithIndentation(indentLevel, from, to, addLineSeparator, edits);
}

private int replaceLeftSpacesWithIndentationWithMultiNewLines(int indentLevel, int from, int to, int newLineCount,
List<TextEdit> edits) {
return formatterDocument.replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, from, to, newLineCount,
edits);
}

private void removeLeftSpaces(int from, int to, List<TextEdit> edits) {
formatterDocument.removeLeftSpaces(from, to, edits);
}
Expand All @@ -228,6 +247,10 @@ private EnforceQuoteStyle getEnforceQuoteStyle() {
return formatterDocument.getSharedSettings().getFormattingSettings().getEnforceQuoteStyle();
}

private int getPreservedNewlines() {
return formatterDocument.getSharedSettings().getFormattingSettings().getPreservedNewlines();
}

private static int getDocTypeIdStart(DOMDocumentType docType) {
if (docType.getPublicIdNode() != null) {
return docType.getPublicIdNode().getStart();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ private int formatStartTagElement(DOMElement element, XMLFormattingConstraints p
int startTagOpenOffset = element.getStartTagOpenOffset();
int startTagCloseOffset = element.getStartTagCloseOffset();
boolean addLineSeparator = element.getParentElement() == null && element.getPreviousSibling() == null;
if (end != -1 && startTagOpenOffset > end || start != -1 && startTagCloseOffset != -1 && startTagCloseOffset < start) {
if (end != -1 && startTagOpenOffset > end
|| start != -1 && startTagCloseOffset != -1 && startTagCloseOffset < start) {
return 0;
}
switch (formatElementCategory) {
Expand All @@ -92,9 +93,9 @@ private int formatStartTagElement(DOMElement element, XMLFormattingConstraints p
int parentStartCloseOffset = element.getParentElement().getStartTagCloseOffset() + 1;
if (parentStartCloseOffset != startTagOpenOffset
&& StringUtils.isWhitespace(formatterDocument.getText(), parentStartCloseOffset,
startTagOpenOffset)) {
int nbSpaces = replaceLeftSpacesWithIndentation(indentLevel, parentStartCloseOffset, startTagOpenOffset,
!addLineSeparator, edits);
startTagOpenOffset)) {
int nbSpaces = replaceLeftSpacesWithIndentation(indentLevel, parentStartCloseOffset,
startTagOpenOffset, !addLineSeparator, edits);
width = element.getTagName() != null ? nbSpaces + element.getTagName().length() + 1 : nbSpaces;
if (!addLineSeparator) {
width -= formatterDocument.getLineDelimiter().length();
Expand All @@ -105,15 +106,14 @@ private int formatStartTagElement(DOMElement element, XMLFormattingConstraints p
// If preserve new lines
int preservedNewLines = getPreservedNewlines();
int currentNewLineCount = XMLFormatterDocumentNew.getExistingNewLineCount(formatterDocument.getText(),
startTagOpenOffset,
formatterDocument.getLineDelimiter());
startTagOpenOffset, formatterDocument.getLineDelimiter());
if (currentNewLineCount > preservedNewLines) {
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, 0, startTagOpenOffset,
preservedNewLines + 1, edits);
} else {
// remove spaces and indent
int nbSpaces = replaceLeftSpacesWithIndentation(indentLevel, 0, startTagOpenOffset, !addLineSeparator,
edits);
int newLineCount = currentNewLineCount == 0 && !addLineSeparator ? 1 : currentNewLineCount;
int nbSpaces = replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, 0, startTagOpenOffset,
newLineCount, edits);
width = element.getTagName() != null ? nbSpaces + element.getTagName().length() + 1 : nbSpaces;
if (!addLineSeparator) {
width -= formatterDocument.getLineDelimiter().length();
Expand Down Expand Up @@ -304,15 +304,14 @@ private int formatEndTagElement(DOMElement element, XMLFormattingConstraints par
// If preserve new lines
int preservedNewLines = getPreservedNewlines();
int currentNewLineCount = XMLFormatterDocumentNew.getExistingNewLineCount(formatterDocument.getText(),
endTagOffset,
formatterDocument.getLineDelimiter());
endTagOffset, formatterDocument.getLineDelimiter());
if (currentNewLineCount > preservedNewLines) {
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, startTagCloseOffset,
endTagOffset, preservedNewLines + 1, edits);
} else {
// remove spaces and indent
replaceLeftSpacesWithIndentation(indentLevel, startTagCloseOffset, endTagOffset, true,
edits);
int newLineCount = currentNewLineCount == 0 ? 1 : currentNewLineCount;
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, startTagCloseOffset, endTagOffset,
newLineCount, edits);
break;
}
case NormalizeSpace:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ public class XMLFormatterExperimentalIndentTest extends AbstractCacheBasedTest {
public void startWithSpaces() throws BadLocationException {
String content = "\r\n " + //
" <a></a>";
String expected = "<a></a>";
String expected = "\r\n" + //
"<a></a>";
assertFormat(content, expected, //
te(0, 0, 1, 7, ""));
te(0, 0, 1, 7, "\r\n"));
assertFormat(expected, expected);
}

Expand Down
Loading

0 comments on commit 0df183a

Please sign in to comment.