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