diff --git a/.idea/misc.xml b/.idea/misc.xml
index 89dfeefc7..49f510363 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -221,4 +221,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
index 15ebf8aed..879b9ea5e 100644
--- a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
+++ b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt
@@ -34,6 +34,7 @@ import com.itsaky.androidide.actions.ActionsRegistry.Companion.getInstance
import com.itsaky.androidide.editor.language.java.JavaLanguage
import com.itsaky.androidide.editor.language.json.JsonLanguage
import com.itsaky.androidide.editor.language.kotlin.KotlinLanguage
+import com.itsaky.androidide.editor.language.log.LogLanguage
import com.itsaky.androidide.editor.language.treesitter.TSLanguageRegistry
import com.itsaky.androidide.editor.language.xml.XMLLanguage
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
@@ -59,6 +60,8 @@ import java.io.File
import kotlin.collections.component1
import kotlin.collections.component2
import kotlin.collections.set
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
/**
* Base class for EditorActivity. Handles logic for working with file editors.
@@ -124,6 +127,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler {
TSLanguageRegistry.instance.register(JavaLanguage.TS_TYPE, JavaLanguage.FACTORY)
TSLanguageRegistry.instance.register(KotlinLanguage.TS_TYPE_KT, KotlinLanguage.FACTORY)
TSLanguageRegistry.instance.register(KotlinLanguage.TS_TYPE_KTS, KotlinLanguage.FACTORY)
+ TSLanguageRegistry.instance.register(LogLanguage.TS_TYPE, LogLanguage.FACTORY)
TSLanguageRegistry.instance.register(JsonLanguage.TS_TYPE, JsonLanguage.FACTORY)
TSLanguageRegistry.instance.register(XMLLanguage.TS_TYPE, XMLLanguage.FACTORY)
IDEColorSchemeProvider.initIfNeeded()
diff --git a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt
index 161b283cd..85f5579de 100755
--- a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt
+++ b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt
@@ -54,6 +54,7 @@ class IDEApplication : BaseApplication() {
System.loadLibrary("tree-sitter-java")
System.loadLibrary("tree-sitter-json")
System.loadLibrary("tree-sitter-kotlin")
+ System.loadLibrary("tree-sitter-log")
System.loadLibrary("tree-sitter-xml")
}
}
diff --git a/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt
index 39b006c74..38e81b2fb 100644
--- a/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt
+++ b/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt
@@ -27,8 +27,8 @@ import androidx.fragment.app.Fragment
import com.blankj.utilcode.util.ThreadUtils
import com.itsaky.androidide.databinding.FragmentLogBinding
import com.itsaky.androidide.editor.language.log.LogLanguage
+import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.models.LogLine
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE
import com.itsaky.androidide.utils.ILogger
import com.itsaky.androidide.utils.ILogger.Priority
import com.itsaky.androidide.utils.jetbrainsMono
@@ -82,7 +82,6 @@ abstract class LogViewFragment : Fragment(), ShareableOutputFragment {
object : Runnable {
override fun run() {
cacheLock.withLock {
-
if (cacheLineTrack.size == MAX_LINE_COUNT) {
cache.delete(0, cacheLineTrack.poll()!!)
}
@@ -194,8 +193,10 @@ abstract class LogViewFragment : Fragment(), ShareableOutputFragment {
editor.typefaceLineNumber = jetbrainsMono()
editor.setTextSize(12f)
editor.typefaceText = jetbrainsMono()
- editor.colorScheme = SchemeAndroidIDE.newInstance(requireContext())
- editor.setEditorLanguage(LogLanguage())
+
+ IDEColorSchemeProvider.readScheme(requireContext()) { scheme ->
+ editor.applyTreeSitterLang(LogLanguage(requireContext()), LogLanguage.TS_TYPE, scheme)
+ }
}
override fun onDestroyView() {
diff --git a/editor/build.gradle.kts b/editor/build.gradle.kts
index 27c3f783f..6ed22ef0b 100644
--- a/editor/build.gradle.kts
+++ b/editor/build.gradle.kts
@@ -23,6 +23,7 @@ dependencies {
api(libs.androidide.ts.java)
api(libs.androidide.ts.json)
api(libs.androidide.ts.kotlin)
+ api(libs.androidide.ts.log)
api(libs.androidide.ts.xml)
api(libs.common.editor)
api(libs.common.editor.ts)
diff --git a/editor/src/main/assets/editor/schemes/default-dark/default-dark.json b/editor/src/main/assets/editor/schemes/default-dark/default-dark.json
index 92eb37a69..4c524494e 100644
--- a/editor/src/main/assets/editor/schemes/default-dark/default-dark.json
+++ b/editor/src/main/assets/editor/schemes/default-dark/default-dark.json
@@ -38,13 +38,34 @@
"ns_prefix": "#ce93d8",
"json.key": "#ba68c8",
- "json.escape": "#2196f3"
+ "json.escape": "#2196f3",
+
+ "log.err.text": "#f44336",
+ "log.err.pr.fg" : "#000000",
+ "log.err.pr.bg" : "#f44336",
+
+ "log.warn.text": "#FFEB3B",
+ "log.warn.pr.fg" : "#000000",
+ "log.warn.pr.bg" : "#FFEB3B",
+
+ "log.info.text": "#4CAF50",
+ "log.info.pr.fg" : "#ffffff",
+ "log.info.pr.bg" : "#1f65c0",
+
+ "log.debug.text": "#f5f5f5",
+ "log.debug.pr.fg" : "#ffffff",
+ "log.debug.pr.bg" : "#9e9d24",
+
+ "log.verbose.text": "#4fc3f7",
+ "log.verbose.pr.fg" : "#000000",
+ "log.verbose.pr.bg" : "#ffffff"
},
"editor": "@editor.json",
"languages": [
"@java.json",
"@json.json",
"@kotlin.json",
- "@xml.json"
+ "@xml.json",
+ "@log.json"
]
}
\ No newline at end of file
diff --git a/editor/src/main/assets/editor/schemes/default-dark/log.json b/editor/src/main/assets/editor/schemes/default-dark/log.json
new file mode 100644
index 000000000..04411d9b5
--- /dev/null
+++ b/editor/src/main/assets/editor/schemes/default-dark/log.json
@@ -0,0 +1,63 @@
+{
+ "types": ["log"],
+ "styles": {
+ "begin_header" : {
+ "fg": "@comment",
+ "italic": true
+ },
+ "err.date": "@log.err.text",
+ "err.time": "@log.err.text",
+ "err.pid": "@log.err.text",
+ "err.tid": "@log.err.text",
+ "err.tag" : "@log.err.text",
+ "err.message": "@log.err.text",
+ "err.priority": {
+ "fg": "@log.err.pr.fg",
+ "bg": "@log.err.pr.bg"
+ },
+
+ "warn.date": "@log.warn.text",
+ "warn.time": "@log.warn.text",
+ "warn.pid": "@log.warn.text",
+ "warn.tid": "@log.warn.text",
+ "warn.tag" : "@log.warn.text",
+ "warn.message": "@log.warn.text",
+ "warn.priority": {
+ "fg": "@log.warn.pr.fg",
+ "bg": "@log.warn.pr.bg"
+ },
+
+ "info.date": "@log.info.text",
+ "info.time": "@log.info.text",
+ "info.pid": "@log.info.text",
+ "info.tid": "@log.info.text",
+ "info.tag" : "@log.info.text",
+ "info.message": "@log.info.text",
+ "info.priority": {
+ "fg": "@log.info.pr.fg",
+ "bg": "@log.info.pr.bg"
+ },
+
+ "debug.date": "@log.debug.text",
+ "debug.time": "@log.debug.text",
+ "debug.pid": "@log.debug.text",
+ "debug.tid": "@log.debug.text",
+ "debug.tag" : "@log.debug.text",
+ "debug.message": "@log.debug.text",
+ "debug.priority": {
+ "fg": "@log.debug.pr.fg",
+ "bg": "@log.debug.pr.bg"
+ },
+
+ "verbose.date": "@log.verbose.text",
+ "verbose.time": "@log.verbose.text",
+ "verbose.pid": "@log.verbose.text",
+ "verbose.tid": "@log.verbose.text",
+ "verbose.tag" : "@log.verbose.text",
+ "verbose.message": "@log.verbose.text",
+ "verbose.priority": {
+ "fg": "@log.verbose.pr.fg",
+ "bg": "@log.verbose.pr.bg"
+ }
+ }
+}
\ No newline at end of file
diff --git a/editor/src/main/assets/editor/schemes/default-dark/scheme.prop b/editor/src/main/assets/editor/schemes/default-dark/scheme.prop
index cc2b3d108..6cad181eb 100644
--- a/editor/src/main/assets/editor/schemes/default-dark/scheme.prop
+++ b/editor/src/main/assets/editor/schemes/default-dark/scheme.prop
@@ -2,7 +2,7 @@
scheme.name=AndroidIDE Default - Dark
# The version code of the color scheme
-scheme.version=9
+scheme.version=10
# Whether the scheme is dark or light
scheme.isDark=true
diff --git a/editor/src/main/assets/editor/schemes/default/default.json b/editor/src/main/assets/editor/schemes/default/default.json
index 97f393095..edc35dcce 100644
--- a/editor/src/main/assets/editor/schemes/default/default.json
+++ b/editor/src/main/assets/editor/schemes/default/default.json
@@ -39,13 +39,34 @@
"ns_prefix": "#9c27b0",
"json.key": "#1976d2",
- "json.escape": "#2196f3"
+ "json.escape": "#2196f3",
+
+ "log.err.text": "#f44336",
+ "log.err.pr.fg" : "#000000",
+ "log.err.pr.bg" : "#f44336",
+
+ "log.warn.text": "#ffab00",
+ "log.warn.pr.fg" : "#000000",
+ "log.warn.pr.bg" : "#FFEB3B",
+
+ "log.info.text": "#4CAF50",
+ "log.info.pr.fg" : "#ffffff",
+ "log.info.pr.bg" : "#1f65c0",
+
+ "log.debug.text": "#212121",
+ "log.debug.pr.fg" : "#ffffff",
+ "log.debug.pr.bg" : "#9e9d24",
+
+ "log.verbose.text": "#0288d1",
+ "log.verbose.pr.fg" : "#000000",
+ "log.verbose.pr.bg" : "#ffffff"
},
"editor": "@editor.json",
"languages": [
"@java.json",
"@json.json",
"@kotlin.json",
- "@xml.json"
+ "@xml.json",
+ "@log.json"
]
}
\ No newline at end of file
diff --git a/editor/src/main/assets/editor/schemes/default/log.json b/editor/src/main/assets/editor/schemes/default/log.json
new file mode 100644
index 000000000..fccd820f4
--- /dev/null
+++ b/editor/src/main/assets/editor/schemes/default/log.json
@@ -0,0 +1,63 @@
+{
+ "types": ["log"],
+ "styles": {
+ "begin_header" : {
+ "fg": "@comment",
+ "italic": true
+ },
+ "err.date": "@log.err.text",
+ "err.time": "@log.err.text",
+ "err.pid": "@log.err.text",
+ "err.tid": "@log.err.text",
+ "err.tag" : "@log.err.text",
+ "err.msg": "@log.err.text",
+ "err.priority": {
+ "fg": "@log.err.pr.fg",
+ "bg": "@log.err.pr.bg"
+ },
+
+ "warn.date": "@log.warn.text",
+ "warn.time": "@log.warn.text",
+ "warn.pid": "@log.warn.text",
+ "warn.tid": "@log.warn.text",
+ "warn.tag" : "@log.warn.text",
+ "warn.msg": "@log.warn.text",
+ "warn.priority": {
+ "fg": "@log.warn.pr.fg",
+ "bg": "@log.warn.pr.bg"
+ },
+
+ "info.date": "@log.info.text",
+ "info.time": "@log.info.text",
+ "info.pid": "@log.info.text",
+ "info.tid": "@log.info.text",
+ "info.tag" : "@log.info.text",
+ "info.msg": "@log.info.text",
+ "info.priority": {
+ "fg": "@log.info.pr.fg",
+ "bg": "@log.info.pr.bg"
+ },
+
+ "debug.date": "@log.debug.text",
+ "debug.time": "@log.debug.text",
+ "debug.pid": "@log.debug.text",
+ "debug.tid": "@log.debug.text",
+ "debug.tag" : "@log.debug.text",
+ "debug.msg": "@log.debug.text",
+ "debug.priority": {
+ "fg": "@log.debug.pr.fg",
+ "bg": "@log.debug.pr.bg"
+ },
+
+ "verbose.date": "@log.verbose.text",
+ "verbose.time": "@log.verbose.text",
+ "verbose.pid": "@log.verbose.text",
+ "verbose.tid": "@log.verbose.text",
+ "verbose.tag" : "@log.verbose.text",
+ "verbose.msg": "@log.verbose.text",
+ "verbose.priority": {
+ "fg": "@log.verbose.pr.fg",
+ "bg": "@log.verbose.pr.bg"
+ }
+ }
+}
\ No newline at end of file
diff --git a/editor/src/main/assets/editor/schemes/default/scheme.prop b/editor/src/main/assets/editor/schemes/default/scheme.prop
index 62f252c16..c137eab2c 100644
--- a/editor/src/main/assets/editor/schemes/default/scheme.prop
+++ b/editor/src/main/assets/editor/schemes/default/scheme.prop
@@ -2,7 +2,7 @@
scheme.name=AndroidIDE Default
# The version code of the color scheme
-scheme.version=9
+scheme.version=10
# Whether the scheme is dark or light
scheme.isDark=false
diff --git a/editor/src/main/assets/editor/treesitter/log/highlights.scm b/editor/src/main/assets/editor/treesitter/log/highlights.scm
new file mode 100644
index 000000000..f6c805ec0
--- /dev/null
+++ b/editor/src/main/assets/editor/treesitter/log/highlights.scm
@@ -0,0 +1,91 @@
+(begin_header) @header
+
+(log_line
+ (date) @err.date
+ (time) @err.time
+ (pid) @err.pid
+ (tid) @err.tid
+ (priority) @err.priority
+ (tag) @err.tag
+ (message) @err.msg
+ (#match? @err.priority "E")
+)
+
+(log_line
+ (date) @warn.date
+ (time) @warn.time
+ (pid) @warn.pid
+ (tid) @warn.tid
+ (priority) @warn.priority
+ (tag) @warn.tag
+ (message) @warn.msg
+ (#match? @warn.priority "W")
+)
+
+(log_line
+ (date) @info.date
+ (time) @info.time
+ (pid) @info.pid
+ (tid) @info.tid
+ (priority) @info.priority
+ (tag) @info.tag
+ (message) @info.msg
+ (#match? @info.priority "I")
+)
+
+(log_line
+ (date) @debug.date
+ (time) @debug.time
+ (pid) @debug.pid
+ (tid) @debug.tid
+ (priority) @debug.priority
+ (tag) @debug.tag
+ (message) @debug.msg
+ (#match? @debug.priority "I")
+)
+
+(log_line
+ (date) @verbose.date
+ (time) @verbose.time
+ (pid) @verbose.pid
+ (tid) @verbose.tid
+ (priority) @verbose.priority
+ (tag) @verbose.tag
+ (message) @verbose.msg
+ (#match? @verbose.priority "V")
+)
+
+(ide_log_line
+ (ide_tag) @err.tag
+ (priority) @err.priority
+ (message) @err.msg
+ (#match? @err.priority "E")
+)
+
+(ide_log_line
+ (ide_tag) @warn.tag
+ (priority) @warn.priority
+ (message) @warn.msg
+ (#match? @warn.priority "W")
+)
+
+(ide_log_line
+ (ide_tag) @info.tag
+ (priority) @info.priority
+ (message) @info.msg
+ (#match? @info.priority "I")
+)
+
+(ide_log_line
+ (ide_tag) @debug.tag
+ (priority) @debug.priority
+ (message) @debug.msg
+ (#match? @debug.priority "D")
+)
+
+(ide_log_line
+ (ide_tag) @verbose.tag
+ (priority) @verbose.priority
+ (message) @verbose.msg
+ (#match? @verbose.priority "V")
+)
\ No newline at end of file
diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLanguage.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLanguage.kt
index cfe10105f..2fe1181d4 100644
--- a/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLanguage.kt
+++ b/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLanguage.kt
@@ -17,31 +17,22 @@
package com.itsaky.androidide.editor.language.log
-import android.os.Bundle
-import com.itsaky.androidide.editor.language.IDELanguage
-import io.github.rosemoe.sora.lang.completion.CompletionPublisher
-import io.github.rosemoe.sora.lang.smartEnter.NewlineHandler
-import io.github.rosemoe.sora.text.CharPosition
-import io.github.rosemoe.sora.text.ContentReference
-import io.github.rosemoe.sora.widget.SymbolPairMatch.DefaultSymbolPairs
+import android.content.Context
+import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguage
+import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguage.Factory
+import com.itsaky.androidide.treesitter.log.TSLanguageLog
-/** @author Akash Yadav */
-class LogLanguage @JvmOverloads constructor(val analyzer: LogLineAnalyzer = LogLineAnalyzer()) :
- IDELanguage() {
+/**
+ * Tree Sitter language implementation for logs.
+ *
+ * @author Akash Yadav
+ */
+class LogLanguage(context: Context) :
+ TreeSitterLanguage(context, TSLanguageLog.newInstance(), TS_TYPE) {
- override fun getAnalyzeManager() = analyzer
+ companion object {
+ const val TS_TYPE = "log"
- override fun requireAutoComplete(
- content: ContentReference,
- position: CharPosition,
- publisher: CompletionPublisher,
- extraArguments: Bundle
- ) {}
-
- override fun destroy() {}
-
- override fun getInterruptionLevel() = INTERRUPTION_LEVEL_NONE
- override fun getIndentAdvance(content: ContentReference, line: Int, column: Int) = 0
- override fun getSymbolPairs() = DefaultSymbolPairs()
- override fun getNewlineHandlers() = emptyArray()
+ @JvmField val FACTORY = Factory { LogLanguage(it) }
+ }
}
diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLineAnalyzer.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLineAnalyzer.kt
deleted file mode 100644
index b92dcecfe..000000000
--- a/editor/src/main/java/com/itsaky/androidide/editor/language/log/LogLineAnalyzer.kt
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * This file is part of AndroidIDE.
- *
- * AndroidIDE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AndroidIDE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with AndroidIDE. If not, see .
- */
-
-package com.itsaky.androidide.editor.language.log
-
-import com.itsaky.androidide.editor.language.log.LogLineAnalyzer.LogLineState
-import com.itsaky.androidide.lexers.log.LogLineTokenizer
-import com.itsaky.androidide.lexers.log.LogToken
-import com.itsaky.androidide.lexers.log.LogToken.PRIORITY
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_BG_DEBUG
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_BG_ERROR
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_BG_INFO
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_BG_VERBOSE
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_BG_WARNING
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_FG_DEBUG
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_FG_ERROR
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_FG_INFO
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_FG_VERBOSE
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_PRIORITY_FG_WARNING
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_TEXT_DEBUG
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_TEXT_ERROR
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_TEXT_INFO
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_TEXT_VERBOSE
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LOG_TEXT_WARNING
-import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.get
-import com.itsaky.androidide.utils.ILogger
-import com.itsaky.androidide.utils.ILogger.Priority.DEBUG
-import com.itsaky.androidide.utils.ILogger.Priority.ERROR
-import com.itsaky.androidide.utils.ILogger.Priority.INFO
-import com.itsaky.androidide.utils.ILogger.Priority.VERBOSE
-import com.itsaky.androidide.utils.ILogger.Priority.WARNING
-import io.github.rosemoe.sora.lang.analysis.AsyncIncrementalAnalyzeManager
-import io.github.rosemoe.sora.lang.analysis.IncrementalAnalyzeManager.LineTokenizeResult
-import io.github.rosemoe.sora.lang.styling.CodeBlock
-import io.github.rosemoe.sora.lang.styling.Span
-import io.github.rosemoe.sora.lang.styling.TextStyle
-import io.github.rosemoe.sora.text.Content
-
-/**
- * Analyzer for log lines.
- *
- * @author Akash Yadav
- */
-class LogLineAnalyzer : AsyncIncrementalAnalyzeManager() {
-
- class LogLineState
-
- override fun getInitialState() = LogLineState()
- override fun stateEquals(state: LogLineState?, another: LogLineState?) =
- state?.equals(another) ?: false
- override fun computeBlocks(text: Content?, delegate: CodeBlockAnalyzeDelegate?) =
- mutableListOf()
-
- override fun tokenizeLine(
- lineText: CharSequence,
- state: LogLineState,
- line: Int
- ): LineTokenizeResult {
- val input = lineText.toArray()
- val tokenizer = LogLineTokenizer(input)
- val tokens = tokenizer.allTokens()
- return LineTokenizeResult(LogLineState(), tokens)
- }
-
- override fun generateSpansForLine(
- result: LineTokenizeResult
- ): MutableList {
- val tokens = result.tokens
- val spans = mutableListOf()
- for (token in tokens) {
- when (token.type) {
- PRIORITY -> {
- val priority = ILogger.priority(token.text[0].uppercaseChar())!!
- val text: Int
- val foreground: Int
- val background: Int
- when (priority) {
- DEBUG -> {
- text = LOG_TEXT_DEBUG
- foreground = LOG_PRIORITY_FG_DEBUG
- background = LOG_PRIORITY_BG_DEBUG
- }
- INFO -> {
- text = LOG_TEXT_INFO
- foreground = LOG_PRIORITY_FG_INFO
- background = LOG_PRIORITY_BG_INFO
- }
- ERROR -> {
- text = LOG_TEXT_ERROR
- foreground = LOG_PRIORITY_FG_ERROR
- background = LOG_PRIORITY_BG_ERROR
- }
- WARNING -> {
- text = LOG_TEXT_WARNING
- foreground = LOG_PRIORITY_FG_WARNING
- background = LOG_PRIORITY_BG_WARNING
- }
- VERBOSE -> {
- text = LOG_TEXT_VERBOSE
- foreground = LOG_PRIORITY_FG_VERBOSE
- background = LOG_PRIORITY_BG_VERBOSE
- }
- }
-
- val span = Span.obtain(0, get(text))
- spans.add(span)
-
- val pSpan =
- Span.obtain(
- token.startIndex - 1,
- TextStyle.makeStyle(
- /* foregroundColorId = */ foreground,
- /* backgroundColorId = */ background,
- /* bold = */ false,
- /* italic = */ false,
- /* strikeThrough = */ false,
- /* noCompletion = */ true
- )
- )
- spans.add(pSpan)
-
- // Add the normal color span after the priority tag
- spans.add(span.copy().apply { column = token.endIndex + 2 })
- }
- }
- }
-
- if (spans.isEmpty()) {
- spans.add(Span.obtain(0, get(LOG_TEXT_DEBUG)))
- }
-
- return spans
- }
-
- private fun CharSequence.toArray(): CharArray {
- return CharArray(this.length) { this[it] }
- }
-}
diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt
index 5e50b0169..5e01da337 100644
--- a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt
+++ b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt
@@ -93,6 +93,10 @@ abstract class TreeSitterLanguage(context: Context, lang: TSLanguage, type: Stri
return newlineHandlersLazy
}
+ override fun getInterruptionLevel(): Int {
+ return INTERRUPTION_LEVEL_STRONG
+ }
+
override fun getIndentAdvance(content: ContentReference, line: Int, column: Int): Int {
return computeIndent(
content.toString(),
diff --git a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt
index 8d13f290d..0b1db2dd4 100644
--- a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt
+++ b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt
@@ -56,7 +56,13 @@ object LanguageSpecProvider {
bracketsScmSource = readScheme(context, type, "brackets"),
localsCaptureSpec = localsCaptureSpec,
predicates =
- listOf(MatchPredicate, NotMatchPredicate, EqualPredicate, NotEqualPredicate, AnyOfPredicate)
+ listOf(
+ MatchPredicate,
+ NotMatchPredicate,
+ EqualPredicate,
+ NotEqualPredicate,
+ AnyOfPredicate
+ )
)
return TreeSitterLanguageSpec(
spec = editorLangSpec,
@@ -73,5 +79,16 @@ object LanguageSpecProvider {
}
""
}
+<<<<<<< HEAD
+=======
+ if (assests.list("$BASE_SPEC_PATH/$type")?.contains("$name.scm") == false) {
+ if (type != "log" || name == "highlights") {
+ log.warn("Scheme file '$name' for type '$type' not found")
+ }
+ return ""
+ }
+
+ return assests.open("${BASE_SPEC_PATH}/${type}/${name}.scm").reader().readText()
+>>>>>>> c75ab30e3 (feat: use tree-sitter for log highlighting)
}
}
diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java
index 7da326db0..c0051d5d1 100644
--- a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java
+++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.java
@@ -955,8 +955,14 @@ public class IDEEditor extends CodeEditor implements IEditor, ILspEditor {
}
}
- private void applyTreeSitterLang(final Language language, final String extension,
- SchemeAndroidIDE scheme
+ public void applyTreeSitterLang(final TreeSitterLanguage language, final String type,
+ @Nullable SchemeAndroidIDE scheme
+ ) {
+ applyTreeSitterLang(((Language) language), type, scheme);
+ }
+
+ private void applyTreeSitterLang(final Language language, final String type,
+ @Nullable SchemeAndroidIDE scheme
) {
if (scheme == null) {
LOG.error("Failed to read current color scheme");
@@ -964,8 +970,8 @@ public class IDEEditor extends CodeEditor implements IEditor, ILspEditor {
}
if (scheme instanceof IDEColorScheme &&
- ((IDEColorScheme) scheme).getLanguageScheme(extension) == null) {
- LOG.warn("Color scheme does not support file type '" + extension + "'");
+ ((IDEColorScheme) scheme).getLanguageScheme(type) == null) {
+ LOG.warn("Color scheme does not support file type '" + type + "'");
scheme = SchemeAndroidIDE.newInstance(getContext());
}