Inject with suffix and prefix arguments in annotations (KT-26584)

#KT-26584 Fixed
This commit is contained in:
Nikolay Krasko
2018-09-05 20:28:46 +03:00
parent 690762d46c
commit 91308508bd
3 changed files with 24 additions and 6 deletions
@@ -372,7 +372,10 @@ class KotlinLanguageInjector(
val injectAnnotation = annotated.annotations.findAnnotation(FqName(AnnotationUtil.LANGUAGE)) ?: return null
val languageId = injectAnnotation.argumentValue("value")?.safeAs<StringValue>()?.value ?: return null
return InjectionInfo(languageId, null, null)
val prefix = injectAnnotation.argumentValue("prefix")?.safeAs<StringValue>()?.value
val suffix = injectAnnotation.argumentValue("suffix")?.safeAs<StringValue>()?.value
return InjectionInfo(languageId, prefix, suffix)
}
private fun findInjection(element: PsiElement?, injections: List<BaseInjection>): InjectionInfo? {
@@ -172,11 +172,11 @@ class KotlinLanguageInjector(
private fun findInjectionInfo(place: KtElement, originalHost: Boolean = true): InjectionInfo? {
return injectWithExplicitCodeInstruction(place)
?: injectWithCall(place)
?: injectWithCall(place)
?: injectReturnValue(place)
?: injectInAnnotationCall(place)
?: injectWithReceiver(place)
?: injectWithVariableUsage(place, originalHost)
?: injectInAnnotationCall(place)
?: injectWithReceiver(place)
?: injectWithVariableUsage(place, originalHost)
}
private fun injectReturnValue(place: KtElement): InjectionInfo? {
@@ -368,7 +368,10 @@ class KotlinLanguageInjector(
val injectAnnotation = annotated.annotations.findAnnotation(FqName(AnnotationUtil.LANGUAGE)) ?: return null
val languageId = injectAnnotation.argumentValue("value")?.safeAs<StringValue>()?.value ?: return null
return InjectionInfo(languageId, null, null)
val prefix = injectAnnotation.argumentValue("prefix")?.safeAs<StringValue>()?.value
val suffix = injectAnnotation.argumentValue("suffix")?.safeAs<StringValue>()?.value
return InjectionInfo(languageId, prefix, suffix)
}
private fun findInjection(element: PsiElement?, injections: List<BaseInjection>): InjectionInfo? {
@@ -425,6 +425,18 @@ class KotlinInjectionTest : AbstractInjectionTest() {
shreds = listOf(ShredInfo(range(0, 9), hostRange=range(1, 4), prefix = "abc", suffix = "ghi"))
)
fun testSuffixPrefixWithCallWithAnnotation() = doInjectionPresentTest(
"""
fun highlight(@org.intellij.lang.annotations.Language("TEXT", prefix = "fun __f(it: dynamic) = ", suffix = ";") code: String) {}
fun test() {
highlight("<caret>it > 0")
}
""",
languageId = PlainTextLanguage.INSTANCE.id, unInjectShouldBePresent = false,
shreds = listOf(ShredInfo(range(0, 30), hostRange = range(1, 7), prefix = "fun __f(it: dynamic) = ", suffix = ";"))
)
fun testSuffixPrefixInComment() = doInjectionPresentTest(
"""
// language="TEXT" prefix="abc" suffix=ghi