Skip to content

Commit 21dee77

Browse files
committed
feat: introduce ToonIndentingLexer and refactor
1 parent 2bcf264 commit 21dee77

File tree

6 files changed

+35
-23
lines changed

6 files changed

+35
-23
lines changed

src/main/kotlin/com/github/xepozz/toon/language/ToonParserDefinition.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package com.github.xepozz.toon.language
22

3-
import com.github.xepozz.toon.language.parser.ToonLexerAdapter
3+
import com.github.xepozz.toon.language.parser.ToonIndentingLexer
44
import com.github.xepozz.toon.language.parser.ToonParser
55
import com.github.xepozz.toon.language.psi.ToonTokenSets
66
import com.github.xepozz.toon.language.psi.ToonTypes
77
import com.intellij.lang.ASTNode
88
import com.intellij.lang.ParserDefinition
99
import com.intellij.psi.FileViewProvider
1010
import com.intellij.psi.tree.IFileElementType
11-
import com.intellij.psi.tree.TokenSet
1211

1312
class ToonParserDefinition : ParserDefinition {
14-
override fun createLexer(project: com.intellij.openapi.project.Project?) = ToonLexerAdapter()
13+
override fun createLexer(project: com.intellij.openapi.project.Project?) = ToonIndentingLexer()
1514

1615
override fun getWhitespaceTokens() = TokenSet.WHITE_SPACE
1716

src/main/kotlin/com/github/xepozz/toon/language/ToonSyntaxHighlighter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.github.xepozz.toon.language
22

3-
import com.github.xepozz.toon.language.parser.ToonLexerAdapter
3+
import com.github.xepozz.toon.language.parser.ToonLexer
44
import com.github.xepozz.toon.language.psi.ToonTypes
55
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
66
import com.intellij.openapi.editor.HighlighterColors
@@ -10,7 +10,7 @@ import com.intellij.psi.TokenType
1010
import com.intellij.psi.tree.IElementType
1111

1212
class ToonSyntaxHighlighter : SyntaxHighlighterBase() {
13-
override fun getHighlightingLexer() = ToonLexerAdapter()
13+
override fun getHighlightingLexer() = ToonLexer()
1414

1515
override fun getTokenHighlights(tokenType: IElementType) = when (tokenType) {
1616
ToonTypes.TEXT -> STRING_KEYS

src/main/kotlin/com/github/xepozz/toon/language/parser/ToonLexerAdapter.kt renamed to src/main/kotlin/com/github/xepozz/toon/language/parser/IndentingLexerAdapter.kt

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,31 @@
11
package com.github.xepozz.toon.language.parser
22

3-
import com.github.xepozz.toon.language.psi.ToonTypes
4-
import com.intellij.lexer.FlexAdapter
53
import com.intellij.lexer.Lexer
64
import com.intellij.lexer.LookAheadLexer
7-
8-
class ToonLexerAdapter : LookAheadLexer(FlexAdapter(ToonLexer(null))) {
5+
import com.intellij.psi.tree.IElementType
6+
7+
abstract class IndentingLexerAdapter(
8+
lexer: Lexer,
9+
private val eolTokenType: IElementType,
10+
private val indentTokenType: IElementType,
11+
private val dedentTokenType: IElementType,
12+
) : LookAheadLexer(lexer) {
913
private val indentStack = mutableListOf(0)
10-
private var start = false
1114

1215
override fun lookAhead(baseLexer: Lexer) {
1316
val tokenType = baseLexer.tokenType
1417

15-
println("tokenType: $tokenType")
1618
if (tokenType == null) {
17-
if (!start) {
18-
start = true
19-
super.lookAhead(baseLexer)
20-
return
21-
}
2219
val endOffset = baseLexer.tokenEnd
23-
println("compensation last: ${indentStack.size}, position: $endOffset")
2420
while (indentStack.size > 1) {
2521
indentStack.removeLast()
26-
addToken(endOffset, ToonTypes.DEDENT)
22+
addToken(endOffset, dedentTokenType)
2723
}
24+
advanceAs(baseLexer, tokenType)
2825
return
2926
}
3027

31-
if (tokenType != ToonTypes.EOL) {
28+
if (tokenType != eolTokenType) {
3229
advanceAs(baseLexer, tokenType)
3330
return
3431
}
@@ -69,16 +66,16 @@ class ToonLexerAdapter : LookAheadLexer(FlexAdapter(ToonLexer(null))) {
6966
when {
7067
newIndent > currentIndent -> {
7168
indentStack.add(newIndent)
72-
addToken(logicalLineStart, ToonTypes.INDENT)
69+
addToken( indentTokenType)
7370
}
7471

7572
newIndent < currentIndent -> {
76-
println("compensation in process: ${indentStack.size}, position: $logicalLineStart")
7773
while (indentStack.size > 1 && newIndent < indentStack.last()) {
7874
indentStack.removeLast()
79-
addToken(logicalLineStart, ToonTypes.DEDENT)
75+
addToken(logicalLineStart, dedentTokenType)
8076
}
8177
}
78+
8279
else -> {
8380
// Same indent – nothing to emit
8481
}

src/main/kotlin/com/github/xepozz/toon/language/parser/Toon.flex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.intellij.psi.TokenType;
66
import com.github.xepozz.toon.language.psi.ToonTypes;
77

88
%%
9-
%class ToonLexer
9+
%class _ToonLexer
1010
%implements FlexLexer
1111
%unicode
1212
%function advance
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.github.xepozz.toon.language.parser
2+
3+
import com.github.xepozz.toon.language.psi.ToonTypes
4+
5+
class ToonIndentingLexer : IndentingLexerAdapter(
6+
ToonLexer(),
7+
ToonTypes.EOL,
8+
ToonTypes.INDENT,
9+
ToonTypes.DEDENT,
10+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.github.xepozz.toon.language.parser
2+
3+
import com.intellij.lexer.FlexAdapter
4+
5+
class ToonLexer : FlexAdapter(_ToonLexer(null))
6+

0 commit comments

Comments
 (0)