Skip to content

Commit

Permalink
Do not generate source links for synthetic elements
Browse files Browse the repository at this point in the history
Fixes #2544
  • Loading branch information
IgnatBeresnev committed Jun 21, 2022
1 parent fc86d21 commit 11ed349
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 4 deletions.
Expand Up @@ -2,6 +2,7 @@ package org.jetbrains.dokka.base.transformers.pages.sourcelinks

import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.SyntheticElement
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
import org.jetbrains.dokka.analysis.DescriptorDocumentableSource
Expand Down Expand Up @@ -134,9 +135,13 @@ class SourceLinksTransformer(val context: DokkaContext) : PageTransformer {
}

private fun PsiElement.lineNumber(): Int? {
val doc = PsiDocumentManager.getInstance(project).getDocument(containingFile)
// IJ uses 0-based line-numbers; external source browsers use 1-based
return doc?.getLineNumber(textRange.startOffset)?.plus(1)
return if (this is SyntheticElement) {
null // does not actually exist in code, thus no line number
} else {
val doc = PsiDocumentManager.getInstance(project).getDocument(containingFile)
// IJ uses 0-based line-numbers; external source browsers use 1-based
return doc?.getLineNumber(textRange.startOffset)?.plus(1)
}
}
}

Expand Down
60 changes: 60 additions & 0 deletions plugins/base/src/test/kotlin/enums/JavaEnumsTest.kt
@@ -0,0 +1,60 @@
package enums

import org.jetbrains.dokka.SourceLinkDefinitionImpl
import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
import org.jsoup.Jsoup
import org.junit.jupiter.api.Test
import utils.TestOutputWriterPlugin
import java.net.URL
import kotlin.test.assertEquals

class JavaEnumsTest : BaseAbstractTest() {

// Shouldn't try to give source links to synthetic methods (values, valueOf) if any are present
// https://github.com/Kotlin/dokka/issues/2544
@Test
fun `java enum with configured source links should not fail build due to any synthetic methods`() {
val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/")
sourceLinks = listOf(
SourceLinkDefinitionImpl(
localDirectory = "src/main/java",
remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/java"),
remoteLineSuffix = "#L"
)
)
}
}
}

val writerPlugin = TestOutputWriterPlugin()

testInline(
"""
|/src/main/java/basic/JavaEnum.java
|package testpackage
|
|public enum JavaEnum {
| ONE, TWO, THREE
|}
""".trimMargin(),
configuration,
pluginOverrides = listOf(writerPlugin)
) {
renderingStage = { _, _ ->
val enumPage = writerPlugin.writer.contents.getValue("root/testpackage/-java-enum/index.html")
val sourceLink = Jsoup.parse(enumPage)
.select("div[data-togglable=Sources]")
.select("a[href]")
.attr("href")

assertEquals(
"https://github.com/user/repo/tree/master/src/main/java/basic/JavaEnum.java#L3",
sourceLink
)
}
}
}
}
@@ -1,6 +1,7 @@
package enums

import matchers.content.*
import org.jetbrains.dokka.SourceLinkDefinitionImpl
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
import org.jetbrains.dokka.model.*
Expand All @@ -12,8 +13,9 @@ import org.junit.jupiter.api.Test
import signatures.renderedContent
import utils.TestOutputWriter
import utils.TestOutputWriterPlugin
import java.net.URL

class EnumsTest : BaseAbstractTest() {
class KotlinEnumsTest : BaseAbstractTest() {

@Test
fun `should preserve enum source ordering for documentables`() {
Expand Down Expand Up @@ -366,4 +368,53 @@ class EnumsTest : BaseAbstractTest() {
}
}
}

// Shouldn't try to give source links to synthetic methods (values, valueOf) if any are present
// Initially reported for Java, making sure it doesn't fail for Kotlin either
// https://github.com/Kotlin/dokka/issues/2544
@Test
fun `kotlin enum with configured source links should not fail the build due to synthetic methods`() {
val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/")
sourceLinks = listOf(
SourceLinkDefinitionImpl(
localDirectory = "src/main/kotlin",
remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/kotlin"),
remoteLineSuffix = "#L"
)
)
}
}
}

val writerPlugin = TestOutputWriterPlugin()

testInline(
"""
|/src/main/kotlin/basic/KotlinEnum.kt
|package testpackage
|
|enum class KotlinEnum {
| ONE, TWO, THREE
|}
""".trimMargin(),
configuration,
pluginOverrides = listOf(writerPlugin)
) {
renderingStage = { _, _ ->
val enumPage = writerPlugin.writer.contents.getValue("root/testpackage/-kotlin-enum/index.html")
val sourceLink = Jsoup.parse(enumPage)
.select("div[data-togglable=Sources]")
.select("a[href]")
.attr("href")

assertEquals(
"https://github.com/user/repo/tree/master/src/main/kotlin/basic/KotlinEnum.kt#L3",
sourceLink
)
}
}
}
}

0 comments on commit 11ed349

Please sign in to comment.