-
Notifications
You must be signed in to change notification settings - Fork 58
[generator] Add managedOverride
values none
and reabstract
.
#1000
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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: public partial interface IAnnotatedArrayType : global::Java.Lang.Reflect.IAnnotatedType {
// Currently generated
abstract global::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 public partial interface IAnnotatedArrayType : global::Java.Lang.Reflect.IAnnotatedType {
// Needs to generated
abstract global::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 <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="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 <attr path="/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 <attr path="/api/package[@name='java.io']/interface[
@name='Closeable'
]/method[@name='close' and count(parameter)=0]"
name="managedName">IAutoCloseable.Close</attr> Then the public partial interface ICloseable : global::Java.Lang.IAutoCloseable {
abstract void IAutoCloseable_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 interface I1
{
void DoThing () { }
}
interface I2
{
void DoThing () { }
}
interface I3 : I1, I2
{
abstract void DoThing ();
} I'm also not sure using Perhaps we need an additional <attr path="/api/package[@name='java.io']/interface[@name='Closeable']/method[@name='close']" name="explicitInterface">
IAutoCloseable
</attr> |
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. |
Given that we will need separate I think the answer is No. |
Fixes #981
Add support for the
managedOverride = none
value:This value ensures that the member is not marked as
virtual
oroverride
, useful forsealed
classes.Additionally add support for the
managedOverride = reabstract
value:This only affects interfaces, and allows an interface member to be "reabstracted":