Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Xamarin.Android.Tools.Bytecode] Hide Kotlin synthetic constructors (#…
…700) Fixes: #694 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> Additionally, the `kotlin.jvm.internal.DefaultConstructorMarker` type is not available in the `Xamarin.Kotlin.StdLib` NuGet package, because the type is `internal`. Consequently, 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. Update `Xamarin.Android.Tools.Bytecode` to *hide* constructors for which the final two parameter types are `int, DefaultConstructorMarker`, thus ensuring that `ApiXmlAdjuster` & co. won't process such members or attempt to resolve the unresolvable `DefaultConstructorMarker` type.
- Loading branch information