private TypeWithAnnotations GetConstraintTypeOrDefault(PEModuleSymbol moduleSymbol, MetadataReader metadataReader, MetadataDecoder tokenDecoder, GenericParameterConstraintHandle constraintHandle, ref bool hasUnmanagedModreqPattern) { var constraint = metadataReader.GetGenericParameterConstraint(constraintHandle); var typeSymbol = tokenDecoder.DecodeGenericParameterConstraint(constraint.Type, out ImmutableArray <ModifierInfo <TypeSymbol> > modifiers); if (!modifiers.IsDefaultOrEmpty && modifiers.Length > 1) { typeSymbol = new UnsupportedMetadataTypeSymbol(); } else if (typeSymbol.SpecialType == SpecialType.System_ValueType) { // recognize "(class [mscorlib]System.ValueType modreq([mscorlib]System.Runtime.InteropServices.UnmanagedType" pattern as "unmanaged" if (!modifiers.IsDefaultOrEmpty) { ModifierInfo <TypeSymbol> m = modifiers.Single(); if (!m.IsOptional && m.Modifier.IsWellKnownTypeUnmanagedType()) { hasUnmanagedModreqPattern = true; } else { // Any other modifiers, optional or not, are not allowed: http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528856 typeSymbol = new UnsupportedMetadataTypeSymbol(); } } // Drop 'System.ValueType' constraint type if the 'valuetype' constraint was also specified. if (typeSymbol.SpecialType == SpecialType.System_ValueType && ((_flags & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)) { return(default);
private NamedTypeSymbol RetargetNoPiaLocalType(NamedTypeSymbol type) { NamedTypeSymbol cached; var map = this.RetargetingAssembly.NoPiaUnificationMap; if (map.TryGetValue(type, out cached)) { return(cached); } // TODO:MetaDslx - find and evaluate RetargetingAttribute NamedTypeSymbol result = new UnsupportedMetadataTypeSymbol(); cached = map.GetOrAdd(type, result); return(cached); }