diff --git a/.idea/misc.xml b/.idea/misc.xml index 42169386d..4c262623a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -216,7 +216,7 @@ - + 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 1ccde2454..49cd06737 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 @@ -120,38 +120,38 @@ abstract class TreeSitterLanguage(context: Context, lang: TSLanguage, type: Stri val indentsQuery = languageSpec.indentsQuery ?: return 0 return TSParser.create().use { parser -> parser.language = languageSpec.language - val tree = parser.parseString(content) + return@use parser.parseString(content).use { tree -> + TSQueryCursor.create().use { cursor -> + cursor.exec(indentsQuery, tree.rootNode) - return@use TSQueryCursor.create().use { cursor -> - cursor.exec(indentsQuery, tree.rootNode) - - var indent = 0 - var match: TSQueryMatch? = cursor.nextMatch() - val captures = mutableListOf() - while (match != null) { - captures.addAll(match.captures) - match = cursor.nextMatch() - } - - captures.sortBy { it.node.startByte } - - for (capture in captures) { - val capLine = capture.node.startPoint.row - val capCol = capture.node.endPoint.column / 2 - - if (capLine > line || (capLine == line && capCol > column)) { - break + var indent = 0 + var match: TSQueryMatch? = cursor.nextMatch() + val captures = mutableListOf() + while (match != null) { + captures.addAll(match.captures) + match = cursor.nextMatch() } - val captureName = indentsQuery.getCaptureNameForId(capture.index) - if (captureName == "indent") { - ++indent - } else if (captureName == "outdent") { - --indent - } - } + captures.sortBy { it.node.startByte } - finalizeIndent(indent) - decrementBy + for (capture in captures) { + val capLine = capture.node.startPoint.row + val capCol = capture.node.endPoint.column / 2 + + if (capLine > line || (capLine == line && capCol > column)) { + break + } + + val captureName = indentsQuery.getCaptureNameForId(capture.index) + if (captureName == "indent") { + ++indent + } else if (captureName == "outdent") { + --indent + } + } + + finalizeIndent(indent) - decrementBy + } } } } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt index 818b68f7d..238b85595 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt @@ -24,6 +24,7 @@ import com.itsaky.androidide.lsp.java.parser.ts.TSMethodPruner.prune import com.itsaky.androidide.projects.FileManager import com.itsaky.androidide.utils.StopWatch import com.itsaky.androidide.utils.VMUtils +import com.itsaky.androidide.utils.withStopWatch import jdkx.tools.JavaFileObject import jdkx.tools.JavaFileObject.Kind.SOURCE import kotlin.io.path.name @@ -58,19 +59,22 @@ class JavaCompilerImpl(context: Context?) : ReusableJavaCompiler(context) { return super.parse(filename, content) } - val pruned = - StopWatch("${if(file is SourceFileObject) "[${file.path.name}] " else ""}Prune method bodies") - .let { - val contentBuilder = StringBuilder(content) - val parseResult = TSJavaParser.parse(file) - prune( - contentBuilder, - parseResult.tree, - compilerConfig.completionInfo?.cursor?.index ?: -1 - ) - it.log() - return@let contentBuilder - } + val pruned = withStopWatch("${if(file is SourceFileObject) "[${file.path.name}] " else ""}Prune method bodies") { watch -> + val contentBuilder = StringBuilder(content) + + return@withStopWatch TSJavaParser.parse(file).use { parseResult -> + + prune( + contentBuilder, + parseResult.tree, + compilerConfig.completionInfo?.cursor?.index ?: -1 + ) + + watch.log() + + return@use contentBuilder + } + } return super.parse(filename, pruned) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt index b3b546cce..8036ba41b 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt @@ -69,7 +69,7 @@ object TSJavaParser : IJavaParser { check(file.kind == JavaFileObject.Kind.SOURCE) { "File must a source file object" } synchronized(this.cache) { - val result = this.cache.get(file.toUri()) + val result = this.cache[file.toUri()] if (result != null) { if (result.fileModified == file.lastModified) { // cache hit and cache modified == file modified diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSParseResult.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSParseResult.kt index c22f504d9..870d494b0 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSParseResult.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSParseResult.kt @@ -26,7 +26,11 @@ import java.net.URI * * @author Akash Yadav */ -class TSParseResult(file: JavaFileObject, val tree: TSTree) { +class TSParseResult(file: JavaFileObject, val tree: TSTree) : AutoCloseable { val uri: URI = file.toUri() val fileModified: Long = file.lastModified + + override fun close() { + tree.close() + } }