Uh oh!
There was an error while loading. Please reload this page.
[generator] Add managedOverride values none and reabstract. - #1000
Conversation
jonpryor
commented
Jun 30, 2022
This change may be incomplete. Use-case: reabstract interface members: diff --git a/src/Java.Base/Java.Base.csproj b/src/Java.Base/Java.Base.csproj
index b05f70d6..7980c93f 100644
--- a/src/Java.Base/Java.Base.csproj+++ b/src/Java.Base/Java.Base.csproj@@ -4,8 +4,7 @@
<TargetFrameworks>$(DotNetTargetFramework)</TargetFrameworks>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
- <!-- TODO: CS0108 is due to e.g. interfaces re-abstracting default interface methods -->- <NoWarn>$(NoWarn);8764;CS0108</NoWarn>+ <NoWarn>$(NoWarn);8764</NoWarn>
<Version>$(JICoreLibVersion)</Version>
</PropertyGroup>
diff --git a/src/Java.Base/Transforms/Metadata.xml b/src/Java.Base/Transforms/Metadata.xml
index 21828b34..0dffb755 100644
--- a/src/Java.Base/Transforms/Metadata.xml+++ b/src/Java.Base/Transforms/Metadata.xml@@ -12,6 +12,15 @@
<!-- warning CS0672: Member 'Enum.JavaFinalize()' overrides obsolete member 'Object.JavaFinalize()'. Add the Obsolete attribute to 'Enum.JavaFinalize()'. -->
<attr path="/api/package[@name='java.lang']/class[@name='Enum']/method[@name='finalize' and count(parameter)=0]" name="deprecated">deprecated</attr>
+ <!-- warning CS0108: 'MEMBER' hides inherited member 'MEMBER'. Use the new keyword if hiding was intended. -->+ <attr path="/api/package[@name='java.lang.reflect']/interface[+ @name='AnnotatedParameterizedType'+ or @name='AnnotatedArrayType'+ or @name='AnnotatedTypeVariable'+ or @name='AnnotatedWildcardType'+ ]/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"+ name="managedOverride">reabstract</attr>+
<!-- AbstractStringBuilder is package-private; fixity fix -->
<remove-node path="//api/package[@name='java.lang']/class[@name='AbstractStringBuilder']" />
After building, we still get CS0108 warnings: "Offending" code: publicpartialinterfaceIAnnotatedArrayType:global::Java.Lang.Reflect.IAnnotatedType{// Currently generatedabstractglobal::Java.Lang.Reflect.IAnnotatedType?AnnotatedOwnerType{// Metadata.xml XPath method reference: path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedArrayType']/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"[global::Java.Interop.JniMethodSignature("getAnnotatedOwnerType","()Ljava/lang/reflect/AnnotatedType;")]get;}}We have the publicpartialinterfaceIAnnotatedArrayType:global::Java.Lang.Reflect.IAnnotatedType{// Needs to generatedabstractglobal::Java.Lang.Reflect.IAnnotatedType?IAnnotatedType.AnnotatedOwnerType{// Metadata.xml XPath method reference: path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedArrayType']/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"[global::Java.Interop.JniMethodSignature("getAnnotatedOwnerType","()Ljava/lang/reflect/AnnotatedType;")]get;}}I can "make the needed output happen" by adding an additional <attrpath="/api/package[@name='java.lang.reflect']/interface[ @name='AnnotatedParameterizedType' or @name='AnnotatedArrayType' or @name='AnnotatedTypeVariable' or @name='AnnotatedWildcardType' ]/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"name="propertyName">IAnnotatedType.AnnotatedOwnerType</attr>The question is whether we want to require two steps for this scenario -- set An added complication is that while I can workaround properties as above, I can't figure out how to work around method names: Thus, I want to emit <attrpath="/api/package[@name='java.io']/interface[ @name='Closeable' ]/method[@name='close' and count(parameter)=0]"name="managedOverride">reabstract</attr>but then I need an explicitly qualified <attrpath="/api/package[@name='java.io']/interface[ @name='Closeable' ]/method[@name='close' and count(parameter)=0]"name="managedName">IAutoCloseable.Close</attr>Then the publicpartialinterfaceICloseable:global::Java.Lang.IAutoCloseable{abstractvoidIAutoCloseable_Close();}Given that I can't fixup method names in this manner, I think that when |
I'm not sure this is something we can do in an automated manner. I don't think we currently attempt to track what members implement which interface contracts. Also, I'm not sure we can do that. For example, does this reabstract interfaceI1{voidDoThing(){}}interfaceI2{voidDoThing(){}}interfaceI3:I1,I2{abstractvoidDoThing();}I'm also not sure using Perhaps we need an additional <attrpath="/api/package[@name='java.io']/interface[@name='Closeable']/method[@name='close']"name="explicitInterface">
IAutoCloseable
</attr> |
jonpryor
commented
Jul 6, 2022
It might not have worked, actually. Remember that for my use case of Java.Base bindings, "marshal methods" are not emitted (bc5bcf4):
Commit 4787e01 implemented marshal methods for Java.Base by using the Java.Interop.Export infrastructure; Thus, Java.Base wouldn't currently hit a scenario where "
That sounds like a good idea to me. |
jonpryor
commented
Jul 7, 2022
Given that we will need separate I think the answer is No. |
Fixes#981
Add support for the
managedOverride = nonevalue:This value ensures that the member is not marked as
virtualoroverride, useful forsealedclasses.Additionally add support for the
managedOverride = reabstractvalue:This only affects interfaces, and allows an interface member to be "reabstracted":