in SharpGenTools.Sdk/Extensibility/ExtensionFileReference.cs [277:336]
private static bool GetTypeNamespaceAndName(MetadataReader metadataReader, EntityHandle typeDefOrRef,
out StringHandle namespaceHandle, out StringHandle nameHandle)
{
nameHandle = default;
namespaceHandle = default;
try
{
return typeDefOrRef.Kind switch
{
HandleKind.TypeReference => GetTypeRefNamespaceAndName(
(TypeReferenceHandle) typeDefOrRef, ref namespaceHandle, ref nameHandle
),
HandleKind.TypeDefinition => GetTypeDefNamespaceAndName(
(TypeDefinitionHandle) typeDefOrRef, ref namespaceHandle, ref nameHandle
),
_ => false
};
}
catch (BadImageFormatException)
{
return false;
}
bool GetTypeDefNamespaceAndName(TypeDefinitionHandle typeDefHandle, ref StringHandle namespaceHandle,
ref StringHandle nameHandle)
{
var def = metadataReader.GetTypeDefinition(typeDefHandle);
if (IsNested(def.Attributes))
{
// TODO - Support nested types.
return false;
}
nameHandle = def.Name;
namespaceHandle = def.Namespace;
return true;
static bool IsNested(TypeAttributes flags) =>
(flags & TypeAttributes.NestedFamANDAssem) != 0;
}
bool GetTypeRefNamespaceAndName(TypeReferenceHandle typeRefHandle, ref StringHandle namespaceHandle,
ref StringHandle nameHandle)
{
var typeRefRow = metadataReader.GetTypeReference(typeRefHandle);
var handleType = typeRefRow.ResolutionScope.Kind;
if (handleType == HandleKind.TypeReference || handleType == HandleKind.TypeDefinition)
{
// TODO - Support nested types.
return false;
}
nameHandle = typeRefRow.Name;
namespaceHandle = typeRefRow.Namespace;
return true;
}
}