示例#1
0
        public TypeRef GetTypeFromReference(MetadataReader mr, TypeReferenceHandle handle, byte rawTypeKind)
        {
            var type_ref   = mr.GetTypeReference(handle);
            var @namespace = mr.GetString(type_ref.Namespace);
            var name       = mr.GetString(type_ref.Name);

            if (!type_ref.ResolutionScope.IsNil)
            {
                if (type_ref.ResolutionScope.Kind == HandleKind.ModuleDefinition)
                {
                    var api = this.api_namespace_map[@namespace];
                    return(new TypeRef.User(api.top_level_types[api.type_name_fqn_map[name]]));
                }
                else if (type_ref.ResolutionScope.Kind == HandleKind.TypeReference)
                {
                    TypeGenInfo enclosing_type_ref = this.resolveEnclosingType(mr, (TypeReferenceHandle)type_ref.ResolutionScope);
                    Debug.Assert(@namespace.Length == 0, "I thought all nested types had empty namespaces");
                    return(new TypeRef.User(enclosing_type_ref.getNestedTypeByName(name)));
                }
                else if (type_ref.ResolutionScope.Kind == HandleKind.AssemblyReference)
                {
                    // This occurs for System.Guid, not sure if it is supposed to
                    if (@namespace == "System")
                    {
                        if (name == "Guid")
                        {
                            return(TypeRef.Guid.Instance);
                        }
                    }
                    else if (@namespace == "Windows.System")
                    {
                        if (name == "DispatcherQueueController")
                        {
                            return(new TypeRef.UnhandledClrType(@namespace, name));
                        }
                    }
                    throw new InvalidOperationException();
                }
            }
            throw new InvalidDataException(string.Format(
                                               "unexpected type reference resolution scope IsNil {0} and/or Kind {1}",
                                               type_ref.ResolutionScope.IsNil,
                                               type_ref.ResolutionScope.Kind));
        }
示例#2
0
        private TypeGenInfo resolveEnclosingType(MetadataReader mr, TypeReferenceHandle type_ref_handle)
        {
            var type_ref   = mr.GetTypeReference(type_ref_handle);
            var @namespace = mr.GetString(type_ref.Namespace);
            var name       = mr.GetString(type_ref.Name);

            if (!type_ref.ResolutionScope.IsNil)
            {
                if (type_ref.ResolutionScope.Kind == HandleKind.ModuleDefinition)
                {
                    Api api = this.api_namespace_map[@namespace];
                    return(api.top_level_types[api.type_name_fqn_map[name]]);
                }

                if (type_ref.ResolutionScope.Kind == HandleKind.TypeReference)
                {
                    TypeGenInfo enclosing_type_ref = this.resolveEnclosingType(mr, (TypeReferenceHandle)type_ref.ResolutionScope);
                    Debug.Assert(@namespace.Length == 0, "I thought all nested types had empty namespaces");
                    return(enclosing_type_ref.getNestedTypeByName(name));
                }
            }

            throw new NotImplementedException("unexpected ResolutionScope for enclosing type");
        }