diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 2a8d2c3e9cb..68e642296d0 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -2729,6 +2729,8 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinColorSettingsPage.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinColorSettingsPage.kt index 0e088747543..6ccc1e0e61e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinColorSettingsPage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinColorSettingsPage.kt @@ -26,6 +26,7 @@ import com.intellij.openapi.options.colors.RainbowColorSettingsPage import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.idea.highlighter.dsl.DslHighlighterExtension import java.lang.reflect.Modifier import java.util.* @@ -109,6 +110,9 @@ var globalCounterglobalCounter description to key }.toTypedArray() } override fun getColorDescriptors(): Array = ColorDescriptor.EMPTY_ARRAY diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/dsl/DslHighlighterExtension.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/dsl/DslHighlighterExtension.kt new file mode 100644 index 00000000000..7a23638be30 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/dsl/DslHighlighterExtension.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.highlighter.dsl + +import com.intellij.openapi.editor.colors.TextAttributesKey +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.idea.highlighter.HighlighterExtension +import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import kotlin.math.absoluteValue + +class DslHighlighterExtension : HighlighterExtension() { + override fun highlightDeclaration(elementToHighlight: PsiElement, descriptor: DeclarationDescriptor): TextAttributesKey? { + return null + } + + override fun highlightCall(elementToHighlight: PsiElement, resolvedCall: ResolvedCall<*>): TextAttributesKey? { + val markerAnnotationFqName = markerAnnotationFqName(resolvedCall) ?: return null + return styleForDsl(markerAnnotationFqName) + } + + private fun markerAnnotationFqName(resolvedCall: ResolvedCall<*>): FqName? { + val markerAnnotation = resolvedCall.resultingDescriptor.annotations.find { annotation -> + annotation.annotationClass?.isDslHighlightingMarker() ?: false + } + + return markerAnnotation?.fqName + } + + companion object { + private const val numStyles = 5 + + private val styles = (1..numStyles).map { index -> + TextAttributesKey.createTextAttributesKey("KOTLIN_DSL_STYLE$index", KotlinHighlightingColors.KEYWORD) + } + + val descriptionsToStyles = (1..numStyles).associate { index -> + "Dsl//Style$index" to styles[index - 1] + } + + private fun styleForDsl(markerAnnotationFqName: FqName) = + styles[(markerAnnotationFqName.asString().hashCode() % numStyles).absoluteValue] + } +} + +internal fun ClassDescriptor.isDslHighlightingMarker(): Boolean { + return annotations.any { + it.annotationClass?.fqNameSafe?.asString() == "kotlin.DslMarker" + } +}