Inject predefined places through usages
This commit is contained in:
@@ -20,6 +20,8 @@ import com.intellij.openapi.progress.ProgressManager
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
|
import com.intellij.psi.search.LocalSearchScope
|
||||||
|
import com.intellij.psi.search.searches.ReferencesSearch
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.intellij.plugins.intelliLang.Configuration
|
import org.intellij.plugins.intelliLang.Configuration
|
||||||
import org.intellij.plugins.intelliLang.inject.InjectorUtils
|
import org.intellij.plugins.intelliLang.inject.InjectorUtils
|
||||||
@@ -37,16 +39,19 @@ class KotlinLanguageInjector : LanguageInjector {
|
|||||||
if (!host.isValidHost) return
|
if (!host.isValidHost) return
|
||||||
val ktHost: KtElement = host as? KtElement ?: return
|
val ktHost: KtElement = host as? KtElement ?: return
|
||||||
|
|
||||||
val injectionInfo =
|
val injectionInfo = findInjectionInfo(host) ?: return
|
||||||
injectWithExplicitCodeInstruction(ktHost)
|
|
||||||
?: injectWithCall(ktHost)
|
|
||||||
?: injectWithReceiver(ktHost)
|
|
||||||
?: return
|
|
||||||
|
|
||||||
val language = InjectorUtils.getLanguageByString(injectionInfo.languageId) ?: return
|
val language = InjectorUtils.getLanguageByString(injectionInfo.languageId) ?: return
|
||||||
injectionPlacesRegistrar.addPlace(language, TextRange.from(0, ktHost.textLength), injectionInfo.prefix, injectionInfo.suffix)
|
injectionPlacesRegistrar.addPlace(language, TextRange.from(0, ktHost.textLength), injectionInfo.prefix, injectionInfo.suffix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun findInjectionInfo(place: KtElement): InjectionInfo? {
|
||||||
|
return injectWithExplicitCodeInstruction(place)
|
||||||
|
?: injectWithCall(place)
|
||||||
|
?: injectWithReceiver(place)
|
||||||
|
?: injectWithVariableUsage(place)
|
||||||
|
}
|
||||||
|
|
||||||
private fun injectWithExplicitCodeInstruction(host: KtElement): InjectionInfo? {
|
private fun injectWithExplicitCodeInstruction(host: KtElement): InjectionInfo? {
|
||||||
val support = kotlinSupport ?: return null
|
val support = kotlinSupport ?: return null
|
||||||
val languageId = support.findAnnotationInjectionLanguageId(host) ?: return null
|
val languageId = support.findAnnotationInjectionLanguageId(host) ?: return null
|
||||||
@@ -77,6 +82,20 @@ class KotlinLanguageInjector : LanguageInjector {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun injectWithVariableUsage(host: KtElement): InjectionInfo? {
|
||||||
|
val ktHost: KtElement = host
|
||||||
|
val ktProperty = host.parent as? KtProperty?: return null
|
||||||
|
if (ktProperty.initializer != host) return null
|
||||||
|
|
||||||
|
if (isAnalyzeOff(ktHost.project)) return null
|
||||||
|
|
||||||
|
val searchScope = LocalSearchScope(arrayOf(ktProperty.containingFile), "", true)
|
||||||
|
return ReferencesSearch.search(ktProperty, searchScope).asSequence().mapNotNull { psiReference ->
|
||||||
|
val element = psiReference.element as? KtElement ?: return@mapNotNull null
|
||||||
|
findInjectionInfo(element)
|
||||||
|
}.firstOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
private fun injectWithCall(host: KtElement): InjectionInfo? {
|
private fun injectWithCall(host: KtElement): InjectionInfo? {
|
||||||
val ktHost: KtElement = host
|
val ktHost: KtElement = host
|
||||||
val argument = ktHost.parent as? KtValueArgument ?: return null
|
val argument = ktHost.parent as? KtValueArgument ?: return null
|
||||||
|
|||||||
@@ -82,6 +82,20 @@ class KotlinInjectionTest : AbstractInjectionTest() {
|
|||||||
|val test = "<caret>simple"
|
|val test = "<caret>simple"
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
fun testInjectionWithUsageOnReceiverWithRuntime() = testInjectionPresent(
|
||||||
|
"""
|
||||||
|
|val test = "<caret>some"
|
||||||
|
|fun foo() = test.toRegex()
|
||||||
|
""",
|
||||||
|
languageId = RegExpLanguage.INSTANCE.id, unInjectShouldBePresent = false)
|
||||||
|
|
||||||
|
fun testInjectionWithUsageInParameterWithRuntime() = testInjectionPresent(
|
||||||
|
"""
|
||||||
|
|val test = "<caret>some"
|
||||||
|
|fun foo() = Regex(test)
|
||||||
|
""",
|
||||||
|
languageId = RegExpLanguage.INSTANCE.id, unInjectShouldBePresent = false)
|
||||||
|
|
||||||
fun testInjectionWithMultipleCommentsOnFun() = testInjectionPresent(
|
fun testInjectionWithMultipleCommentsOnFun() = testInjectionPresent(
|
||||||
"""
|
"""
|
||||||
|// Some comment
|
|// Some comment
|
||||||
|
|||||||
Reference in New Issue
Block a user