Skip to content

Commit

Permalink
Remove empty spans rendering for missed modifiers (#3343)
Browse files Browse the repository at this point in the history
* Remove property modifiers if there are none
* Remove variance modifier rendering if it is absent
  • Loading branch information
atyrin committed Nov 14, 2023
1 parent 1fb8d31 commit 94a4edd
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 5 deletions.
Expand Up @@ -248,7 +248,7 @@ public class KotlinSignatureProvider(
p.modifier[sourceSet].takeIf { it !in ignoredModifiers }?.let {
if (it is JavaModifier.Empty) KotlinModifier.Open else it
}?.name?.let { keyword("$it ") }
p.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
p.modifiers()[sourceSet]?.toSignatureString()?.takeIf { it.isNotEmpty() }?.let { keyword(it) }
if (p.isMutable()) keyword("var ") else keyword("val ")
list(p.generics, prefix = "<", suffix = "> ",
separatorStyles = mainStyles + TokenStyle.Punctuation,
Expand Down Expand Up @@ -303,7 +303,7 @@ public class KotlinSignatureProvider(
f.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.let {
if (it is JavaModifier.Empty) KotlinModifier.Open else it
}?.name?.let { keyword("$it ") }
f.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
f.modifiers()[sourceSet]?.toSignatureString()?.takeIf { it.isNotEmpty() }?.let { keyword(it) }
keyword("fun ")
list(
f.generics, prefix = "<", suffix = "> ",
Expand Down Expand Up @@ -434,7 +434,7 @@ public class KotlinSignatureProvider(
}

is Variance<*> -> group(styles = emptySet()) {
keyword("$p ".takeIf { it.isNotBlank() } ?: "")
p.takeIf { it.toString().isNotEmpty() }?.let { keyword("$it ") }
signatureForProjection(p.inner, showFullyQualifiedName)
}

Expand Down
Expand Up @@ -197,6 +197,27 @@ class SignatureTest : BaseAbstractTest() {
}
}

@Test
fun `fun with use site variance modifier in`() {
val source = source("fun simpleFun(params: Array<in String>): Unit")
val writerPlugin = TestOutputWriterPlugin()

testInline(
source,
configuration,
pluginOverrides = listOf(writerPlugin)
) {
renderingStage = { _, _ ->
writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
"fun ", A("simpleFun"), "(", Parameters(
Parameter("params: ", A("Array"), "<in ", A("String"), ">"),
), ")",
ignoreSpanWithTokenStyle = true
)
}
}
}

@Test
fun `fun with definitely non-nullable types`() {
val source = source("fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y")
Expand Down Expand Up @@ -312,6 +333,48 @@ class SignatureTest : BaseAbstractTest() {
}
}

@Test
fun `class with declaration site variance modifier`() {
val writerPlugin = TestOutputWriterPlugin()

testInline(
"""
|/src/main/kotlin/common/Test.kt
|package example
|
|class PrimaryConstructorClass<out T> { }
""".trimMargin(),
configuration,
pluginOverrides = listOf(writerPlugin)
) {
renderingStage = { _, _ ->
writerPlugin.writer.renderedContent("root/example/-primary-constructor-class/index.html").firstSignature().match(
Span("class "), A("PrimaryConstructorClass"), Span("<"), Span("out "), A("T"), Span(">"),
)
}
}
}

@Test
fun `constructor property on class page`() {
val source = source("data class DataClass(val arg: String)")
val writerPlugin = TestOutputWriterPlugin()

testInline(
source,
configuration,
pluginOverrides = listOf(writerPlugin)
) {
renderingStage = { _, _ ->
assertEquals(
writerPlugin.writer.renderedContent("root/example/-data-class/index.html").lastSignature().html(),
"<span class=\"token keyword\">val </span><a href=\"arg.html\">arg</a><span class=\"token operator\">: </span><a href=\"https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html\">String</a>"

)
}
}
}

@Test
fun `functional interface`() {
val source = source("fun interface KRunnable")
Expand Down Expand Up @@ -896,8 +959,7 @@ class SignatureTest : BaseAbstractTest() {
) {
renderingStage = { _, _ ->
writerPlugin.writer.renderedContent("root/example/-primary-constructor-class/index.html").firstSignature().match(
// In `<T>` expression, an empty `<span class="token keyword"></span>` is present for some reason
Span("class "), A("PrimaryConstructorClass"), Span("<"), Span(), A("T"), Span(">"), Span("("), Parameters(
Span("class "), A("PrimaryConstructorClass"), Span("<"), A("T"), Span(">"), Span("("), Parameters(
Parameter(Span("val "), "x", Span(": "), A("Int"), Span(",")),
Parameter(Span("var "), "s", Span(": "), A("String"))
), Span(")"),
Expand Down

0 comments on commit 94a4edd

Please sign in to comment.