diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt index dd611a6..f6b0521 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt @@ -4,6 +4,7 @@ package snapshots class Class constructor(private var banana: Int, apple: String) : // ^^^^^ definition semanticdb maven . . snapshots/Class# // documentation ```kt\npublic final class Class : kotlin.Throwable\n``` +// relationship is_reference is_implementation semanticdb maven . . kotlin/Throwable# // ^^^^^^^^^^^ definition semanticdb maven . . snapshots/Class#``(). // documentation ```kt\npublic constructor Class(banana: kotlin.Int, apple: kotlin.String)\n``` // ^^^^^^ definition semanticdb maven . . snapshots/Class#``().(banana) diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt index 4f9749f..98475af 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt @@ -15,6 +15,7 @@ abstract class DocstringSuperclass class Docstrings : DocstringSuperclass(), Serializable { // ^^^^^^^^^^ definition semanticdb maven . . snapshots/Docstrings# // documentation ```kt\npublic final class Docstrings : snapshots.DocstringSuperclass, java.io.Serializable\n```\n\n----\n\n Example class docstring. +// relationship is_reference is_implementation semanticdb maven . . snapshots/DocstringSuperclass# // ^^^^^^^^^^ definition semanticdb maven . . snapshots/Docstrings#``(). // documentation ```kt\npublic constructor Docstrings()\n```\n\n----\n\n Example class docstring. // ^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/DocstringSuperclass#``(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt index 338714f..133ed49 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt @@ -4,12 +4,14 @@ package snapshots class Overrides : AutoCloseable { // ^^^^^^^^^ definition semanticdb maven . . snapshots/Overrides# // documentation ```kt\npublic final class Overrides : java.lang.AutoCloseable\n``` +// relationship is_reference is_implementation semanticdb maven jdk 8 java/lang/AutoCloseable# // ^^^^^^^^^ definition semanticdb maven . . snapshots/Overrides#``(). // documentation ```kt\npublic constructor Overrides()\n``` // ^^^^^^^^^^^^^ reference semanticdb maven jdk 8 java/lang/AutoCloseable# override fun close() { // ^^^^^ definition semanticdb maven . . snapshots/Overrides#close(). // documentation ```kt\npublic open fun close()\n``` +// relationship is_reference is_implementation semanticdb maven jdk 8 java/lang/AutoCloseable#close(). TODO("Not yet implemented") // ^^^^ reference semanticdb maven . . kotlin/StandardKt#TODO(+1). } @@ -32,6 +34,7 @@ interface Animal { open class Bird : Animal { // ^^^^ definition semanticdb maven . . snapshots/Bird# // documentation ```kt\npublic open class Bird : snapshots.Animal\n``` +// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal# // ^^^^ definition semanticdb maven . . snapshots/Bird#``(). // documentation ```kt\npublic constructor Bird()\n``` // ^^^^^^ reference semanticdb maven . . snapshots/Animal# @@ -46,6 +49,7 @@ open class Bird : Animal { override fun sound(): String { // ^^^^^ definition semanticdb maven . . snapshots/Bird#sound(). // documentation ```kt\npublic open fun sound(): kotlin.String\n``` +// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal#sound(). // ^^^^^^ reference semanticdb maven . . kotlin/String# return "tweet" } @@ -53,6 +57,8 @@ open class Bird : Animal { class Seagull : Bird() { // ^^^^^^^ definition semanticdb maven . . snapshots/Seagull# // documentation ```kt\npublic final class Seagull : snapshots.Bird\n``` +// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal# +// relationship is_reference is_implementation semanticdb maven . . snapshots/Bird# // ^^^^^^^ definition semanticdb maven . . snapshots/Seagull#``(). // documentation ```kt\npublic constructor Seagull()\n``` // ^^^^ reference semanticdb maven . . snapshots/Bird#``(). @@ -66,6 +72,8 @@ class Seagull : Bird() { override fun sound(): String { // ^^^^^ definition semanticdb maven . . snapshots/Seagull#sound(). // documentation ```kt\npublic open fun sound(): kotlin.String\n``` +// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal#sound(). +// relationship is_reference is_implementation semanticdb maven . . snapshots/Bird#sound(). // ^^^^^^ reference semanticdb maven . . kotlin/String# return "squawk" } diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt index c5d7914..c8b3351 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt @@ -13,10 +13,7 @@ import org.jetbrains.kotlin.backend.common.serialization.metadata.findKDocString import org.jetbrains.kotlin.com.intellij.lang.java.JavaLanguage import org.jetbrains.kotlin.com.intellij.navigation.NavigationItem import org.jetbrains.kotlin.com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource -import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc.fqnString import org.jetbrains.kotlin.psi.KtConstructor @@ -55,6 +52,27 @@ class SemanticdbTextDocumentBuilder( if (role == Role.DEFINITION) symbols.add(symbolInformation(symbol, descriptor, element)) } + private val isIgnoredSuperClass = setOf("kotlin.Any", "java.lang.Object", "java.io.Serializable") + + private fun functionDescriptorOverrides(descriptor: FunctionDescriptor): Iterable { + val result = mutableListOf() + val isVisited = mutableSetOf() + val queue = ArrayDeque() + queue.add(descriptor) + while (!queue.isEmpty()) { + val current = queue.removeFirst() + if (current in isVisited) { + continue + } + + isVisited.add(current) + val directOverrides = current.overriddenDescriptors.flatMap { cache[it] }.map { it.toString() } + result.addAll(directOverrides) + queue.addAll(current.overriddenDescriptors) + } + return result + } + private fun symbolInformation( symbol: Symbol, descriptor: DeclarationDescriptor, @@ -68,20 +86,20 @@ class SemanticdbTextDocumentBuilder( // first is the class itself .drop(1) .filter { - it.fqnString != "kotlin.Any" && it.fqnString != "java.lang.Object" + it.fqnString !in isIgnoredSuperClass } .flatMap { cache[it] } .map { it.toString() } .asIterable() is SimpleFunctionDescriptor -> - descriptor.overriddenDescriptors.flatMap { cache[it] }.map { it.toString() } + functionDescriptorOverrides(descriptor) else -> emptyList().asIterable() } return SymbolInformation { this.symbol = symbol.toString() this.displayName = displayName(element) this.documentation = semanticdbDocumentation(descriptor) -// this.addAllOverriddenSymbols(supers) + this.addAllOverriddenSymbols(supers) this.language = when (element.language) { is KotlinLanguage -> Semanticdb.Language.KOTLIN diff --git a/semanticdb-kotlinc/src/snapshots/kotlin/com/sourcegraph/lsif_kotlin/Snapshot.kt b/semanticdb-kotlinc/src/snapshots/kotlin/com/sourcegraph/lsif_kotlin/Snapshot.kt index 31bb439..43b92d3 100644 --- a/semanticdb-kotlinc/src/snapshots/kotlin/com/sourcegraph/lsif_kotlin/Snapshot.kt +++ b/semanticdb-kotlinc/src/snapshots/kotlin/com/sourcegraph/lsif_kotlin/Snapshot.kt @@ -10,6 +10,7 @@ fun main() { ScipJava.main(arrayOf( "index-semanticdb", + "--no-emit-inverse-relationships", "--cwd", sourceroot.toString(), "--output",