diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/addToStdlib.kt b/compiler/util/src/org/jetbrains/kotlin/utils/addToStdlib.kt index e1dc44476d2..f6a66580a18 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/addToStdlib.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/addToStdlib.kt @@ -16,8 +16,10 @@ package org.jetbrains.kotlin.utils.addToStdlib +import java.lang.reflect.Modifier import java.util.Collections import java.util.NoSuchElementException +import java.util.concurrent.ConcurrentHashMap public fun T?.singletonOrEmptyList(): List = if (this != null) Collections.singletonList(this) else Collections.emptyList() @@ -75,4 +77,21 @@ public fun streamOfLazyValues(vararg elements: () -> T): Stream = element public fun Pair.swap(): Pair = Pair(second, first) -public fun T.check(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null \ No newline at end of file +public fun T.check(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null + +public fun constant(calculator: () -> T): T { + val cached = constantMap[calculator] + if (cached != null) return cached as T + + // safety check + val fields = calculator.javaClass.getDeclaredFields().filter { it.getModifiers().and(Modifier.STATIC) == 0 } + assert(fields.isEmpty()) { + "No fields in the passed lambda expected but ${fields.joinToString()} found" + } + + val value = calculator() + constantMap[calculator] = value + return value +} + +private val constantMap = ConcurrentHashMap, Any>() diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index 65e97937ff6..7dd5288fce6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.renderer.RenderingFormat import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.source.PsiSourceElement +import org.jetbrains.kotlin.utils.addToStdlib.constant public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { @@ -140,7 +141,7 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() private fun mixKotlinToJava(declarationDescriptor: DeclarationDescriptor, element: PsiElement, originalElement: PsiElement?): String? { val originalInfo = JavaDocumentationProvider().getQuickNavigateInfo(element, originalElement) if (originalInfo != null) { - val renderedDecl = MIX_KOTLIN_TO_JAVA_RENDERER.render(declarationDescriptor) + val renderedDecl = constant { DESCRIPTOR_RENDERER.withOptions { withDefinedIn = false } }.render(declarationDescriptor) return renderedDecl + "
Java declaration:
" + originalInfo }