java.interop icon indicating copy to clipboard operation
java.interop copied to clipboard

ACW implements java interface although it is not public for the class that has no implements node in api.xml

Open moljac opened this issue 4 years ago • 1 comments

Another one from AndroidX

ACW error during samples builds:

obj/Debug/android/src/mono/androidx/paging/AsyncPagedListDiffer_PagedListListenerImplementor.java(8,39): javac error JAVAC0000:  error: PagedListListener is not public in AsyncPagedListDiffer; cannot be accessed from outside package [/Users/Shared/Projects/d/X/AndroidX_master/samples/BuildAll/BuildAll/BuildAll.csproj]
obj/Debug/android/src/mono/androidx/paging/AsyncPagedListDiffer_PagedListListenerImplementor.java(8,39): javac error JAVAC0000: 		androidx.paging.AsyncPagedListDiffer.PagedListListener [/Users/Shared/Projects/d/X/AndroidX_master/samples/BuildAll/BuildAll/BuildAll.csproj]
obj/Debug/android/src/mono/androidx/paging/AsyncPagedListDiffer_PagedListListenerImplementor.java(8,39): javac error JAVAC0000:  [/Users/Shared/Projects/d/X/AndroidX_master/samples/BuildAll/BuildAll/BuildAll.csproj]

api.xml for the AsyncPagedListDiffer class:

    <class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="AsyncPagedListDiffer" static="false" visibility="public" jni-signature="Landroidx/paging/AsyncPagedListDiffer;">
      <typeParameters>
        <typeParameter name="T" classBound="java.lang.Object" jni-classBound="Ljava/lang/Object;"></typeParameter>
      </typeParameters>
      <constructor deprecated="not deprecated" final="false" name="AsyncPagedListDiffer" jni-signature="(Landroidx/recyclerview/widget/ListUpdateCallback;Landroidx/recyclerview/widget/AsyncDifferConfig;)V" bridge="false" static="false" type="androidx.paging.AsyncPagedListDiffer" synthetic="false" visibility="public">
        <parameter name="listUpdateCallback" type="androidx.recyclerview.widget.ListUpdateCallback" jni-type="Landroidx/recyclerview/widget/ListUpdateCallback;">
        </parameter>
        <parameter name="config" type="androidx.recyclerview.widget.AsyncDifferConfig&lt;T&gt;" jni-type="Landroidx/recyclerview/widget/AsyncDifferConfig&lt;TT;&gt;;">
        </parameter>
      </constructor>
      <constructor deprecated="not deprecated" final="false" name="AsyncPagedListDiffer" jni-signature="(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V" bridge="false" static="false" type="androidx.paging.AsyncPagedListDiffer" synthetic="false" visibility="public">
        <parameter name="adapter" type="androidx.recyclerview.widget.RecyclerView.Adapter" jni-type="Landroidx/recyclerview/widget/RecyclerView$Adapter;">
        </parameter>
        <parameter name="diffCallback" type="androidx.recyclerview.widget.DiffUtil.ItemCallback&lt;T&gt;" jni-type="Landroidx/recyclerview/widget/DiffUtil$ItemCallback&lt;TT;&gt;;">
        </parameter>
      </constructor>
      <method abstract="false" deprecated="not deprecated" final="false" name="getCurrentList" jni-signature="()Landroidx/paging/PagedList;" bridge="false" native="false" return="androidx.paging.PagedList&lt;T&gt;" jni-return="Landroidx/paging/PagedList&lt;TT;&gt;;" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getItem" jni-signature="(I)Ljava/lang/Object;" bridge="false" native="false" return="T" jni-return="TT;" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="index" type="int" jni-type="I">
        </parameter>
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="getItemCount" jni-signature="()I" bridge="false" native="false" return="int" jni-return="I" static="false" synchronized="false" synthetic="false" visibility="public">
      </method>
      <method abstract="false" deprecated="not deprecated" final="false" name="submitList" jni-signature="(Landroidx/paging/PagedList;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="pagedList" type="androidx.paging.PagedList&lt;T&gt;" jni-type="Landroidx/paging/PagedList&lt;TT;&gt;;">
        </parameter>
      </method>
    </class>

Attempt to make class non-generic and interface protected

<metadata>
    <remove-node
        path="/api/package[@name='androidx.paging']/class[@name='AsyncPagedListDiffer']/typeParameters"
        />        
    <attr
 path="/api/package[@name='androidx.paging']/interface[@name='AsyncPagedListDiffer.PagedListListener']"
        name="visibility"
        > 
        protected
    </attr>
</metadata>

Generated managed C# code:

	// Metadata.xml XPath class reference: path="/api/package[@name='androidx.paging']/class[@name='AsyncPagedListDiffer']"
	[global::Android.Runtime.Register ("androidx/paging/AsyncPagedListDiffer", DoNotGenerateAcw=true)]
	[global::Java.Interop.JavaTypeParameters (new string [] {"T"})]
	public partial class AsyncPagedListDiffer : global::Java.Lang.Object {

		// Metadata.xml XPath interface reference: path="/api/package[@name='androidx.paging']/interface[@name='AsyncPagedListDiffer.PagedListListener']"
		[Register ("androidx/paging/AsyncPagedListDiffer$PagedListListener", "", "AndroidX.Paging.AsyncPagedListDiffer/IPagedListListenerInvoker")]
		protected internal partial interface IPagedListListener : IJavaObject, IJavaPeerable {

               // removed code

		}

		[global::Android.Runtime.Register ("androidx/paging/AsyncPagedListDiffer$PagedListListener", DoNotGenerateAcw=true)]
		internal partial class IPagedListListenerInvoker : global::Java.Lang.Object, IPagedListListener {
               }

So interface is protected internal and added. Why?

generated ACW java adds interface:

package mono.androidx.paging;


public class AsyncPagedListDiffer_PagedListListenerImplementor
	extends java.lang.Object
	implements
		mono.android.IGCUserPeer,
		androidx.paging.AsyncPagedListDiffer.PagedListListener

Note PagedListListener which is not in api.xml (no implements for give class AsyncPagedListDiffer.

moljac avatar Mar 04 '20 15:03 moljac

@moljac: Could you please attach the entire api.xml file? If PagedListListener isn't present, it doesn't make immediate sense that it would be emitted at all.

jonpryor avatar Apr 28 '20 18:04 jonpryor