private static bool GetTypeNamespaceAndName()

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