17
17
package org.jetbrains.kotlin.idea.injection
18
18
19
19
import com.intellij.codeInsight.AnnotationUtil
20
+ import com.intellij.lang.injection.MultiHostInjector
21
+ import com.intellij.lang.injection.MultiHostRegistrar
20
22
import com.intellij.openapi.progress.ProgressManager
21
23
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
24
28
import com.intellij.psi.search.LocalSearchScope
25
29
import com.intellij.psi.search.searches.ReferencesSearch
26
30
import com.intellij.psi.util.PsiTreeUtil
@@ -40,7 +44,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
40
44
import java.util.*
41
45
import kotlin.collections.ArrayList
42
46
43
- class KotlinLanguageInjector : LanguageInjector {
47
+ class KotlinLanguageInjector : MultiHostInjector {
44
48
companion object {
45
49
private val STRING_LITERALS_REGEXP = " \" ([^\" ]*)\" " .toRegex()
46
50
}
@@ -49,16 +53,22 @@ class KotlinLanguageInjector : LanguageInjector {
49
53
ArrayList (InjectorUtils .getActiveInjectionSupports()).filterIsInstance(KotlinLanguageInjectionSupport ::class .java).firstOrNull()
50
54
}
51
55
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
55
61
56
62
if (! ProjectRootsUtil .isInProjectOrLibSource(ktHost)) return
57
63
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
+ }
59
69
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 )
62
72
}
63
73
64
74
private fun findInjectionInfo (place : KtElement , originalHost : Boolean = true): InjectionInfo ? {
@@ -226,7 +236,24 @@ class KotlinLanguageInjector : LanguageInjector {
226
236
return Configuration .getProjectInstance(project).advancedConfiguration.dfaOption == Configuration .DfaOption .OFF
227
237
}
228
238
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
+ }
230
257
231
258
private fun processAnnotationInjectionInner (annotations : Array <PsiAnnotation >): InjectionInfo ? {
232
259
val id = AnnotationUtilEx .calcAnnotationValue(annotations, " value" )
0 commit comments