diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutTagCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutTagCompletionProvider.kt index df10b3428..90d10aef7 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutTagCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutTagCompletionProvider.kt @@ -51,8 +51,6 @@ open class LayoutTagCompletionProvider(val provider: ICompletionProvider) : prefix.substring(1) } else { prefix - }.let { - if (it.contains('.')) it.substringAfterLast('.') else it } return getCompleter(newPrefix).complete(params, pathData, document, type, newPrefix) diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt index 1027aaa6c..7f283c257 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt @@ -23,6 +23,7 @@ import com.itsaky.androidide.lsp.api.ICompletionProvider import com.itsaky.androidide.lsp.models.CompletionItem import com.itsaky.androidide.lsp.models.CompletionParams import com.itsaky.androidide.lsp.models.CompletionResult +import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.lsp.xml.providers.completion.match import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType import com.itsaky.androidide.projects.api.ModuleProject @@ -48,26 +49,35 @@ class QualifiedTagCompleter(provider: ICompletionProvider) : LayoutTagCompletion val result = mutableListOf() val (widgets, module) = doLookup() var fqn = prefix - if (fqn.endsWith('.')) { + if (prefix.endsWith('.')) { fqn = fqn.substringBeforeLast('.') } - widgets.getNode(fqn)?.children?.values?.forEach { - val qualifiedName = "${fqn}.${it.name}" + widgets.getNode(name = fqn, createIfNotPresent = false)?.children?.values?.forEach { + val qualifiedName = "$fqn.${it.name}" val match = match(it.name, qualifiedName, prefix) result.add(createTagCompletionItem(it.name, qualifiedName, match)) } - + addFromTrie(module.compileClasspathClasses, fqn, prefix, result) addFromTrie(module.compileJavaSourceClasses, fqn, prefix, result) return CompletionResult(result) } - - private fun addFromTrie(trie: ClassTrie, fqn: String, prefix: String, result: MutableList) { - val node = trie.findNode(fqn) ?: return + + private fun addFromTrie( + trie: ClassTrie, + fqn: String, + prefix: String, + result: MutableList + ) { + val node = trie.findNode(fqn) ?: trie.findNode(fqn.substringBeforeLast('.')) ?: return node.children.values.forEach { val match = match(it.name, it.qualifiedName, prefix) + if (match == NO_MATCH) { + return@forEach + } + result.add(createTagCompletionItem(it.name, it.qualifiedName, match)) } } diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar index 18feb8ecf..42229928f 100644 Binary files a/tests/test-home/.androidide/init/model.jar and b/tests/test-home/.androidide/init/model.jar differ