Esempio n. 1
0
        private DefType ResolveTypeReference(TypeReferenceHandle handle)
        {
            TypeReference typeReference = _metadataReader.GetTypeReference(handle);

            if (typeReference.ParentNamespaceOrType.HandleType == HandleType.TypeReference)
            {
                // Nested type case
                MetadataType containingType = (MetadataType)ResolveTypeReference(typeReference.ParentNamespaceOrType.ToTypeReferenceHandle(_metadataReader));

                return(containingType.GetNestedType(_metadataReader.GetString(typeReference.TypeName)));
            }
            else
            {
                // Cross-assembly reference
                // Get remote module, and then lookup by namespace/name
                ScopeReferenceHandle     scopeReferenceHandle            = default(ScopeReferenceHandle);
                NamespaceReferenceHandle initialNamespaceReferenceHandle = typeReference.ParentNamespaceOrType.ToNamespaceReferenceHandle(_metadataReader);
                NamespaceReferenceHandle namespaceReferenceHandle        = initialNamespaceReferenceHandle;
                do
                {
                    NamespaceReference namespaceReference = _metadataReader.GetNamespaceReference(namespaceReferenceHandle);
                    if (namespaceReference.ParentScopeOrNamespace.HandleType == HandleType.ScopeReference)
                    {
                        scopeReferenceHandle = namespaceReference.ParentScopeOrNamespace.ToScopeReferenceHandle(_metadataReader);
                    }
                    else
                    {
                        namespaceReferenceHandle = namespaceReference.ParentScopeOrNamespace.ToNamespaceReferenceHandle(_metadataReader);
                    }
                } while (scopeReferenceHandle.IsNull(_metadataReader));

                ModuleDesc remoteModule = GetModule(scopeReferenceHandle);

                string namespaceName = _metadataReader.GetNamespaceName(initialNamespaceReferenceHandle);
                string typeName      = _metadataReader.GetString(typeReference.TypeName);

                MetadataType resolvedType = remoteModule.GetType(namespaceName, typeName, throwIfNotFound: false);
                if (resolvedType != null)
                {
                    return(resolvedType);
                }

                // Special handling for the magic __Canon types cannot be currently put into
                // NativeFormatModule because GetType returns a MetadataType.
                if (remoteModule == _context.SystemModule)
                {
                    string qualifiedTypeName = namespaceName + "." + typeName;
                    if (qualifiedTypeName == CanonType.FullName)
                    {
                        return(_context.CanonType);
                    }
                    if (qualifiedTypeName == UniversalCanonType.FullName)
                    {
                        return(_context.UniversalCanonType);
                    }
                }

                throw new NotImplementedException();
            }
        }