|
// 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);
}
}
}
|