Skip to content

Commit be0a341

Browse files
committed
refactor(devins): update symbol completion #101
Refactored symbol completion to support multiple languages. Added a new interface with a corresponding implementation class, and linked the custom completion provider in the XML configuration file. All symbol reference lookup now iterates through all available language providers. Fixed deprecated API usage and added support for interface-based completion.
1 parent 6136ed5 commit be0a341

File tree

8 files changed

+83
-16
lines changed

8 files changed

+83
-16
lines changed

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/DevInCompletionContributor.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ class DevInCompletionContributor : CompletionContributor() {
2929
valuePattern(BuiltinCommand.REV.agentName),
3030
RevisionReferenceLanguageProvider()
3131
)
32+
extend(
33+
CompletionType.BASIC,
34+
valuePattern(BuiltinCommand.SYMBOL.agentName),
35+
SymbolReferenceLanguageProvider()
36+
)
3237
}
3338

3439
override fun beforeCompletion(context: CompletionInitializationContext) {

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/completion/BuiltinCommandProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ enum class BuiltinCommand(
1818
REV("rev", "Read git change by file", AllIcons.Vcs.History, true, true),
1919

2020
/**
21-
* Every language will have a symbol completion, which is the most basic completion, for example:
21+
* Every language will have a symbol completion, which is the most basic completion, for example,
2222
* - Java: [com.intellij.codeInsight.completion.JavaKeywordCompletion]
2323
* - Kotlin: [org.jetbrains.kotlin.idea.completion.KotlinCompletionContributor]
2424
* - Python: [com.jetbrains.python.codeInsight.completion.PyClassNameCompletionContributor]
2525
*/
26-
SYMBOL("symbol", "[TODO] Read content by Java/Kotlin canonicalName", AllIcons.Actions.GroupBy, false),
26+
SYMBOL("symbol", "[TODO] Read content by Java/Kotlin canonicalName", AllIcons.Actions.GroupBy, true),
2727
WRITE("write", "Write content to a file, /write:path/to/file:L1-L2", AllIcons.Actions.Edit, true, true),
2828
PATCH("patch", "Apply patch to a file, /patch:path/to/file", AllIcons.Vcs.Patch_file, false),
2929
RUN("run", "Run the content of a file", AllIcons.Actions.Execute, false),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.unitmesh.devti.language.completion
2+
3+
import cc.unitmesh.devti.provider.devins.DevInsCompletionProvider
4+
import com.intellij.codeInsight.completion.CompletionParameters
5+
import com.intellij.codeInsight.completion.CompletionProvider
6+
import com.intellij.codeInsight.completion.CompletionResultSet
7+
import com.intellij.util.ProcessingContext
8+
9+
class SymbolReferenceLanguageProvider : CompletionProvider<CompletionParameters>() {
10+
override fun addCompletions(
11+
parameters: CompletionParameters,
12+
context: ProcessingContext,
13+
result: CompletionResultSet
14+
) {
15+
DevInsCompletionProvider.all().forEach { completionProvider ->
16+
val elements = completionProvider.lookupSymbol(parameters.editor.project!!, parameters, result)
17+
elements.forEach {
18+
result.addElement(it)
19+
}
20+
}
21+
}
22+
23+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package cc.unitmesh.idea.provider
2+
3+
import cc.unitmesh.devti.provider.devins.DevInsCompletionProvider
4+
import com.intellij.codeInsight.completion.CompletionParameters
5+
import com.intellij.codeInsight.completion.CompletionResultSet
6+
import com.intellij.codeInsight.completion.CompletionUtil
7+
import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor
8+
import com.intellij.codeInsight.lookup.LookupElement
9+
import com.intellij.ide.highlighter.JavaFileType
10+
import com.intellij.openapi.project.Project
11+
import com.intellij.psi.search.FileTypeIndex
12+
import com.intellij.psi.search.ProjectScope
13+
import com.intellij.util.SmartList
14+
15+
class JavaCustomDevInsCompletionProvider : DevInsCompletionProvider {
16+
override fun lookupSymbol(
17+
project: Project,
18+
parameters: CompletionParameters,
19+
result: CompletionResultSet,
20+
): Iterable<LookupElement> {
21+
val lookupElements: MutableList<LookupElement> = SmartList()
22+
val searchScope = ProjectScope.getContentScope(project)
23+
val javaFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, searchScope)
24+
if (javaFiles.isEmpty()) return lookupElements
25+
26+
val prefixMatcher = CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)
27+
result.withPrefixMatcher(prefixMatcher)
28+
29+
// TODO: fix this
30+
JavaClassNameCompletionContributor
31+
.addAllClasses(parameters, true, result.prefixMatcher, lookupElements::add)
32+
33+
return lookupElements
34+
}
35+
}

java/src/main/resources/cc.unitmesh.idea.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
<bundleName>messages.AutoDevBundle</bundleName>
6161
<categoryKey>intention.category.llm</categoryKey>
6262
</autoDevIntention>
63+
64+
<customDevInsCompletionProvider
65+
implementation="cc.unitmesh.idea.provider.JavaCustomDevInsCompletionProvider"/>
6366
</extensions>
6467

6568
<extensions defaultExtensionNs="com.intellij">

src/222/main/resources/META-INF/autodev-core.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,8 @@
166166
dynamic="true"/>
167167

168168
<extensionPoint qualifiedName="cc.unitmesh.customDevInsCompletionProvider"
169-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
170-
<with attribute="implementationClass" implements="cc.unitmesh.devti.provider.devins.DevInsCompletionProvider"/>
171-
</extensionPoint>
169+
interface="cc.unitmesh.devti.provider.devins.DevInsCompletionProvider"
170+
dynamic="true"/>
172171
</extensionPoints>
173172

174173
<applicationListeners>

src/233/main/resources/META-INF/autodev-core.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,8 @@
165165
dynamic="true"/>
166166

167167
<extensionPoint qualifiedName="cc.unitmesh.customDevInsCompletionProvider"
168-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
169-
<with attribute="implementationClass" implements="cc.unitmesh.devti.provider.devins.DevInsCompletionProvider"/>
170-
</extensionPoint>
168+
interface="cc.unitmesh.devti.provider.devins.DevInsCompletionProvider"
169+
dynamic="true"/>
171170
</extensionPoints>
172171

173172
<applicationListeners>
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
package cc.unitmesh.devti.provider.devins
22

33
import com.intellij.codeInsight.completion.CompletionParameters
4+
import com.intellij.codeInsight.completion.CompletionResultSet
45
import com.intellij.codeInsight.lookup.LookupElement
5-
import com.intellij.lang.Language
6-
import com.intellij.lang.LanguageExtension
6+
import com.intellij.openapi.extensions.ExtensionPointName
77
import com.intellij.openapi.project.Project
8-
import com.intellij.psi.PsiElement
98

109
interface DevInsCompletionProvider {
1110

1211
/**
1312
* Lookup canonical name for different language
1413
*/
15-
fun lookupSymbol(project: Project, parameters: CompletionParameters, element: PsiElement): Iterable<LookupElement>
14+
fun lookupSymbol(
15+
project: Project,
16+
parameters: CompletionParameters,
17+
result: CompletionResultSet
18+
): Iterable<LookupElement>
1619

1720
companion object {
18-
private val languageExtension: LanguageExtension<DevInsCompletionProvider> =
19-
LanguageExtension("cc.unitmesh.customDevInsCompletionProvider")
21+
private val EP_NAME: ExtensionPointName<DevInsCompletionProvider> =
22+
ExtensionPointName("cc.unitmesh.customDevInsCompletionProvider")
2023

21-
fun forLanguage(language: Language): DevInsCompletionProvider? {
22-
return languageExtension.forLanguage(language)
24+
fun all(): List<DevInsCompletionProvider> {
25+
return EP_NAME.extensionList
2326
}
2427
}
2528
}

0 commit comments

Comments
 (0)