binary-compatibility-validator icon indicating copy to clipboard operation
binary-compatibility-validator copied to clipboard

private constructor shows up in API dump

Open martinbonnin opened this issue 4 years ago • 3 comments

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

martinbonnin avatar Dec 01 '21 15:12 martinbonnin

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 avatar Jan 31 '22 15:01 qwwdfsad

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

qwwdfsad avatar Feb 01 '22 09:02 qwwdfsad

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

dovchinnikov avatar Dec 01 '23 20:12 dovchinnikov