Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix unexpected behavior of xml.format.preservedNewlines with experimental formatter #1341

Merged
merged 1 commit into from
Oct 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,36 @@ 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) {
// Reduce to number of new lines to the new line number specified by
// preservedNewLines setting
// Example: preservedNewLines = 1
// <a> \r\n
// \r\n
// \r\n --> remove this line, leaving one remaining new line
// </a>
replaceLeftSpacesWithIndentationWithMultiNewLines(indentLevel, parentNodeStart,
JessicaJHee marked this conversation as resolved.
Show resolved Hide resolved
nodeDeclStart, preservedNewLines + 1, edits);
} else {
// Maintain the current number of new lines or add line separator where there is
// no new line present
int newLineCount = currentNewLineCount == 0 ? 1 : currentNewLineCount;
JessicaJHee marked this conversation as resolved.
Show resolved Hide resolved
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 +214,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 +242,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 +256,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,18 @@ 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 (element.getParentNode().isOwnerDocument() && element.getParentNode().getFirstChild() == element){
// If the element is at the start of the file, remove new lines and spaces
currentNewLineCount = 0;
}
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 +308,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
Loading