Skip to content

Ignore binding Kotlin synthetic default constructors #694

@jpobst

Description

@jpobst

Context: dotnet/android#3776

When using a Kotlin default constructor like:

class MaterialDialog(
  val windowContext: Context,
  val dialogBehavior: DialogBehavior = DEFAULT_BEHAVIOR
) : Dialog(windowContext, inferTheme(windowContext, dialogBehavior)) 
{ ... }

Kotlin will create 2 constructors, the "real" one and a synthetic one denoting which constructor is the default constructor using a kotlin.jvm.internal.DefaultConstructorMarker parameter:

<constructor deprecated="not deprecated" final="false" name="MaterialDialog" static="false" visibility="public" bridge="false" synthetic="false" jni-signature="(Landroid/content/Context;Lcom/afollestad/materialdialogs/DialogBehavior;)V">
  <parameter name="windowContext" type="android.content.Context" jni-type="Landroid/content/Context;" not-null="true"/>
  <parameter name="dialogBehavior" type="com.afollestad.materialdialogs.DialogBehavior" jni-type="Lcom/afollestad/materialdialogs/DialogBehavior;" not-null="true"/>
</constructor>
<constructor deprecated="not deprecated" final="false" name="MaterialDialog" static="false" visibility="public" bridge="false" synthetic="true" jni-signature="(Landroid/content/Context;Lcom/afollestad/materialdialogs/DialogBehavior;ILkotlin/jvm/internal/DefaultConstructorMarker;)V">
  <parameter name="p0" type="android.content.Context" jni-type="Landroid/content/Context;"/>
  <parameter name="p1" type="com.afollestad.materialdialogs.DialogBehavior" jni-type="Lcom/afollestad/materialdialogs/DialogBehavior;"/>
  <parameter name="p2" type="int" jni-type="I"/>
  <parameter name="p3" type="kotlin.jvm.internal.DefaultConstructorMarker" jni-type="Lkotlin/jvm/internal/DefaultConstructorMarker;"/>
</constructor>

The kotlin.jvm.internal.DefaultConstructorMarker type is not available in the Xamarin.Kotlin.StdLib NuGet package because the type in internal.

Thus when trying to bind the constructor, ApiXmlAdjuster reports this "error":

Error while processing '[Constructor] MaterialDialog(android.content.Context p0, com.afollestad.materialdialogs.DialogBehavior p1, int p2, kotlin.jvm.internal.DefaultConstructorMarker p3)' in '[Class] com.afollestad.materialdialogs.MaterialDialog': Type 'kotlin.jvm.internal.DefaultConstructorMarker' was not found.

This is actually good, as we shouldn't bind this synthetic constructor, but we should detect this Kotlin-ism and not emit the "error", as it misleads users into thinking they need to do something to fix it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementProposed change to current functionalitygeneratorIssues binding a Java library (generator, class-parse, etc.)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions