Kotlin / binary-compatibility-validator

Public API management tool
Apache License 2.0
793 stars 59 forks source link

private constructor shows up in API dump #73

Open martinbonnin opened 2 years ago

martinbonnin commented 2 years ago

The following code:

class FooBar private constructor(val id: String) {
  class Builder {
    fun build() = FooBar("")
  }
}

dumps the following API:

public final class com/apollographql/apollo3/api/FooBar {
    public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
    public final fun getId ()Ljava/lang/String;
}

public final class com/apollographql/apollo3/api/FooBar$Builder {
    public fun <init> ()V
    public final fun build ()Lcom/apollographql/apollo3/api/FooBar;
}

I'm curious as to why <init> is listed in the dump. If I were to remove the id parameter, would that be considered a breaking change even if it should be an implementation detail?

I'm using 0.8.0-RC

qwwdfsad commented 2 years ago

Note to self:

class ConstructorMarker constructor(unused: String = "")

and

class ConstructorMarker private constructor(unused: String, i: Int) {
    class Builder {
        fun build() = ConstructorMarker("", 42)
    }
}

both produce public synthetic <init>(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V, the trick is to properly distinguish them as former is part of the ABI, while latter is not

qwwdfsad commented 2 years ago

We decided this is a compiler issue: https://youtrack.jetbrains.com/issue/KT-51073

Alas there is not much we can do on BCV side to address it

dovchinnikov commented 9 months ago

BCV could at least filter out synthetic constructors with DefaultConstructorMarker but without I