Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/api-doc-tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMin Huang <huangmin@microsoft.com>2022-02-15 11:22:34 +0300
committerGitHub <noreply@github.com>2022-02-15 11:22:34 +0300
commite942ab5362331935a058d2430bb32601aa0baaa2 (patch)
treee0ad4bb382f92f0ddc4e52a3d59fdf58f5d71625
parentb0c005e123292ded9f3c9eb1386728c4d28e28f5 (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.cs7
-rw-r--r--mdoc/Mono.Documentation/Updater/DocUtils.cs13
-rw-r--r--mdoc/Mono.Documentation/Updater/Formatters/CSharpFullMemberFormatter.cs17
-rw-r--r--mdoc/mdoc.Test/DocUtilsTests.cs16
-rw-r--r--mdoc/mdoc.Test/FormatterTests.cs16
-rw-r--r--mdoc/mdoc.Test/SampleClasses/ReadOnlyRefStruct.cs7
-rw-r--r--mdoc/mdoc.Test/SampleClasses/RefStruct.cs7
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
+ {
+
+ }
+}