Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = "oap"
version = "0.0.6"
version = "0.0.7"

repositories {
mavenCentral()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package oap.application.plugin.completion

import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.icons.AllIcons
import com.intellij.patterns.PlatformPatterns
import com.intellij.psi.PsiElement
import com.intellij.util.Icons
import com.intellij.util.ProcessingContext
import oap.application.plugin.gen.psi.OapParameterKeyValueFirstId
import oap.application.plugin.psi.impl.JavaPsiUtils

class OapParameterCompletionContributor : CompletionContributor() {
init {
extend(
CompletionType.BASIC,
PlatformPatterns.psiElement().withParent(OapParameterKeyValueFirstId::class.java),
object : CompletionProvider<CompletionParameters>() {
override fun addCompletions(
parameters: CompletionParameters,
context: ProcessingContext,
result: CompletionResultSet
) {
val position: PsiElement = parameters.position

var prefix: String = position.text.removeSuffix(CompletionInitializationContext.DUMMY_IDENTIFIER_TRIMMED)

val parameters: List<JavaPsiUtils.ServiceParameter> = JavaPsiUtils.findParameters(position)

for (parameter: JavaPsiUtils.ServiceParameter in parameters) {
if (parameter.name.startsWith(prefix)) {
result.addElement(LookupElementBuilder.create(parameter.name).withIcon(
when(parameter.type) {
JavaPsiUtils.ServiceParameterType.FIELD -> AllIcons.Nodes.Field
JavaPsiUtils.ServiceParameterType.CONSTRUCTOR_PARAMETER -> AllIcons.Nodes.Constructor
JavaPsiUtils.ServiceParameterType.METHOD -> AllIcons.Nodes.Method
}
))
}
}
}
}
)
}
}
50 changes: 50 additions & 0 deletions src/main/kotlin/oap/application/plugin/psi/impl/JavaPsiUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package oap.application.plugin.psi.impl

import com.intellij.lang.jvm.JvmParameter
import com.intellij.openapi.util.Key
import com.intellij.psi.*
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiTreeUtil
import oap.application.plugin.gen.psi.OapModuleServicesService
import oap.application.plugin.psi.OapClassValueMixin
import oap.application.plugin.psi.impl.JavaPsiUtils.ServiceParameterType.*

object JavaPsiUtils {
fun findParameters(serviceIn: PsiElement): List<ServiceParameter> {
val service: OapModuleServicesService? = PsiTreeUtil.getParentOfType(serviceIn, OapModuleServicesService::class.java)
val psiClass: PsiClass? = (service?.moduleServicesServiceImplementation?.classNamePsi as? OapClassValueMixin)?.getPsiClass()
if (psiClass != null) {
return CachedValuesManager.getCachedValue(psiClass, Key("Class Parameters")) {
val ret = ArrayList<ServiceParameter>()

val psiMethods: List<PsiMethod> = psiClass.methods.filter { m -> m.name.startsWith("set") && m.parameterList.parametersCount == 1 }

val parameters: List<JvmParameter> = psiClass.constructors.flatMap { c -> c.parameters.filter { c -> c.name != null } }

val fields: List<PsiField> = psiClass.allFields.filter { !it.hasModifierProperty(PsiModifier.FINAL) }

psiMethods.forEach { m -> ret.add(ServiceParameter(m.name.substring(3).replaceFirstChar { it.lowercaseChar() }, METHOD)) }
parameters.forEach { c -> ret.add(ServiceParameter(c.name!!, CONSTRUCTOR_PARAMETER)) }
fields.forEach { f -> ret.add(ServiceParameter(f.name, FIELD)) }

var dependencies: List<PsiElement> = emptyList()

dependencies += psiMethods;
dependencies += parameters.mapNotNull { it.sourceElement };
dependencies += fields;

CachedValueProvider.Result.create(ret, dependencies)
}

}

return listOf()
}

enum class ServiceParameterType {
METHOD, CONSTRUCTOR_PARAMETER, FIELD
}

class ServiceParameter(val name: String, val type: ServiceParameterType)
}
1 change: 1 addition & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

<completion.contributor language="OAP" implementationClass="oap.application.plugin.completion.OapReferenceCompletionContributor" order="first"/>
<completion.contributor language="OAP" implementationClass="oap.application.plugin.completion.OapKeywordCompletionContributor" order="last"/>
<completion.contributor language="OAP" implementationClass="oap.application.plugin.completion.OapParameterCompletionContributor" order="last"/>
<psi.referenceContributor implementation="oap.application.plugin.ref.OapReferenceContributor" language="OAP"/>
<psi.referenceContributor
language="OAP"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package oap.application.plugin.completion

import com.intellij.codeInsight.completion.CompletionType
import oap.application.plugin.OapFixtureTestCase
import java.io.File

class OapParametersCompletionTest : OapFixtureTestCase() {
override fun getBasePath(): String {
return "completion"
}

override fun getTestDataPath(): String {
return File("src/test/java").absolutePath
}

fun testParameterName() {
myFixture.configureByFile("oap/application/plugin/TestJavaService.java")

myFixture.configureByText(
"testParameterName.oap", """
name = test

services {
test-service {
implementation = oap.application.plugin.TestJavaService
parameters {
<caret>
}
}
}
""".trimIndent()
)
myFixture.complete(CompletionType.BASIC)

assertSameElements(
myFixture.lookupElementStrings!!,
"constructor1StringField", "constructor2IntField", "constructor2StringField", "integerField", "intField", "privateStringField", "setterMethodString", "stringField"
)
}
}