Skip to content

Commit d9331ec

Browse files
committed
fix(templates): use XmlBuilder from 'xml-dom' module for building XML files
1 parent 80bd4ce commit d9331ec

File tree

25 files changed

+878
-835
lines changed

25 files changed

+878
-835
lines changed

app/proguard-rules.pro

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
}
7979

8080
# Used in preferences
81-
-keep enum com.itsaky.androidide.lsp.xml.models.EmptyElements { *; }
81+
-keep enum org.eclipse.lemminx.dom.builder.EmptyElements { *; }
8282
-keep enum com.itsaky.androidide.xml.permissions.Permission { *; }
8383

8484
# Lots of native methods in tree-sitter

app/src/main/java/com/itsaky/androidide/preferences/xmlPrefs.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package com.itsaky.androidide.preferences
1919

2020
import android.content.Context
2121
import com.itsaky.androidide.resources.R.string
22-
import com.itsaky.androidide.lsp.xml.models.EmptyElements
2322
import com.itsaky.androidide.preferences.internal.CLOSING_BRACKET_NEW_LINE
2423
import com.itsaky.androidide.preferences.internal.EMPTY_ELEMENTS_BEHAVIOR
2524
import com.itsaky.androidide.preferences.internal.INSERT_FINAL_NEW_LINE
@@ -50,6 +49,7 @@ import com.itsaky.androidide.preferences.internal.splitAttributes
5049
import com.itsaky.androidide.preferences.internal.splitAttributesIndentSize
5150
import com.itsaky.androidide.preferences.internal.trimFinalNewLine
5251
import com.itsaky.androidide.preferences.internal.trimTrailingWhitespace
52+
import org.eclipse.lemminx.dom.builder.EmptyElements
5353
import kotlinx.parcelize.Parcelize
5454

5555
@Parcelize

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/models/XMLFormattingOptions.kt

+23-34
Original file line numberDiff line numberDiff line change
@@ -19,67 +19,56 @@ package com.itsaky.androidide.lsp.xml.models
1919

2020
import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory
2121
import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory.PreserveSpace
22+
import org.eclipse.lemminx.dom.builder.EmptyElements
23+
import org.eclipse.lemminx.dom.builder.BaseXmlFormattingOptions
2224
import org.eclipse.lemminx.dom.DOMElement
2325

2426
/**
2527
* Options for XML code formatting.
2628
*
2729
* @author Akash Yadav
2830
*/
29-
open class XMLFormattingOptions {
30-
open val trimFinalNewLine: Boolean
31+
open class XMLFormattingOptions : BaseXmlFormattingOptions() {
32+
33+
override val isTrimFinalNewLine: Boolean
3134
get() = com.itsaky.androidide.preferences.internal.trimFinalNewLine
32-
open val insertFinalNewLine: Boolean
35+
override val isInsertFinalNewLine: Boolean
3336
get() = com.itsaky.androidide.preferences.internal.insertFinalNewLine
34-
open val splitAttributes: Boolean
37+
override val isSplitAttributes: Boolean
3538
get() = com.itsaky.androidide.preferences.internal.splitAttributes
36-
open val joinCDataLines: Boolean
39+
override val isJoinCDataLines: Boolean
3740
get() = com.itsaky.androidide.preferences.internal.joinCDataLines
38-
open val joinCommentLines: Boolean
41+
override val isJoinCommentLines: Boolean
3942
get() = com.itsaky.androidide.preferences.internal.joinCommentLines
40-
open val joinContentLines: Boolean
43+
override val isJoinContentLines: Boolean
4144
get() = com.itsaky.androidide.preferences.internal.joinContentLines
42-
open val spaceBeforeEmptyCloseTag: Boolean
45+
override val isSpaceBeforeEmptyCloseTag: Boolean
4346
get() = com.itsaky.androidide.preferences.internal.spaceBeforeEmptyCloseTag
44-
open val preserveEmptyContent: Boolean
47+
override val isPreserveEmptyContent: Boolean
4548
get() = com.itsaky.androidide.preferences.internal.preserveEmptyContent
46-
open val preserveAttributeLineBreaks: Boolean
49+
override val isPreserveAttributeLineBreaks: Boolean
4750
get() = com.itsaky.androidide.preferences.internal.preserveAttributeLineBreaks
48-
open val closingBracketNewLine: Boolean
51+
override val isClosingBracketNewLine: Boolean
4952
get() = com.itsaky.androidide.preferences.internal.closingBracketNewLine
50-
open val trimTrailingWhitespace: Boolean
53+
override val isTrimTrailingWhitespace: Boolean
5154
get() = com.itsaky.androidide.preferences.internal.trimTrailingWhitespace
5255

53-
open val maxLineWidth: Int
56+
override val maxLineWidth: Int
5457
get() = com.itsaky.androidide.preferences.internal.maxLineWidth
55-
open val preservedNewLines: Int
58+
override val preservedNewLines: Int
5659
get() = com.itsaky.androidide.preferences.internal.preservedNewLines
57-
open val splitAttributesIndentSize: Int
60+
override val splitAttributesIndentSize: Int
5861
get() = com.itsaky.androidide.preferences.internal.splitAttributesIndentSize
5962

60-
open val emptyElementsBehavior: EmptyElements
61-
get() = EmptyElements.valueOf(com.itsaky.androidide.preferences.internal.emptyElementsBehavior)
63+
override val emptyElementsBehavior: EmptyElements
64+
get() = EmptyElements.valueOf(
65+
com.itsaky.androidide.preferences.internal.emptyElementsBehavior)
6266

6367
private val preserveSpace =
64-
listOf(
65-
"xsl:text",
66-
"xsl:comment",
67-
"xsl:processing-instruction",
68-
"literallayout",
69-
"programlisting",
70-
"screen",
71-
"synopsis",
72-
"pre",
73-
"xd:pre"
74-
)
68+
listOf("xsl:text", "xsl:comment", "xsl:processing-instruction",
69+
"literallayout", "programlisting", "screen", "synopsis", "pre", "xd:pre")
7570

7671
fun getFormatElementCategory(element: DOMElement): FormatElementCategory? {
7772
return preserveSpace.find { it == element.tagName }?.let { PreserveSpace }
7873
}
7974
}
80-
81-
enum class EmptyElements {
82-
Expand,
83-
Collapse,
84-
Ignore
85-
}

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMAttributeFormatter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ private void removeLeftSpaces(int from, int to, List<TextEdit> edits) {
144144
}
145145

146146
private boolean isSplitAttributes() {
147-
return formatterDocument.getSharedSettings().getFormattingOptions().getSplitAttributes();
147+
return formatterDocument.getSharedSettings().getFormattingOptions().isSplitAttributes();
148148
}
149149

150150
private int getSplitAttributesIndentSize() {
@@ -158,7 +158,7 @@ boolean isPreserveAttributeLineBreaks() {
158158
return formatterDocument
159159
.getSharedSettings()
160160
.getFormattingOptions()
161-
.getPreserveAttributeLineBreaks();
161+
.isPreserveAttributeLineBreaks();
162162
}
163163

164164
private boolean hasLineBreak(int prevOffset, int start) {

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCDATAFormatter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ private void removeLeftSpaces(int from, int to, List<TextEdit> edits) {
113113
}
114114

115115
private boolean isJoinCDATALines() {
116-
return formatterDocument.getSharedSettings().getFormattingOptions().getJoinCDataLines();
116+
return formatterDocument.getSharedSettings().getFormattingOptions().isJoinCDataLines();
117117
}
118118

119119
private int getTabSize() {

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCommentFormatter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void formatComment(
109109
}
110110

111111
private boolean isJoinCommentLines() {
112-
return formatterDocument.getSharedSettings().getFormattingOptions().getJoinCommentLines();
112+
return formatterDocument.getSharedSettings().getFormattingOptions().isJoinCommentLines();
113113
}
114114

115115
private int getTabSize() {

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMElementFormatter.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
package com.itsaky.androidide.lsp.xml.providers.format;
3030

3131
import com.itsaky.androidide.lsp.models.TextEdit;
32-
import com.itsaky.androidide.lsp.xml.models.EmptyElements;
3332

33+
import org.eclipse.lemminx.dom.builder.EmptyElements;
3434
import org.eclipse.lemminx.commons.BadLocationException;
3535
import org.eclipse.lemminx.dom.DOMAttr;
3636
import org.eclipse.lemminx.dom.DOMElement;
@@ -435,7 +435,7 @@ private EmptyElements getEmptyElements(DOMElement element) {
435435
private boolean shouldFormatClosingBracketNewLine(DOMElement element) {
436436
boolean isSingleAttribute =
437437
element.getAttributeNodes() == null || element.getAttributeNodes().size() == 1;
438-
return (formatterDocument.getSharedSettings().getFormattingOptions().getClosingBracketNewLine()
438+
return (formatterDocument.getSharedSettings().getFormattingOptions().isClosingBracketNewLine()
439439
&& isSplitAttributes()
440440
&& !isSingleAttribute);
441441
}
@@ -500,11 +500,11 @@ private boolean isPreserveAttributeLineBreaks() {
500500
return formatterDocument
501501
.getSharedSettings()
502502
.getFormattingOptions()
503-
.getPreserveAttributeLineBreaks();
503+
.isPreserveAttributeLineBreaks();
504504
}
505505

506506
private boolean isSplitAttributes() {
507-
return formatterDocument.getSharedSettings().getFormattingOptions().getSplitAttributes();
507+
return formatterDocument.getSharedSettings().getFormattingOptions().isSplitAttributes();
508508
}
509509

510510
private int getSplitAttributesIndentSize() {
@@ -518,15 +518,15 @@ private boolean isSpaceBeforeEmptyCloseTag() {
518518
return formatterDocument
519519
.getSharedSettings()
520520
.getFormattingOptions()
521-
.getSpaceBeforeEmptyCloseTag();
521+
.isSpaceBeforeEmptyCloseTag();
522522
}
523523

524524
private EmptyElements getEmptyElements() {
525525
return formatterDocument.getSharedSettings().getFormattingOptions().getEmptyElementsBehavior();
526526
}
527527

528528
private boolean isPreserveEmptyContent() {
529-
return formatterDocument.getSharedSettings().getFormattingOptions().getPreserveEmptyContent();
529+
return formatterDocument.getSharedSettings().getFormattingOptions().isPreserveEmptyContent();
530530
}
531531

532532
private void formatChildren(

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMTextFormatter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,14 @@ private void insertLineBreak(int start, int end, List<TextEdit> edits) {
123123
}
124124

125125
private boolean isPreserveEmptyContent() {
126-
return formatterDocument.getSharedSettings().getFormattingOptions().getPreserveEmptyContent();
126+
return formatterDocument.getSharedSettings().getFormattingOptions().isPreserveEmptyContent();
127127
}
128128

129129
private void replaceSpacesWithOneSpace(int spaceStart, int spaceEnd, List<TextEdit> edits) {
130130
formatterDocument.replaceSpacesWithOneSpace(spaceStart, spaceEnd, edits);
131131
}
132132

133133
private boolean isJoinContentLines() {
134-
return formatterDocument.getSharedSettings().getFormattingOptions().getJoinContentLines();
134+
return formatterDocument.getSharedSettings().getFormattingOptions().isJoinContentLines();
135135
}
136136
}

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocument.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@
2828
package com.itsaky.androidide.lsp.xml.providers.format;
2929

3030
import com.itsaky.androidide.lsp.models.TextEdit;
31-
import com.itsaky.androidide.lsp.xml.models.EmptyElements;
3231
import com.itsaky.androidide.lsp.xml.models.XMLServerSettings;
3332
import com.itsaky.androidide.lsp.xml.utils.XMLBuilder;
3433
import com.itsaky.androidide.models.Position;
3534
import com.itsaky.androidide.models.Range;
3635
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
3736

37+
import org.eclipse.lemminx.dom.builder.EmptyElements;
3838
import org.eclipse.lemminx.commons.BadLocationException;
3939
import org.eclipse.lemminx.commons.TextDocument;
4040
import org.eclipse.lemminx.dom.DOMAttr;
@@ -505,7 +505,7 @@ private void formatElement(DOMElement element) throws BadLocationException {
505505
* @throws BadLocationException
506506
*/
507507
private void formatElementStartTagCloseBracket(DOMElement element) throws BadLocationException {
508-
if (this.sharedSettings.getFormattingOptions().getPreserveAttributeLineBreaks()
508+
if (this.sharedSettings.getFormattingOptions().isPreserveAttributeLineBreaks()
509509
&& element.hasAttributes()
510510
&& !isSameLine(getLastAttribute(element).getEnd(), element.getStartTagCloseOffset())) {
511511
xmlBuilder.linefeed();
@@ -527,7 +527,7 @@ private void formatElementStartTagCloseBracket(DOMElement element) throws BadLoc
527527
*/
528528
private void formatElementStartTagSelfCloseBracket(DOMElement element)
529529
throws BadLocationException {
530-
if (this.sharedSettings.getFormattingOptions().getPreserveAttributeLineBreaks()
530+
if (this.sharedSettings.getFormattingOptions().isPreserveAttributeLineBreaks()
531531
&& element.hasAttributes()) {
532532
int elementEndOffset = element.getEnd();
533533
if (element.isStartTagClosed()) {
@@ -550,8 +550,8 @@ private void formatAttributes(DOMElement element) throws BadLocationException {
550550
formatAttribute(attr, isSingleAttribute, prevOffset);
551551
prevOffset = attr.getEnd();
552552
}
553-
if ((this.sharedSettings.getFormattingOptions().getClosingBracketNewLine()
554-
&& this.sharedSettings.getFormattingOptions().getSplitAttributes())
553+
if ((this.sharedSettings.getFormattingOptions().isClosingBracketNewLine()
554+
&& this.sharedSettings.getFormattingOptions().isSplitAttributes())
555555
&& !isSingleAttribute) {
556556
xmlBuilder.linefeed();
557557
// Indent by tag + splitAttributesIndentSize to match with attribute indent
@@ -565,7 +565,7 @@ private void formatAttributes(DOMElement element) throws BadLocationException {
565565

566566
private void formatAttribute(DOMAttr attr, boolean isSingleAttribute, int prevOffset)
567567
throws BadLocationException {
568-
if (this.sharedSettings.getFormattingOptions().getPreserveAttributeLineBreaks()
568+
if (this.sharedSettings.getFormattingOptions().isPreserveAttributeLineBreaks()
569569
&& !isSameLine(prevOffset, attr.getStart())) {
570570
xmlBuilder.linefeed();
571571
xmlBuilder.indent(this.indentLevel + 1);
@@ -636,7 +636,7 @@ private EmptyElements getEmptyElements(DOMElement element) {
636636
case Expand:
637637
case Collapse:
638638
{
639-
if (this.sharedSettings.getFormattingOptions().getPreserveEmptyContent()) {
639+
if (this.sharedSettings.getFormattingOptions().isPreserveEmptyContent()) {
640640
// preserve content
641641
if (element.hasChildNodes()) {
642642
// The element is empty and contains somes spaces which must be preserved
@@ -752,11 +752,11 @@ private List<? extends TextEdit> getFormatTextEdit() throws BadLocationException
752752
// check if format range reaches the end of the document
753753
if (this.endOffset == this.textDocument.getText().length()) {
754754

755-
if (this.sharedSettings.getFormattingOptions().getTrimFinalNewLine()) {
755+
if (this.sharedSettings.getFormattingOptions().isTrimFinalNewLine()) {
756756
this.xmlBuilder.trimFinalNewlines();
757757
}
758758

759-
if (this.sharedSettings.getFormattingOptions().getInsertFinalNewLine()
759+
if (this.sharedSettings.getFormattingOptions().isInsertFinalNewLine()
760760
&& !this.xmlBuilder.isLastLineEmptyOrWhitespace()) {
761761
this.xmlBuilder.linefeed();
762762
}

lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocumentNew.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -683,11 +683,11 @@ private boolean isInsertSpaces() {
683683
}
684684

685685
private boolean isTrimFinalNewlines() {
686-
return getFormattingSettings().getTrimFinalNewLine();
686+
return getFormattingSettings().isTrimFinalNewLine();
687687
}
688688

689689
private boolean isInsertFinalNewline() {
690-
return getFormattingSettings().getInsertFinalNewLine();
690+
return getFormattingSettings().isInsertFinalNewLine();
691691
}
692692

693693
private String getQuotationAsString() {

0 commit comments

Comments
 (0)