diff options
author | Min Huang <huangmin@microsoft.com> | 2022-02-15 11:22:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-15 11:22:34 +0300 |
commit | e942ab5362331935a058d2430bb32601aa0baaa2 (patch) | |
tree | e0ad4bb382f92f0ddc4e52a3d59fdf58f5d71625 | |
parent | b0c005e123292ded9f3c9eb1386728c4d28e28f5 (diff) |
feat#550375: Support ref struct and readonly ref struct syntaxes (#608)
* Support `ref struct` and `readonly ref struct` syntaxes.
* update
* Refactor code
* Update
-rw-r--r-- | mdoc/Consts.cs | 7 | ||||
-rw-r--r-- | mdoc/Mono.Documentation/Updater/DocUtils.cs | 13 | ||||
-rw-r--r-- | mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs | 17 | ||||
-rw-r--r-- | mdoc/mdoc.Test/DocUtilsTests.cs | 16 | ||||
-rw-r--r-- | mdoc/mdoc.Test/FormatterTests.cs | 16 | ||||
-rw-r--r-- | mdoc/mdoc.Test/SampleClasses/ReadOnlyRefStruct.cs | 7 | ||||
-rw-r--r-- | mdoc/mdoc.Test/SampleClasses/RefStruct.cs | 7 |
7 files changed, 77 insertions, 6 deletions
diff --git a/mdoc/Consts.cs b/mdoc/Consts.cs index a412452b..52889455 100644 --- a/mdoc/Consts.cs +++ b/mdoc/Consts.cs @@ -38,12 +38,15 @@ namespace Mono.Documentation public const string VoidFullName = "System.Void"; public const string RefTypeObsoleteString = "Types with embedded references are not supported in this version of your compiler."; public const string FrameworksIndexFolderName = "FrameworksIndex"; - public const string CompilerGeneratedAttribute = "System.Runtime.CompilerServices.CompilerGeneratedAttribute"; - public const string CompilationMappingAttribute = "Microsoft.FSharp.Core.CompilationMappingAttribute"; public const string FrameworksIndex = "FrameworksIndex"; public const string FrameworkAlternate = "FrameworkAlternate"; public const string Index = "Index"; public static bool CollapseInheritedInterfaces = true; + + public const string CompilationMappingAttribute = "Microsoft.FSharp.Core.CompilationMappingAttribute"; + public const string CompilerGeneratedAttribute = "System.Runtime.CompilerServices.CompilerGeneratedAttribute"; + public const string IsByRefLikeAttribute = "System.Runtime.CompilerServices.IsByRefLikeAttribute"; + public const string IsReadOnlyAttribute = "System.Runtime.CompilerServices.IsReadOnlyAttribute"; } } diff --git a/mdoc/Mono.Documentation/Updater/DocUtils.cs b/mdoc/Mono.Documentation/Updater/DocUtils.cs index 8a29d010..c0bc1716 100644 --- a/mdoc/Mono.Documentation/Updater/DocUtils.cs +++ b/mdoc/Mono.Documentation/Updater/DocUtils.cs @@ -945,5 +945,18 @@ namespace Mono.Documentation.Updater return type;
}
+
+ public static bool HasCustomAttribute(ICustomAttributeProvider customAttrProvider, string attributeName)
+ {
+ if (customAttrProvider == null)
+ {
+ return false;
+ }
+ else
+ {
+ return customAttrProvider.HasCustomAttributes
+ && customAttrProvider.CustomAttributes.Any(attr => attr.AttributeType.FullName == attributeName);
+ }
+ }
}
}
diff --git a/mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs b/mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs index e225e659..ff280834 100644 --- a/mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs +++ b/mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs @@ -238,7 +238,19 @@ namespace Mono.Documentation.Updater.Formatters if (t.IsEnum) return "enum"; if (t.IsValueType) - return "struct"; + { + StringBuilder buf = new StringBuilder(); + if (DocUtils.HasCustomAttribute(t, Consts.IsReadOnlyAttribute)) + { + buf.Append("readonly "); + } + if (DocUtils.HasCustomAttribute(t, Consts.IsByRefLikeAttribute)) + { + buf.Append("ref "); + } + buf.Append("struct"); + return buf.ToString(); + } if (t.IsClass || t.FullName == "System.Enum") return "class"; if (t.IsInterface) @@ -508,8 +520,7 @@ namespace Mono.Documentation.Updater.Formatters modifiers += " ref"; } - if (method.ReturnType.IsRequiredModifier - && method.MethodReturnType.CustomAttributes.Any(attr => attr.AttributeType.FullName == "System.Runtime.CompilerServices.IsReadOnlyAttribute")) + if (method.ReturnType.IsRequiredModifier && DocUtils.HasCustomAttribute(method.MethodReturnType, Consts.IsReadOnlyAttribute)) { modifiers += " readonly"; } diff --git a/mdoc/mdoc.Test/DocUtilsTests.cs b/mdoc/mdoc.Test/DocUtilsTests.cs index d3f4242d..52a50fd7 100644 --- a/mdoc/mdoc.Test/DocUtilsTests.cs +++ b/mdoc/mdoc.Test/DocUtilsTests.cs @@ -1,7 +1,7 @@ using System.Linq; using mdoc.Test.SampleClasses; +using Mono.Documentation; using Mono.Documentation.Updater; -using Mono.Documentation.Updater.Frameworks; using NUnit.Framework; using System.Xml; @@ -144,5 +144,19 @@ random text var result = DocUtils.IsEiiIgnoredMethod(member, member.Overrides[0]); Assert.IsTrue(result); } + + [Test] + public void HasCustomAttributeTest() + { + Assert.IsFalse(DocUtils.HasCustomAttribute(null, "")); + + var type = GetType(typeof(SampleClasses.RefStruct)); + Assert.IsFalse(DocUtils.HasCustomAttribute(type, Consts.IsReadOnlyAttribute)); + Assert.IsTrue(DocUtils.HasCustomAttribute(type, Consts.IsByRefLikeAttribute)); + + type = GetType(typeof(SampleClasses.ReadOnlyRefStruct)); + Assert.IsTrue(DocUtils.HasCustomAttribute(type, Consts.IsReadOnlyAttribute)); + Assert.IsTrue(DocUtils.HasCustomAttribute(type, Consts.IsByRefLikeAttribute)); + } } }
\ No newline at end of file diff --git a/mdoc/mdoc.Test/FormatterTests.cs b/mdoc/mdoc.Test/FormatterTests.cs index 01a8f6cf..ace21a6a 100644 --- a/mdoc/mdoc.Test/FormatterTests.cs +++ b/mdoc/mdoc.Test/FormatterTests.cs @@ -387,6 +387,22 @@ namespace mdoc.Test Assert.AreEqual(true, flag); } + [Test] + public void CSharpRefStructTest() + { + var type = GetType(typeof(SampleClasses.RefStruct)); + var typeSignature = formatter.GetDeclaration(type); + Assert.AreEqual("public ref struct RefStruct", typeSignature); + } + + [Test] + public void CSharpReadOnlyRefStructTest() + { + var type = GetType(typeof(SampleClasses.ReadOnlyRefStruct)); + var typeSignature = formatter.GetDeclaration(type); + Assert.AreEqual("public readonly ref struct ReadOnlyRefStruct", typeSignature); + } + #region Helper Methods string RealTypeName(string name){ switch (name) { diff --git a/mdoc/mdoc.Test/SampleClasses/ReadOnlyRefStruct.cs b/mdoc/mdoc.Test/SampleClasses/ReadOnlyRefStruct.cs new file mode 100644 index 00000000..5a67d252 --- /dev/null +++ b/mdoc/mdoc.Test/SampleClasses/ReadOnlyRefStruct.cs @@ -0,0 +1,7 @@ +namespace mdoc.Test.SampleClasses +{ + public readonly ref struct ReadOnlyRefStruct + { + + } +}
\ No newline at end of file diff --git a/mdoc/mdoc.Test/SampleClasses/RefStruct.cs b/mdoc/mdoc.Test/SampleClasses/RefStruct.cs new file mode 100644 index 00000000..e912ffff --- /dev/null +++ b/mdoc/mdoc.Test/SampleClasses/RefStruct.cs @@ -0,0 +1,7 @@ +namespace mdoc.Test.SampleClasses +{ + public ref struct RefStruct + { + + } +} |