From e1a3884fdce26bb28b7580627ffad0d69b8bed61 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 10 Feb 2015 18:55:12 +0100 Subject: more sane handling of overloads: don't duplicate signatures, show all documentation of a group of overloads with exactly the same documentation together --- src/Formats/StructuredFormatService.kt | 68 +++++++++++++++------------------- src/Model/Content.kt | 34 +++++++++++++++-- 2 files changed, 60 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/Formats/StructuredFormatService.kt b/src/Formats/StructuredFormatService.kt index ec4cff89..0a146d84 100644 --- a/src/Formats/StructuredFormatService.kt +++ b/src/Formats/StructuredFormatService.kt @@ -80,29 +80,37 @@ public abstract class StructuredFormatService(val locationService: LocationServi return FormatLink(to.name, locationService.relativeLocation(from, to, extension)) } - fun appendDescription(location: Location, to: StringBuilder, nodes: Iterable) { - val described = nodes.filter { it.hasDescriptionOrTags() } - if (described.any()) { - val single = described.size() == 1 - if (described.any { it.content.description != ContentEmpty }) { - appendHeader(to, "Description", 3) + fun appendDocumentation(location: Location, to: StringBuilder, overloads: Iterable) { + val breakdownBySummary = overloads.groupByTo(LinkedHashMap()) { node -> node.content } + + for ((summary, items) in breakdownBySummary) { + items.forEach { + appendBlockCode(to, formatText(location, languageService.render(it))) + it.appendOverrides(to) + it.appendDeprecation(to) + it.appendSourceLink(to) } - for (node in described) { - if (!single) { - appendBlockCode(to, formatText(location, languageService.render(node))) - } - appendLine(to, formatText(location, node.content.description)) - appendLine(to) + // All items have exactly the same documentation, so we can use any item to render it + val item = items.first() + appendLine(to, formatText(location, item.content.summary)) + appendLine(to) + appendDescription(location, to, item) + } + } - node.content.getSectionsWithSubjects().forEach { - appendSectionWithSubject(it.getKey(), location, it.getValue(), to) - } + fun appendDescription(location: Location, to: StringBuilder, node: DocumentationNode) { + if (node.content.description != ContentEmpty) { + appendHeader(to, "Description", 3) + appendLine(to, formatText(location, node.content.description)) + appendLine(to) + } + node.content.getSectionsWithSubjects().forEach { + appendSectionWithSubject(it.getKey(), location, it.getValue(), to) + } - for (section in node.content.sections.filter { it.subjectName == null }) { - appendLine(to, formatStrong(formatText(section.tag))) - appendLine(to, formatText(location, section)) - } - } + for (section in node.content.sections.filter { it.subjectName == null }) { + appendLine(to, formatStrong(formatText(section.tag))) + appendLine(to, formatText(location, section)) } } @@ -124,23 +132,6 @@ public abstract class StructuredFormatService(val locationService: LocationServi private fun DocumentationNode.hasDescriptionOrTags() = content.description != ContentEmpty || !content.sections.isEmpty() - fun appendSummary(location: Location, to: StringBuilder, nodes: Iterable) { - val breakdownBySummary = nodes.groupByTo(LinkedHashMap()) { node -> - formatText(location, node.summary) - } - - for ((summary, items) in breakdownBySummary) { - items.forEach { - appendBlockCode(to, formatText(location, languageService.render(it))) - it.appendOverrides(to) - it.appendDeprecation(to) - it.appendSourceLink(to) - } - appendLine(to, summary) - appendLine(to) - } - } - private fun DocumentationNode.appendOverrides(to: StringBuilder) { overrides.forEach { to.append("Overrides ") @@ -173,8 +164,7 @@ public abstract class StructuredFormatService(val locationService: LocationServi val breakdownByName = nodes.groupBy { node -> node.name } for ((name, items) in breakdownByName) { appendHeader(to, formatText(name)) - appendSummary(location, to, items) - appendDescription(location, to, items) + appendDocumentation(location, to, items) } } diff --git a/src/Model/Content.kt b/src/Model/Content.kt index 165865a0..f264d623 100644 --- a/src/Model/Content.kt +++ b/src/Model/Content.kt @@ -18,6 +18,12 @@ public open class ContentBlock() : ContentNode() { } fun isEmpty() = children.isEmpty() + + override fun equals(other: Any?): Boolean = + other is ContentBlock && javaClass == other.javaClass && children == other.children + + override fun hashCode(): Int = + children.hashCode() } public data class ContentText(val text: String) : ContentNode() @@ -31,11 +37,33 @@ public class ContentStrong() : ContentBlock() public class ContentStrikethrough() : ContentBlock() public class ContentCode() : ContentBlock() public class ContentBlockCode() : ContentBlock() -public class ContentNodeLink(val node : DocumentationNode) : ContentBlock() -public class ContentExternalLink(val href : String) : ContentBlock() + +public class ContentNodeLink(val node : DocumentationNode) : ContentBlock() { + override fun equals(other: Any?): Boolean = + super.equals(other) && other is ContentNodeLink && node == other.node + + override fun hashCode(): Int = + children.hashCode() * 31 + node.hashCode() +} + +public class ContentExternalLink(val href : String) : ContentBlock() { + override fun equals(other: Any?): Boolean = + super.equals(other) && other is ContentExternalLink && href == other.href + + override fun hashCode(): Int = + children.hashCode() * 31 + href.hashCode() +} + public class ContentList() : ContentBlock() public class ContentListItem() : ContentBlock() -public class ContentSection(public val tag: String, public val subjectName: String?) : ContentBlock() + +public class ContentSection(public val tag: String, public val subjectName: String?) : ContentBlock() { + override fun equals(other: Any?): Boolean = + super.equals(other) && other is ContentSection && tag == other.tag && subjectName == other.subjectName + + override fun hashCode(): Int = + children.hashCode() * 31 * 31 + tag.hashCode() * 31 + (subjectName?.hashCode() ?: 0) +} fun content(body: ContentBlock.() -> Unit): ContentBlock { val block = ContentBlock() -- cgit