Skip to content

Commit 42d05fa

Browse files
committed
Refactor TypstAnnotatedTextBuilder
1 parent 41f9f0d commit 42d05fa

File tree

3 files changed

+37
-36
lines changed

3 files changed

+37
-36
lines changed

src/main/kotlin/org/bsplines/ltexls/parsing/CharacterBasedCodeAnnotatedTextBuilder.kt

+5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ abstract class CharacterBasedCodeAnnotatedTextBuilder(
1919
protected var curChar = '\u0000'
2020
protected var curString = ""
2121
protected var isStartOfLine = false
22+
protected var characterProcessed = false
2223

2324
protected var dummyGenerator = DummyGenerator.getInstance()
2425
protected var dummyCounter = 0
@@ -36,6 +37,7 @@ abstract class CharacterBasedCodeAnnotatedTextBuilder(
3637
if (text?.isNotEmpty() == true) {
3738
super.addText(text)
3839
this.pos += text.length
40+
characterProcessed = true
3941
}
4042

4143
return this
@@ -45,6 +47,7 @@ abstract class CharacterBasedCodeAnnotatedTextBuilder(
4547
if (markup?.isNotEmpty() == true) {
4648
super.addMarkup(markup)
4749
this.pos += markup.length
50+
characterProcessed = true
4851
}
4952

5053
return this
@@ -57,6 +60,7 @@ abstract class CharacterBasedCodeAnnotatedTextBuilder(
5760
if (interpretAs?.isNotEmpty() == true) {
5861
super.addMarkup((markup ?: ""), interpretAs)
5962
this.pos += (markup?.length ?: 0)
63+
characterProcessed = true
6064
} else {
6165
addMarkup(markup)
6266
}
@@ -73,6 +77,7 @@ abstract class CharacterBasedCodeAnnotatedTextBuilder(
7377
this.curChar = this.code[this.pos]
7478
this.curString = this.curChar.toString()
7579
this.isStartOfLine = ((this.pos == 0) || this.code[this.pos - 1] == '\n')
80+
characterProcessed = false
7681
processCharacter()
7782

7883
if (this.pos <= lastPos) {

src/main/kotlin/org/bsplines/ltexls/parsing/typst/TypstAnnotatedTextBuilder.kt

+31-35
Original file line numberDiff line numberDiff line change
@@ -18,90 +18,86 @@ class TypstAnnotatedTextBuilder(
1818
private var codeModeString = false
1919
private var codeModeBracketsCounter = 0
2020

21-
@Suppress("ReturnCount", "ComplexMethod")
2221
override fun processCharacter() {
23-
if (processEscapeCharacter()) return
24-
if (processMathBlock()) return
25-
if (codeMode) {
26-
processCodeMode()
27-
return
28-
}
29-
if (addMarkupInternal(CODE_REGEX)) {
30-
codeModeBracketsCounter++
31-
codeMode = true
32-
return
33-
}
22+
processEscapeCharacter()
23+
processMathBlock()
24+
processCodeMode()
3425

3526
if (this.isStartOfLine) {
36-
if (addMarkupInternal(LIST_REGEX)) return
37-
if (addMarkupInternal(LEADING_WHITESPACE_REGEX)) return
38-
if (addMarkupInternal(HEADING_REGEX)) return
27+
addMarkupInternal(LIST_REGEX)
28+
addMarkupInternal(LEADING_WHITESPACE_REGEX)
29+
addMarkupInternal(HEADING_REGEX)
3930
}
4031

41-
if (addMarkupInternal(LINE_COMMENT_REGEX, "\n")) return
42-
if (addMarkupInternal(MULTILINELINE_COMMENT_REGEX, "\n")) return
43-
if (addMarkupInternal(MARKUP_REGEX)) return
44-
if (addMarkupInternal(LET_REGEX)) return
45-
if (addMarkupInternal(IMPORT_REGEX, "\n")) return
46-
47-
if (addMarkupInternal(SQUARE_BRACKETS_REGEX)) return
32+
addMarkupInternal(CODE_REGEX, "", true)
33+
addMarkupInternal(LINE_COMMENT_REGEX, "\n")
34+
addMarkupInternal(MULTILINELINE_COMMENT_REGEX, "\n")
35+
addMarkupInternal(MARKUP_REGEX)
36+
addMarkupInternal(LET_REGEX)
37+
addMarkupInternal(IMPORT_REGEX, "\n")
38+
addMarkupInternal(SQUARE_BRACKETS_REGEX)
4839

4940
addText(this.curString)
5041
}
5142

43+
override fun addText(text: String?): CharacterBasedCodeAnnotatedTextBuilder {
44+
if (characterProcessed) return this
45+
return super.addText(text)
46+
}
47+
5248
private fun addMarkupInternal(
5349
regex: Regex,
5450
interpretAs: String = "",
55-
): Boolean {
51+
startofCodeBlock: Boolean = false,
52+
) {
53+
if (characterProcessed) return
5654
var matchResult: MatchResult?
5755
matchResult = matchFromPosition(regex)
5856
if (matchResult != null) {
5957
addMarkup(matchResult.value, interpretAs)
60-
return true
58+
if (startofCodeBlock) {
59+
codeModeBracketsCounter++
60+
codeMode = true
61+
}
6162
}
62-
return false
6363
}
6464

65-
private fun processEscapeCharacter(): Boolean {
65+
private fun processEscapeCharacter() {
66+
if (characterProcessed) return
6667
// Check for backslash escape character
6768
if (this.curString == "\\") {
6869
addMarkup(this.curString)
6970
// Add subsequent char as text if available
7071
if (this.code.length > this.pos) {
72+
characterProcessed = false
7173
addText(this.code[this.pos].toString())
72-
return true
7374
}
7475
}
75-
return false
7676
}
7777

78-
private fun processMathBlock(): Boolean {
78+
private fun processMathBlock() {
79+
if (characterProcessed) return
7980
if (this.curString == "$") {
8081
// Start or end of math mode
8182
mathMode = !mathMode
8283
addMarkup(this.curString)
83-
return true
8484
} else if (mathMode) {
8585
if (this.curString == "\"") {
8686
// Start or end of String within math mode
8787
mathModeString = !mathModeString
8888
addText(this.curString)
89-
return true
9089
}
9190
if (mathModeString) {
9291
// String within math mode to be spell checked
9392
addText(this.curString)
9493
} else {
9594
addMarkup(this.curString)
9695
}
97-
return true
98-
} else {
99-
// No math mode
100-
return false
10196
}
10297
}
10398

10499
private fun processCodeMode() {
100+
if (!codeMode || characterProcessed) return
105101
when (this.curString) {
106102
"(" -> {
107103
codeModeBracketsCounter++

src/test/kotlin/org/bsplines/ltexls/parsing/typst/TypstAnnotatedTextBuilderTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class TypstAnnotatedTextBuilderTest : CodeAnnotatedTextBuilderTest("typst") {
160160
The amount is \$5
161161
including VAT. This is a last backslash: \
162162
""".trimIndent(),
163-
"The amount is $5\nincluding VAT. This is a last backslash: \\",
163+
"The amount is $5\nincluding VAT. This is a last backslash: ",
164164
)
165165
}
166166
}

0 commit comments

Comments
 (0)