diff --git a/.idea/dictionaries/Nikolay_Krasko.xml b/.idea/dictionaries/Nikolay_Krasko.xml
index 97c56608a7b..3ad9cc2cc0a 100644
--- a/.idea/dictionaries/Nikolay_Krasko.xml
+++ b/.idea/dictionaries/Nikolay_Krasko.xml
@@ -10,6 +10,7 @@
infos
intrinsics
kdoc
+ lateinit
memoize
memoized
multiline
@@ -23,6 +24,7 @@
subclassed
subgraph
substep
+ tailrec
\ No newline at end of file
diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt
index 64bbe108eff..045919dd140 100644
--- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt
@@ -31,6 +31,8 @@ import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.descriptors.*
+import org.jetbrains.kotlin.idea.DocumentationURLs.LATE_INITIALIZED_PROPERTIES_AND_VARIABLES_URL
+import org.jetbrains.kotlin.idea.DocumentationURLs.TAIL_RECURSIVE_FUNCTIONS_URL
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
@@ -63,6 +65,14 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.addToStdlib.constant
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
+private object DocumentationURLs {
+ const val LATE_INITIALIZED_PROPERTIES_AND_VARIABLES_URL =
+ "http://kotlinlang.org/docs/reference/properties.html#late-initialized-properties-and-variables"
+
+ const val TAIL_RECURSIVE_FUNCTIONS_URL =
+ "http://kotlinlang.org/docs/reference/functions.html#tail-recursive-functions"
+}
+
class HtmlClassifierNamePolicy(val base: ClassifierNamePolicy) : ClassifierNamePolicy {
override fun renderClassifier(classifier: ClassifierDescriptor, renderer: DescriptorRenderer): String {
if (DescriptorUtils.isAnonymousObject(classifier)) {
@@ -281,8 +291,17 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
return renderKotlinDeclaration(origin, quickNavigation)
} else if (element.isModifier()) {
when(element.text) {
- KtTokens.LATEINIT_KEYWORD.value -> return """lateinit allows initializing a non-null property outside of a constructor"""
- KtTokens.TAILREC_KEYWORD.value -> return """tailrec marks a function as tail-recursive (allowing the compiler to replace recursion with iteration)"""
+ KtTokens.LATEINIT_KEYWORD.value -> {
+ return "lateinit allows initializing a ${a(
+ LATE_INITIALIZED_PROPERTIES_AND_VARIABLES_URL,
+ "non-null property outside of a constructor"
+ )}"
+ }
+
+ KtTokens.TAILREC_KEYWORD.value -> {
+ return "tailrec marks a function as ${a(TAIL_RECURSIVE_FUNCTIONS_URL, "tail-recursive")} " +
+ "(allowing the compiler to replace recursion with iteration)"
+ }
}
}
@@ -383,7 +402,6 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
}
}
-
private fun StringBuilder.renderDefinition(descriptor: DeclarationDescriptor, renderer: DescriptorRenderer) {
if (!DescriptorUtils.isLocal(descriptor)) {
val containingDeclaration = descriptor.containingDeclaration
@@ -469,6 +487,10 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
wrap("<$tag>", "$tag>", body)
}
+ private fun a(url: String, text: String): String {
+ return """$text"""
+ }
+
private fun mixKotlinToJava(
declarationDescriptor: DeclarationDescriptor,
element: PsiElement,