diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt | 26 | ||||
-rw-r--r-- | core/src/main/kotlin/Formats/StructuredFormatService.kt | 20 | ||||
-rw-r--r-- | core/src/main/kotlin/Kotlin/DescriptorDocumentationParser.kt | 22 | ||||
-rw-r--r-- | core/src/main/kotlin/Model/Content.kt | 3 | ||||
-rw-r--r-- | core/testdata/format/website/overloadGroup.md | 2 | ||||
-rw-r--r-- | core/testdata/format/website/sample.md | 6 |
6 files changed, 52 insertions, 27 deletions
diff --git a/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt b/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt index bc9358ac..edae9976 100644 --- a/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt +++ b/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt @@ -30,11 +30,13 @@ class KotlinWebsiteOutputBuilder(to: StringBuilder, override fun appendStrikethrough(body: () -> Unit) = wrapInTag("s", body) - private fun div(to: StringBuilder, cssClass: String, block: () -> Unit) { - to.append("<div class=\"$cssClass\">") - insideDiv++ + private fun div(to: StringBuilder, cssClass: String, markdown: Boolean = false, block: () -> Unit) { + to.append("<div class=\"$cssClass\"") + if (markdown) to.append(" markdown=\"1\"") + to.append(">") + if (!markdown) insideDiv++ block() - insideDiv-- + if (!markdown) insideDiv-- to.append("</div>\n") } @@ -51,12 +53,18 @@ class KotlinWebsiteOutputBuilder(to: StringBuilder, } } + override fun appendSampleBlockCode(language: String, body: () -> Unit) { + div(to, "sample", true) { + appendBlockCode(language, body) + } + } + override fun appendAsOverloadGroup(to: StringBuilder, block: () -> Unit) { - to.append("<div class=\"overload-group\" markdown=\"1\">") - ensureParagraph() - block() - ensureParagraph() - to.append("</div>") + div(to, "overload-group", true) { + ensureParagraph() + block() + ensureParagraph() + } } override fun appendLink(href: String, body: () -> Unit) = wrap("<a href=\"$href\">", "</a>", body) diff --git a/core/src/main/kotlin/Formats/StructuredFormatService.kt b/core/src/main/kotlin/Formats/StructuredFormatService.kt index f24c9c2d..3bd06130 100644 --- a/core/src/main/kotlin/Formats/StructuredFormatService.kt +++ b/core/src/main/kotlin/Formats/StructuredFormatService.kt @@ -47,6 +47,7 @@ abstract class StructuredOutputBuilder(val to: StringBuilder, protected abstract fun ensureParagraph() + open fun appendSampleBlockCode(language: String, body: () -> Unit) = appendBlockCode(language, body) abstract fun appendBlockCode(language: String, body: () -> Unit) abstract fun appendHeader(level: Int = 1, body: () -> Unit) abstract fun appendParagraph(body: () -> Unit) @@ -143,13 +144,22 @@ abstract class StructuredOutputBuilder(val to: StringBuilder, } } - is ContentBlockCode -> appendBlockCode(content.language) { - for ((index, contentNode) in content.children.withIndex()) { - appendContent(contentNode) - if (index < content.children.size - 1) { - to.append("\n") + is ContentBlockSampleCode, is ContentBlockCode -> { + content as ContentBlockCode + fun appendBlockCodeContent() { + for ((index, contentNode) in content.children.withIndex()) { + appendContent(contentNode) + if (index < content.children.size - 1) { + to.append("\n") + } } } + when (content) { + is ContentBlockSampleCode -> + appendSampleBlockCode(content.language, ::appendBlockCodeContent) + is ContentBlockCode -> + appendBlockCode(content.language, ::appendBlockCodeContent) + } } is ContentHeading -> appendHeader(content.level) { appendContent(content.children) } is ContentBlock -> appendContent(content.children) diff --git a/core/src/main/kotlin/Kotlin/DescriptorDocumentationParser.kt b/core/src/main/kotlin/Kotlin/DescriptorDocumentationParser.kt index 941d071d..2fc268e8 100644 --- a/core/src/main/kotlin/Kotlin/DescriptorDocumentationParser.kt +++ b/core/src/main/kotlin/Kotlin/DescriptorDocumentationParser.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.kdoc.findKDoc import org.jetbrains.kotlin.idea.kdoc.getKDocLinkResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor @@ -60,10 +61,10 @@ class DescriptorDocumentationParser if (kdoc is KDocSection) { val tags = kdoc.getTags() tags.forEach { - when (it.name) { - "sample" -> + when (it.knownTag) { + KDocKnownTag.SAMPLE -> content.append(functionBody(descriptor, it.getSubjectName())) - "see" -> + KDocKnownTag.SEE -> content.addTagToSeeAlso(descriptor, it) else -> { val section = content.addSection(javadocSectionDisplayName(it.name), it.getSubjectName()) @@ -147,7 +148,7 @@ class DescriptorDocumentationParser private fun functionBody(descriptor: DeclarationDescriptor, functionName: String?): ContentNode { if (functionName == null) { logger.warn("Missing function name in @sample in ${descriptor.signature()}") - return ContentBlockCode().let() { it.append(ContentText("Missing function name in @sample")); it } + return ContentBlockSampleCode().let { it.append(ContentText("//Missing function name in @sample")); it } } val scope = getKDocLinkResolutionScope(resolutionFacade, descriptor) val rootPackage = resolutionFacade.moduleDescriptor.getPackage(FqName.ROOT) @@ -155,16 +156,16 @@ class DescriptorDocumentationParser val symbol = resolveInScope(functionName, scope) ?: resolveInScope(functionName, rootScope) if (symbol == null) { logger.warn("Unresolved function $functionName in @sample in ${descriptor.signature()}") - return ContentBlockCode().let() { it.append(ContentText("Unresolved: $functionName")); it } + return ContentBlockSampleCode().let { it.append(ContentText("//Unresolved: $functionName")); it } } val psiElement = DescriptorToSourceUtils.descriptorToDeclaration(symbol) if (psiElement == null) { logger.warn("Can't find source for function $functionName in @sample in ${descriptor.signature()}") - return ContentBlockCode().let() { it.append(ContentText("Source not found: $functionName")); it } + return ContentBlockSampleCode().let { it.append(ContentText("//Source not found: $functionName")); it } } val text = when (psiElement) { - is KtDeclarationWithBody -> ContentBlockCode().let() { + is KtDeclarationWithBody -> ContentBlockCode().let { val bodyExpression = psiElement.bodyExpression when (bodyExpression) { is KtBlockExpression -> bodyExpression.text.removeSurrounding("{", "}") @@ -174,10 +175,10 @@ class DescriptorDocumentationParser else -> psiElement.text } - val lines = text.trimEnd().split("\n".toRegex()).toTypedArray().filterNot { it.length == 0 } - val indent = lines.map { it.takeWhile { it.isWhitespace() }.count() }.min() ?: 0 + val lines = text.trimEnd().split("\n".toRegex()).toTypedArray().filterNot(String::isEmpty) + val indent = lines.map { it.takeWhile(Char::isWhitespace).count() }.min() ?: 0 val finalText = lines.map { it.drop(indent) }.joinToString("\n") - return ContentBlockCode("kotlin").let() { it.append(ContentText(finalText)); it } + return ContentBlockSampleCode().let { it.append(ContentText(finalText)); it } } private fun resolveInScope(functionName: String, scope: ResolutionScope): DeclarationDescriptor? { @@ -197,6 +198,7 @@ class DescriptorDocumentationParser symbol = null break } + @Suppress("IfThenToElvis") currentScope = if (partSymbol is ClassDescriptor) partSymbol.defaultType.memberScope else if (partSymbol is PackageViewDescriptor) diff --git a/core/src/main/kotlin/Model/Content.kt b/core/src/main/kotlin/Model/Content.kt index 0a38a524..fcf94c12 100644 --- a/core/src/main/kotlin/Model/Content.kt +++ b/core/src/main/kotlin/Model/Content.kt @@ -82,7 +82,8 @@ class ContentEmphasis() : ContentBlock() class ContentStrong() : ContentBlock() class ContentStrikethrough() : ContentBlock() class ContentCode() : ContentBlock() -class ContentBlockCode(val language: String = "") : ContentBlock() +open class ContentBlockCode(val language: String = "") : ContentBlock() +class ContentBlockSampleCode(language: String = "kotlin") : ContentBlockCode(language) abstract class ContentNodeLink() : ContentBlock() { abstract val node: DocumentationNode? diff --git a/core/testdata/format/website/overloadGroup.md b/core/testdata/format/website/overloadGroup.md index 81cb7822..d81f86bf 100644 --- a/core/testdata/format/website/overloadGroup.md +++ b/core/testdata/format/website/overloadGroup.md @@ -31,4 +31,4 @@ Spell ID for future casts **Return** Spell ID for future casts -</div>
\ No newline at end of file +</div> diff --git a/core/testdata/format/website/sample.md b/core/testdata/format/website/sample.md index 1a683da7..374303c0 100644 --- a/core/testdata/format/website/sample.md +++ b/core/testdata/format/website/sample.md @@ -14,6 +14,8 @@ layout: api Groups elements of the original sequence by the key returned by the given <a href="#">keySelector</a> function applied to each element and returns a map where each group key is associated with a list of corresponding elements. +<div class="sample" markdown="1"> + ``` kotlin if (true) { println(property) @@ -22,8 +24,10 @@ if (true) { </div> +</div> + <div class="overload-group" markdown="1"> <div class="signature"><code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="parameterName" id="$foo(kotlin.Int)/i">i</span><span class="symbol">:</span> <span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Int</span></code></div> -</div>
\ No newline at end of file +</div> |