xamarin-macios/tests/cecil-tests/CecilExtensions.cs

116 строки
3.0 KiB
C#

using System;
using System.Text;
using Mono.Cecil;
namespace Xamarin.Utils {
public static partial class CecilExtensions {
// note: direct check, no inheritance
public static bool Is (this TypeReference type, string @namespace, string name)
{
return (type is not null) && (type.Name == name) && (type.Namespace == @namespace);
}
public static string AsOSPlatformAttributeString (this CustomAttribute ca)
{
if (ca.AttributeType.Namespace != "System.Runtime.Versioning")
throw new ArgumentOutOfRangeException ($"Not an OSPlatformAttribute: {ca.AttributeType.FullName}");
switch (ca.AttributeType.Name) {
case "UnsupportedOSPlatformAttribute":
return $"[UnsupportedOSPlatform (\"{(string) ca.ConstructorArguments [0].Value}\")]";
case "SupportedOSPlatformAttribute":
return $"[SupportedOSPlatform (\"{(string) ca.ConstructorArguments [0].Value}\")]";
case "ObsoletedOSPlatformAttribute":
return $"[ObsoletedOSPlatformAttribute (\"{(string) ca.ConstructorArguments [0].Value}\")]";
default:
throw new NotImplementedException (ca.AttributeType.FullName);
}
}
public static string AsString (this IMemberDefinition member)
{
if (member is MethodDefinition md) {
var rv = new StringBuilder ();
rv.Append (md.Name);
rv.Append ('(');
if (md.HasParameters) {
for (var i = 0; i < md.Parameters.Count; i++) {
if (i > 0)
rv.Append (", ");
var p = md.Parameters [0];
if (p.IsOut)
rv.Append ("out ");
rv.Append (p.ParameterType.FullName);
}
}
rv.Append (')');
return rv.ToString ();
}
if (member is FieldDefinition fd)
return fd.Name;
if (member is PropertyDefinition pd)
return pd.Name;
return member.ToString ();
}
public static string AsFullName (this ICustomAttributeProvider member)
{
if (member is MethodDefinition md) {
var rv = new StringBuilder ();
rv.Append (AsFullName (md.DeclaringType));
rv.Append ('.');
rv.Append (md.Name);
if (md.HasGenericParameters) {
rv.Append ("`");
rv.Append (md.GenericParameters.Count.ToString ());
}
rv.Append ('(');
if (md.HasParameters) {
for (var i = 0; i < md.Parameters.Count; i++) {
if (i > 0)
rv.Append (", ");
var p = md.Parameters [i];
if (p.IsOut)
rv.Append ("out ");
rv.Append (p.ParameterType.FullName);
}
}
rv.Append (')');
if (md.IsSpecialName && (md.Name == "op_Explicit" || md.Name == "op_Implicit")) {
rv.Append (" => ");
rv.Append (md.ReturnType.FullName);
}
return rv.ToString ();
}
if (member is FieldDefinition fd)
return fd.FullName;
if (member is PropertyDefinition pd)
return pd.FullName;
if (member is EventDefinition ed)
return ed.FullName + " (event)";
if (member is IMemberDefinition imd)
return imd.FullName;
return member.ToString ();
}
public static string GetOSPlatformAttributePlatformName (this CustomAttribute ca)
{
return (string) ca.ConstructorArguments [0].Value;
}
}
}