diff options
author | huangmin-ms <huangmin@microsoft.com> | 2022-11-08 09:03:26 +0300 |
---|---|---|
committer | huangmin-ms <huangmin@microsoft.com> | 2022-11-08 09:03:26 +0300 |
commit | 1de78a32bbce09bd4a12115e34e0b3d972ebae7b (patch) | |
tree | 19edb4e95207624d7fdc99b7c68bfad21664f6db | |
parent | 782002b08cd6737b7d03ee5e62cca3a144278a1d (diff) |
Support EII of static abstract members in interface
-rw-r--r-- | external/Test/StaticVirtualMembers.dll | bin | 6144 -> 8192 bytes | |||
-rw-r--r-- | mdoc/Mono.Documentation/Updater/DocUtils.cs | 13 | ||||
-rw-r--r-- | mdoc/mdoc.Test/FormatterTests.cs | 41 |
3 files changed, 53 insertions, 1 deletions
diff --git a/external/Test/StaticVirtualMembers.dll b/external/Test/StaticVirtualMembers.dll Binary files differindex 2966a05f..2a18b555 100644 --- a/external/Test/StaticVirtualMembers.dll +++ b/external/Test/StaticVirtualMembers.dll diff --git a/mdoc/Mono.Documentation/Updater/DocUtils.cs b/mdoc/Mono.Documentation/Updater/DocUtils.cs index e7cbc2f8..d78a760d 100644 --- a/mdoc/Mono.Documentation/Updater/DocUtils.cs +++ b/mdoc/Mono.Documentation/Updater/DocUtils.cs @@ -161,7 +161,18 @@ namespace Mono.Documentation.Updater public static bool IsExplicitlyImplemented (MethodDefinition method)
{
- return method != null && method.IsPrivate && method.IsFinal && method.IsVirtual;
+ if (method == null || !method.IsPrivate)
+ {
+ return false;
+ }
+
+ if (method.IsFinal && method.IsVirtual)
+ {
+ return true;
+ }
+
+ // Support C# 11 EII for static abstract members in interface
+ return method.IsStatic && method.HasOverrides;
}
public static string GetTypeDotMember (string name)
diff --git a/mdoc/mdoc.Test/FormatterTests.cs b/mdoc/mdoc.Test/FormatterTests.cs index f9ded8d5..38618f28 100644 --- a/mdoc/mdoc.Test/FormatterTests.cs +++ b/mdoc/mdoc.Test/FormatterTests.cs @@ -566,6 +566,47 @@ namespace mdoc.Test Assert.AreEqual(expectedSignature, eventSignature); } + [TestCase("StaticVirtualMembers.Derived","M", "public static void M ();")] + [TestCase("StaticVirtualMembers.Derived", + "StaticVirtualMembers.StaticVirtualMemberInInterface<StaticVirtualMembers.Derived,StaticVirtualMembers.Derived,System.Int32>.M", + "static void StaticVirtualMemberInInterface<Derived,Derived,int>.M ();")] + [TestCase("StaticVirtualMembers.Derived", + "StaticVirtualMembers.StaticVirtualMemberInInterface<StaticVirtualMembers.Derived,StaticVirtualMembers.Derived,System.Int32>.ToBeImplemented", + "void StaticVirtualMemberInInterface<Derived,Derived,int>.ToBeImplemented ();")] + [TestCase("StaticVirtualMembers.Derived", + "StaticVirtualMembers.StaticVirtualMemberInInterface<StaticVirtualMembers.Derived,StaticVirtualMembers.Derived,System.Int32>.op_Addition", + "static int StaticVirtualMemberInInterface<Derived,Derived,int>.op_Addition (Derived left, Derived right);")] + public void CSharpStaticMethodImplementation(string typeFullName, string methodName, string expectedSignature) + { + var staticVirtualMemberDllPath = "../../../../external/Test/StaticVirtualMembers.dll"; + var type = GetType(staticVirtualMemberDllPath, typeFullName); + var method = GetMethod(type, m => m.Name == methodName); + var methodSignature = formatter.GetDeclaration(method); + Assert.AreEqual(expectedSignature, methodSignature); + } + + [TestCase("StaticVirtualMembers.ClassC", "StaticVirtualMembers.InterfaceI<StaticVirtualMembers.ClassC>.P", + "static ClassC StaticVirtualMembers.InterfaceI<StaticVirtualMembers.ClassC>.P { get; set; }")] + public void CSharpStaticPropertyImplementation(string typeFullName, string propertyName, string expectedSignature) + { + var staticVirtualMemberDllPath = "../../../../external/Test/StaticVirtualMembers.dll"; + var type = GetType(staticVirtualMemberDllPath, typeFullName); + var property = GetProperty(type, propertyName); + var propertySignature = formatter.GetDeclaration(property); + Assert.AreEqual(expectedSignature, propertySignature); + } + + [TestCase("StaticVirtualMembers.ClassC", "StaticVirtualMembers.InterfaceI<StaticVirtualMembers.ClassC>.E", + "static event Action StaticVirtualMembers.InterfaceI<StaticVirtualMembers.ClassC>.E;")] + public void CSharpStaticEventImplementation(string typeFullName, string eventName, string expectedSignature) + { + var staticVirtualMemberDllPath = "../../../../external/Test/StaticVirtualMembers.dll"; + var type = GetType(staticVirtualMemberDllPath, typeFullName); + var e = GetEvent(type, eventName); + var eventSignature = formatter.GetDeclaration(e); + Assert.AreEqual(expectedSignature, eventSignature); + } + #region Helper Methods string RealTypeName(string name){ switch (name) { |