[kotlin] Rework before resolve highlighting visitor for better injected files support

#KTIJ-28361
#KTIJ-17011

GitOrigin-RevId: f95bbc66f6870894b604a1a9ddb89e1279d02053
This commit is contained in:
Vladimir Dolzhenko
2024-10-04 21:36:14 +02:00
committed by intellij-monorepo-bot
parent 5db74b516f
commit 54d0614034
14 changed files with 184 additions and 39 deletions

View File

@@ -175,6 +175,11 @@ public abstract class K2HighlightingMetaInfoTestGenerated extends AbstractK2High
runTest("../../idea/tests/testData/highlighterMetaInfo/jvm/KotlinInjection.kt");
}
@TestMetadata("KotlinSimpleInjection.kt")
public void testKotlinSimpleInjection() throws Exception {
runTest("../../idea/tests/testData/highlighterMetaInfo/jvm/KotlinSimpleInjection.kt");
}
@TestMetadata("NonExistingKotlinMethodFromJava.kt")
public void testNonExistingKotlinMethodFromJava() throws Exception {
runTest("../../idea/tests/testData/highlighterMetaInfo/jvm/NonExistingKotlinMethodFromJava.kt");

View File

@@ -2,30 +2,38 @@
package org.jetbrains.kotlin.idea.base.highlighting
import com.intellij.codeHighlighting.*
import com.intellij.codeHighlighting.TextEditorHighlightingPass
import com.intellij.codeHighlighting.TextEditorHighlightingPassFactory
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiRecursiveElementVisitor
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.highlighter.visitor.AbstractHighlightingVisitor
import org.jetbrains.kotlin.idea.highlighter.AbstractHighlightingPassBase
import org.jetbrains.kotlin.idea.highlighter.BeforeResolveHighlightingVisitor
import org.jetbrains.kotlin.idea.highlighter.visitor.AbstractHighlightingVisitor
@ApiStatus.Internal
interface BeforeResolveHighlightingExtension {
fun createVisitor(holder: HighlightInfoHolder): AbstractHighlightingVisitor
companion object {
val EP_NAME: ExtensionPointName<BeforeResolveHighlightingExtension> =
ExtensionPointName.create<BeforeResolveHighlightingExtension>("org.jetbrains.kotlin.beforeResolveHighlightingVisitor")
}
}
class KotlinBeforeResolveHighlightingPass(file: PsiFile, document: Document) : AbstractHighlightingPassBase(file, document) {
override fun runAnnotatorWithContext(element: PsiElement, holder: HighlightInfoHolder) {
val visitor = BeforeResolveHighlightingVisitor(holder)
val extensions = EP_NAME.extensionList.map { it.createVisitor(holder) }
val extensions = BeforeResolveHighlightingExtension.EP_NAME.extensionList.map { it.createVisitor(holder) }
element.accept(object : PsiRecursiveElementVisitor() {
override fun visitElement(element: PsiElement) {
element.accept(visitor)
extensions.forEach(element::accept)
super.visitElement(element)
}
@@ -38,25 +46,4 @@ class KotlinBeforeResolveHighlightingPass(file: PsiFile, document: Document) : A
return KotlinBeforeResolveHighlightingPass(file, editor.document)
}
}
class Registrar : TextEditorHighlightingPassFactoryRegistrar {
override fun registerHighlightingPassFactory(registrar: TextEditorHighlightingPassRegistrar, project: Project) {
registrar.registerTextEditorHighlightingPass(
Factory(),
/* anchor = */ TextEditorHighlightingPassRegistrar.Anchor.BEFORE,
/* anchorPassId = */ Pass.UPDATE_FOLDING,
/* needAdditionalIntentionsPass = */ false,
/* inPostHighlightingPass = */ false
)
}
}
companion object {
val EP_NAME = ExtensionPointName.create<BeforeResolveHighlightingExtension>("org.jetbrains.kotlin.beforeResolveHighlightingVisitor")
}
}
@ApiStatus.Internal
interface BeforeResolveHighlightingExtension {
fun createVisitor(holder: HighlightInfoHolder): AbstractHighlightingVisitor
}

View File

@@ -0,0 +1,42 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.base.highlighting
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.project.DumbAware
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.idea.base.highlighting.BeforeResolveHighlightingExtension.Companion.EP_NAME
import org.jetbrains.kotlin.psi.KtCommonFile
@ApiStatus.Internal
class KotlinBeforeResolveHighlightingVisitor: HighlightVisitor, DumbAware {
private var visitors: List<PsiElementVisitor>? = null
override fun suitableForFile(file: PsiFile): Boolean =
@Suppress("DEPRECATION")
file is KtCommonFile
override fun visit(element: PsiElement) {
visitors?.forEach(element::accept)
}
override fun analyze(
file: PsiFile,
updateWholeFile: Boolean,
holder: HighlightInfoHolder,
action: Runnable
): Boolean {
try {
visitors = EP_NAME.extensionList.map { it.createVisitor(holder) }
action.run()
} finally {
visitors = null
}
return true
}
override fun clone(): HighlightVisitor = KotlinBeforeResolveHighlightingVisitor()
}

View File

@@ -6,9 +6,11 @@ import com.intellij.codeHighlighting.RainbowHighlighter
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.base.highlighting.BeforeResolveHighlightingExtension
import org.jetbrains.kotlin.idea.highlighter.visitor.AbstractHighlightingVisitor
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
@@ -18,7 +20,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
class BeforeResolveHighlightingVisitor(holder: HighlightInfoHolder) : AbstractHighlightingVisitor(holder) {
class BeforeResolveHighlightingVisitor(holder: HighlightInfoHolder) : AbstractHighlightingVisitor(holder), DumbAware {
override fun visitElement(element: PsiElement) {
val elementType = element.node.elementType
val attributes = when {
@@ -103,3 +105,8 @@ class BeforeResolveHighlightingVisitor(holder: HighlightInfoHolder) : AbstractHi
super.visitNamedFunction(function)
}
}
class BeforeResolveHighlightingExtension : BeforeResolveHighlightingExtension {
override fun createVisitor(holder: HighlightInfoHolder): AbstractHighlightingVisitor =
BeforeResolveHighlightingVisitor(holder)
}

View File

@@ -12,7 +12,6 @@
<defaultHighlightingSettingProvider implementation="org.jetbrains.kotlin.idea.highlighter.KotlinDefaultHighlightingSettingsProvider"/>
<highlightingPassFactory implementation="org.jetbrains.kotlin.idea.base.highlighting.KotlinBeforeResolveHighlightingPass$Registrar"/>
<problemHighlightFilter implementation="org.jetbrains.kotlin.idea.highlighter.KotlinProblemHighlightFilter"/>
<problemFileHighlightFilter implementation="org.jetbrains.kotlin.idea.base.highlighting.KotlinProblemFileHighlightFilter"/>
@@ -22,9 +21,11 @@
<additionalTextAttributes scheme="Default" file="colorScheme/Default_Kotlin.xml"/>
<additionalTextAttributes scheme="Darcula" file="colorScheme/Darcula_Kotlin.xml"/>
<highlightVisitor implementation="org.jetbrains.kotlin.idea.highlighter.KotlinRainbowVisitor"/>
<highlightVisitor implementation="org.jetbrains.kotlin.idea.base.highlighting.KotlinBeforeResolveHighlightingVisitor"/>
</extensions>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
<beforeResolveHighlightingVisitor implementation="org.jetbrains.kotlin.idea.highlighter.BeforeResolveHighlightingExtension"/>
<beforeResolveHighlightingVisitor implementation="org.jetbrains.kotlin.idea.base.highlighting.beforeResolve.DeclarationHighlightingExtension"/>
<beforeResolveHighlightingVisitor implementation="org.jetbrains.kotlin.idea.base.highlighting.beforeResolve.AnnotationsHighlightingExtension"/>
</extensions>

View File

@@ -3,6 +3,7 @@
package org.jetbrains.kotlin.idea.base.highlighting.beforeResolve
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.idea.base.highlighting.BeforeResolveHighlightingExtension
import org.jetbrains.kotlin.idea.highlighter.visitor.AbstractHighlightingVisitor
@@ -13,7 +14,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
internal class AnnotationEntryHighlightingVisitor(
holder: HighlightInfoHolder
) : AbstractHighlightingVisitor(holder) {
) : AbstractHighlightingVisitor(holder), DumbAware {
override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) {
val range = annotationEntry.getTextRangeToHighlight() ?: return
highlightName(annotationEntry.project, range, KotlinHighlightInfoTypeSemanticNames.ANNOTATION)

View File

@@ -3,6 +3,7 @@
package org.jetbrains.kotlin.idea.base.highlighting.beforeResolve
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.project.DumbAware
import com.intellij.psi.util.PsiUtilCore
import org.jetbrains.kotlin.idea.base.highlighting.BeforeResolveHighlightingExtension
import org.jetbrains.kotlin.idea.base.highlighting.textAttributesForClass
@@ -13,7 +14,7 @@ import org.jetbrains.kotlin.idea.highlighter.visitor.AbstractHighlightingVisitor
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
internal class DeclarationHighlightingVisitor(holder: HighlightInfoHolder) : AbstractHighlightingVisitor(holder) {
internal class DeclarationHighlightingVisitor(holder: HighlightInfoHolder) : AbstractHighlightingVisitor(holder), DumbAware {
override fun visitTypeAlias(typeAlias: KtTypeAlias) {
highlightNamedDeclaration(typeAlias, KotlinHighlightInfoTypeSemanticNames.TYPE_ALIAS)
super.visitTypeAlias(typeAlias)

View File

@@ -175,6 +175,11 @@ public abstract class K1HighlightingMetaInfoTestGenerated extends AbstractK1High
runTest("testData/highlighterMetaInfo/jvm/KotlinInjection.kt");
}
@TestMetadata("KotlinSimpleInjection.kt")
public void testKotlinSimpleInjection() throws Exception {
runTest("testData/highlighterMetaInfo/jvm/KotlinSimpleInjection.kt");
}
@TestMetadata("NonExistingKotlinMethodFromJava.kt")
public void testNonExistingKotlinMethodFromJava() throws Exception {
runTest("testData/highlighterMetaInfo/jvm/NonExistingKotlinMethodFromJava.kt");

View File

@@ -8,7 +8,7 @@
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>infix<!> <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@Language<!>("kotlin") fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>String<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>xml2<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@Language<!>("kotlin") <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PARAMETER'")!>content<!>: <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>String<!>){}
fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>main<!>() {
"foo" <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml<!> "fun foo() {}"
"foo".<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml<!>("fun foo() {}")
"fun bar() {}" <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml2<!> "fun foo() {}"
"foo" <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml<!> "fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>foo<!>() {}"
"foo".<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml<!>("fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>foo<!>() {}")
"fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>bar<!>() {}" <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_EXTENSION_FUNCTION_CALL'")!>xml2<!> "fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>foo<!>() {}"
}

View File

@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// CHECK_SYMBOL_NAMES
// HIGHLIGHTER_ATTRIBUTES_KEY
package language_injection
@@ -6,4 +5,28 @@ package language_injection
import org.intellij.lang.annotations.Language
@Language("kotlin")
val test = "fun test2() {}"
val test = """
internal class Foo: Bar() {
private val name: String = "Kodee"
lateinit var way: Path
fun doFun() {
var count = 0
for21@ for (t in pc) {
while (count < 21) {
print(message = "Hello, ")
println(name)
count++
// I meant to type `continue@for21`.
continue@for21
}
}
}
companion object {
@JvmStatic
val globalProperty = 42
}
}
"""

View File

@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// CHECK_SYMBOL_NAMES
// HIGHLIGHTER_ATTRIBUTES_KEY
package language_injection
@@ -6,4 +5,28 @@ package language_injection
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_KEYWORD'")!>import<!> org.intellij.lang.annotations.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>Language<!>
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@Language<!>("kotlin")
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PACKAGE_PROPERTY'")!>test<!> = "fun test2() {}"
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PACKAGE_PROPERTY'")!>test<!> = """
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>internal<!> class <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>Foo<!>: <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CONSTRUCTOR'")!>Bar<!>() {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>private<!> val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>name<!>: <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>String<!> = "Kodee"
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>lateinit<!> var <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>way<!>: Path
fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>doFun<!>() {
var <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!> = 0
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LABEL'")!>for21@<!> for (<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PARAMETER'")!>t<!> in pc) {
while (<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!> < 21) {
print(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_NAMED_ARGUMENT'")!>message =<!> "Hello, ")
println(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>name<!>)
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!>++
// I meant to type `continue@for21`.
continue<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LABEL'")!>@for21<!>
}
}
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>companion<!> object {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@JvmStatic<!>
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>globalProperty<!> = 42
}
}
"""

View File

@@ -0,0 +1,32 @@
// CHECK_SYMBOL_NAMES
// HIGHLIGHTER_ATTRIBUTES_KEY
package language_injection
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_KEYWORD'")!>import<!> org.intellij.lang.annotations.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>Language<!>
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@Language<!>("kotlin")
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PACKAGE_PROPERTY'")!>test<!> = """
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>internal<!> class <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>Foo<!>: <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CONSTRUCTOR'")!>Bar<!>() {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>private<!> val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>name<!>: <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_CLASS'")!>String<!> = "Kodee"
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>lateinit<!> var <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>way<!>: Path
fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>doFun<!>() {
var <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!> = 0
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LABEL'")!>for21@<!> for (<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PARAMETER'")!>t<!> in pc) {
while (<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!> < 21) {
print(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_NAMED_ARGUMENT'")!>message =<!> "Hello, ")
println(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>name<!>)
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LOCAL_VARIABLE'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_MUTABLE_VARIABLE'")!>count<!>++
// I meant to type `continue@for21`.
continue<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_LABEL'")!>@for21<!>
}
}
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_BUILTIN_ANNOTATION'")!>companion<!> object {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@JvmStatic<!>
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_INSTANCE_PROPERTY'")!>globalProperty<!> = 42
}
}
"""

View File

@@ -0,0 +1,9 @@
// FIR_IDENTICAL
// CHECK_SYMBOL_NAMES
// HIGHLIGHTER_ATTRIBUTES_KEY
package language_injection
import org.intellij.lang.annotations.Language
@Language("kotlin")
val test = "fun test2() {}"

View File

@@ -0,0 +1,9 @@
// FIR_IDENTICAL
// CHECK_SYMBOL_NAMES
// HIGHLIGHTER_ATTRIBUTES_KEY
package language_injection
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_KEYWORD'")!>import<!> org.intellij.lang.annotations.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>Language<!>
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_ANNOTATION'")!>@Language<!>("kotlin")
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_PACKAGE_PROPERTY'")!>test<!> = "fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; highlightingTextAttributesKey='KOTLIN_FUNCTION_DECLARATION'")!>test2<!>() {}"