File: Linker\ModuleDefinitionExtensions.cs
Web Access
Project: src\src\tools\illink\src\linker\Mono.Linker.csproj (illink)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System.Diagnostics.CodeAnalysis;
using Mono.Cecil;
 
#nullable enable
 
namespace Mono.Linker
{
	internal static class ModuleDefinitionExtensions
	{
		public static bool IsCrossgened (this ModuleDefinition module)
		{
			return (module.Attributes & ModuleAttributes.ILOnly) == 0 &&
				(module.Attributes & ModuleAttributes.ILLibrary) != 0;
		}
 
		public static bool GetMatchingExportedType (this ModuleDefinition module, TypeDefinition typeDefinition, ITryResolveMetadata context, [NotNullWhen (true)] out ExportedType? exportedType)
		{
			exportedType = null;
			if (!module.HasExportedTypes)
				return false;
 
			foreach (var et in module.ExportedTypes) {
				if (context.TryResolve (et) == typeDefinition) {
					exportedType = et;
					return true;
				}
			}
 
			return false;
		}
 
		public static TypeDefinition? ResolveType (this ModuleDefinition module, string typeFullName, ITryResolveMetadata resolver)
		{
			var type = module.GetType (typeFullName);
			if (type != null)
				return type;
 
			if (!module.HasExportedTypes)
				return null;
 
			// When resolving a forwarded type from a string, typeFullName should be a simple type name.
			int idx = typeFullName.LastIndexOf ('.');
			(string typeNamespace, string typeName) = idx > 0 ? (typeFullName.Substring (0, idx), typeFullName.Substring (idx + 1)) :
				(string.Empty, typeFullName);
 
			TypeReference typeReference = new TypeReference (typeNamespace, typeName, module, module);
			return resolver.TryResolve (typeReference);
		}
	}
}