Skip to content

Commit 2f1a40a

Browse files
committed
Use multi host injector for Kotlin injection (KT-6610)
#KT-6610 In Progress
1 parent 0551659 commit 2f1a40a

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

idea/src/META-INF/injection.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<idea-plugin>
22
<extensions defaultExtensionNs="com.intellij">
3-
<languageInjector implementation="org.jetbrains.kotlin.idea.injection.KotlinLanguageInjector"/>
3+
<multiHostInjector implementation="org.jetbrains.kotlin.idea.injection.KotlinLanguageInjector"/>
44

55
<regExpLanguageHost forClass="org.jetbrains.kotlin.psi.KtStringTemplateExpression"
66
implementationClass="com.intellij.psi.impl.JavaRegExpHost"/>

idea/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjector.kt

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
package org.jetbrains.kotlin.idea.injection
1818

1919
import com.intellij.codeInsight.AnnotationUtil
20+
import com.intellij.lang.injection.MultiHostInjector
21+
import com.intellij.lang.injection.MultiHostRegistrar
2022
import com.intellij.openapi.progress.ProgressManager
2123
import com.intellij.openapi.project.Project
22-
import com.intellij.openapi.util.TextRange
23-
import com.intellij.psi.*
24+
import com.intellij.psi.PsiAnnotation
25+
import com.intellij.psi.PsiElement
26+
import com.intellij.psi.PsiMethod
27+
import com.intellij.psi.PsiReference
2428
import com.intellij.psi.search.LocalSearchScope
2529
import com.intellij.psi.search.searches.ReferencesSearch
2630
import com.intellij.psi.util.PsiTreeUtil
@@ -40,7 +44,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
4044
import java.util.*
4145
import kotlin.collections.ArrayList
4246

43-
class KotlinLanguageInjector : LanguageInjector {
47+
class KotlinLanguageInjector : MultiHostInjector {
4448
companion object {
4549
private val STRING_LITERALS_REGEXP = "\"([^\"]*)\"".toRegex()
4650
}
@@ -49,16 +53,22 @@ class KotlinLanguageInjector : LanguageInjector {
4953
ArrayList(InjectorUtils.getActiveInjectionSupports()).filterIsInstance(KotlinLanguageInjectionSupport::class.java).firstOrNull()
5054
}
5155

52-
override fun getLanguagesToInject(host: PsiLanguageInjectionHost, injectionPlacesRegistrar: InjectedLanguagePlaces) {
53-
if (!host.isValidHost) return
54-
val ktHost: KtElement = host as? KtElement ?: return
56+
override fun getLanguagesToInject(registrar: MultiHostRegistrar, context: PsiElement) {
57+
val ktHost: KtStringTemplateExpression = context as? KtStringTemplateExpression ?: return
58+
if (!context.isValidHost) return
59+
60+
val support = kotlinSupport ?: return
5561

5662
if (!ProjectRootsUtil.isInProjectOrLibSource(ktHost)) return
5763

58-
val injectionInfo = findInjectionInfo(host) ?: return
64+
val injectionInfo = findInjectionInfo(context) ?: return
65+
InjectorUtils.getLanguageByString(injectionInfo.languageId) ?: return
66+
67+
InjectorUtils.registerInjectionSimple(ktHost, injectionInfo.toBaseInjection(support)!!, support, registrar)
68+
}
5969

60-
val language = InjectorUtils.getLanguageByString(injectionInfo.languageId) ?: return
61-
injectionPlacesRegistrar.addPlace(language, TextRange.from(0, ktHost.textLength), injectionInfo.prefix, injectionInfo.suffix)
70+
override fun elementsToInjectIn(): List<Class<out PsiElement>> {
71+
return listOf(KtStringTemplateExpression::class.java)
6272
}
6373

6474
private fun findInjectionInfo(place: KtElement, originalHost: Boolean = true): InjectionInfo? {
@@ -226,7 +236,24 @@ class KotlinLanguageInjector : LanguageInjector {
226236
return Configuration.getProjectInstance(project).advancedConfiguration.dfaOption == Configuration.DfaOption.OFF
227237
}
228238

229-
private class InjectionInfo(val languageId: String?, val prefix: String?, val suffix: String?)
239+
private class InjectionInfo(val languageId: String?, val prefix: String?, val suffix: String?) {
240+
fun toBaseInjection(injectionSupport: KotlinLanguageInjectionSupport): BaseInjection? {
241+
if (languageId == null) return null
242+
243+
val baseInjection = BaseInjection(injectionSupport.id)
244+
baseInjection.injectedLanguageId = languageId
245+
246+
if (prefix != null) {
247+
baseInjection.prefix = prefix
248+
}
249+
250+
if (suffix != null) {
251+
baseInjection.suffix = suffix
252+
}
253+
254+
return baseInjection
255+
}
256+
}
230257

231258
private fun processAnnotationInjectionInner(annotations: Array<PsiAnnotation>): InjectionInfo? {
232259
val id = AnnotationUtilEx.calcAnnotationValue(annotations, "value")

0 commit comments

Comments
 (0)