File: TypeDefinitionExtensions.cs
Web Access
Project: src\src\Controls\src\Build.Tasks\Controls.Build.Tasks.csproj (Microsoft.Maui.Controls.Build.Tasks)
using System;
using System.Collections.Generic;
using System.Reflection;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MethodAttributes = Mono.Cecil.MethodAttributes;
using MethodImplAttributes = Mono.Cecil.MethodImplAttributes;
 
namespace Microsoft.Maui.Controls.Build.Tasks
{
	static class TypeDefinitionExtensions
	{
		public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, XamlCache cache)
		{
			var module = targetType.Module;
			var parentType = module.ImportReference(cache, ("mscorlib", "System", "Object"));
 
			return AddDefaultConstructor(targetType, cache, parentType);
		}
 
		public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, XamlCache cache, TypeReference parentType)
		{
			var module = targetType.Module;
			var voidType = module.ImportReference(cache, ("mscorlib", "System", "Void"));
			var methodAttributes = MethodAttributes.Public |
								   MethodAttributes.HideBySig |
								   MethodAttributes.SpecialName |
								   MethodAttributes.RTSpecialName;
 
			var parentctor = module.ImportCtorReference(cache, parentType, paramCount: 0) ?? module.ImportCtorReference(cache, ("mscorlib", "System", "Object"), parameterTypes: null);
 
			var ctor = new MethodDefinition(".ctor", methodAttributes, voidType)
			{
				CallingConvention = MethodCallingConvention.Default,
				ImplAttributes = (MethodImplAttributes.IL | MethodImplAttributes.Managed)
			};
			ctor.Body.InitLocals = true;
 
			var IL = ctor.Body.GetILProcessor();
 
			IL.Emit(OpCodes.Ldarg_0);
			IL.Emit(OpCodes.Call, parentctor);
			IL.Emit(OpCodes.Ret);
 
			targetType.Methods.Add(ctor);
			return ctor;
		}
 
		public static IEnumerable<(MethodDefinition methodDef, TypeReference declTypeRef)> AllMethods(this TypeDefinition self, XamlCache cache)
		{
			TypeReference selfTypeRef = self;
			while (self != null)
			{
				foreach (var md in self.Methods)
					yield return (md, selfTypeRef);
				selfTypeRef = self.BaseType;
				self = self.BaseType?.ResolveCached(cache);
			}
		}
 
		public static bool IsPublicOrVisibleInternal(this TypeDefinition self, ModuleDefinition module)
		{
			if (self.IsPublic || self.IsNestedPublic)
				return true;
			if (self.Module == module)
				return true;
			if (self.Module.IsVisibleInternal(module))
				return true;
			return false;
		}
	}
}