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"
+ }
+}