Skip to content

Commit

Permalink
feat(devins-java): add package name completion #101
Browse files Browse the repository at this point in the history
Add the ability to suggest package names for completion in the `JavaCustomDevInsCompletionProvider`. This feature was added to enhance the user experience when working with Java code.
  • Loading branch information
phodal committed Mar 18, 2024
1 parent 1cf4ae3 commit d00d5a0
Showing 1 changed file with 20 additions and 8 deletions.
@@ -1,34 +1,46 @@
package cc.unitmesh.idea.provider

import cc.unitmesh.devti.provider.devins.DevInsCompletionProvider
import com.intellij.codeInsight.completion.CompletionParameters
import com.intellij.codeInsight.completion.CompletionResultSet
import com.intellij.codeInsight.completion.CompletionUtil
import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor
import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiPackageStatement
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.util.SmartList

class JavaCustomDevInsCompletionProvider : DevInsCompletionProvider {

override fun lookupSymbol(
project: Project,
parameters: CompletionParameters,
result: CompletionResultSet,
): Iterable<LookupElement> {
val lookupElements: MutableList<LookupElement> = SmartList()
val searchScope = ProjectScope.getContentScope(project)
val searchScope = ProjectScope.getProjectScope(project)
val javaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, searchScope)
if (javaFiles.isEmpty()) return lookupElements

val prefixMatcher = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)
result.withPrefixMatcher(prefixMatcher)

// TODO: fix this
JavaClassNameCompletionContributor
.addAllClasses(parameters, true, result.prefixMatcher, lookupElements::add)
val text = parameters.position.text.removePrefix(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED)

val packageStatements = javaFiles.mapNotNull {
val psi = PsiManager.getInstance(project).findFile(it) ?: return@mapNotNull null
PsiTreeUtil.getChildrenOfTypeAsList(psi, PsiPackageStatement::class.java).firstOrNull()
}

packageStatements.forEach {
val packageName = it.packageName
if (packageName != null && packageName.startsWith(text)) {
lookupElements.add(LookupElementBuilder.create(packageName))
}
}

return lookupElements
}
Expand Down

0 comments on commit d00d5a0

Please sign in to comment.