Skip to content

Collisions between field and nested type names cause compile errors #1185

Open
@jonpryor

Description

@jonpryor

Context: https://developercommunity.visualstudio.com/t/I-am-using-the-Maui-class-library-to-imp/10579664

When the binding of a method collides with a nested type, we prefix the method name with Invoke:

https://github.com/xamarin/java.interop/blob/7f08b77f3464f2b276ec5edd2e4836b1915f86dd/tools/generator/Java.Interop.Tools.Generator.ObjectModel/GenBase.cs#L353

We don't appear to have any equivalent behavior when a field name collides with a nested type or property. This can result in CS0102 errors.

For example, consider the wechat-sdk-android-6.8.26.aar library. When we try to bind this, it fails:

obj/Debug/net8.0-android/generated/src/Com.Tencent.MM.Opensdk.Modelbase.BaseResp.cs(24,14): error CS0102: The type 'BaseResp' already contains a definition for 'ErrCode'
obj/Debug/net8.0-android/generated/src/Com.Tencent.MM.Opensdk.Modelmsg.WXMediaMessage.cs(54,79): error CS0102: The type 'WXMediaMessage' already contains a definition for 'MediaObject'

Relevant context:

abstract partial class BaseRep {
    // Metadata.xml XPath field reference: path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']"
    [Register ("errCode")]
    // line 24 follows
    public int ErrCode {}

    public abstract partial class ErrCode : Java.Lang.Object {
    }
}

partial class WXMediaMessage {
    // Metadata.xml XPath field reference: path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']"
    [Register ("mediaObject")]
    // line 54 follows
    public IMediaObject? MediaObject {}

    partial class MediaObject : Java.Lang.Object {
    }
}

If we had automagic renaming of fields names so that they wouldn't collide with nested types, as we do with methods, this library would have been bindable without Metadata.

Metadata which allows the library to build:

<metadata>
  <attr
      path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']"
      name="managedName"
  >ErrorCode</attr>

  <attr
      path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']"
      name="managedName"
  >MediaObjectField</attr>

</metadata>

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