private static ITypeSymbol GetTypeForVirtualGenericMethod(IMethodSymbol method, ITypeSymbol type, ISymbol containingSymbol) { if (type.TypeKind == TypeKind.ArrayType) { var sourceArrayType = (IArrayTypeSymbol)type; var arrayType = new ArrayTypeImpl(sourceArrayType); arrayType.ElementType = GetTypeForVirtualGenericMethod(method, sourceArrayType.ElementType, containingSymbol); return(arrayType); } if (type.TypeKind == TypeKind.PointerType) { var sourcePointerType = (IPointerTypeSymbol)type; var pointerType = new PointerTypeImpl(); pointerType.PointedAtType = GetTypeForVirtualGenericMethod(method, sourcePointerType.PointedAtType, containingSymbol); return(pointerType); } if (type.TypeKind == TypeKind.TypeParameter) { for (var i = 0; i < method.TypeParameters.Length; i++) { var typeParameter = method.TypeParameters[i]; if (typeParameter.Name == type.Name) { return(method.TypeArguments[i]); } } return(new TypeImpl { SpecialType = SpecialType.System_Object }); } var namedTypeImpl = new NamedTypeImpl((INamedTypeSymbol)type); namedTypeImpl.ContainingSymbol = containingSymbol; namedTypeImpl.TypeArguments = ImmutableArray.Create( namedTypeImpl.TypeArguments.Select( ta => method.TypeArguments.Contains(ta) ? new TypeImpl(ta) { ContainingSymbol = containingSymbol } : ta) .OfType <ITypeSymbol>() .ToArray()); return(namedTypeImpl); }
public IType GetType(IValueType valueType, PointerMode pointerMode) { if (!_valueTypes.TryGetValue(valueType, out TypeGroup typeGroup)) { throw new ArgumentException("Value type is not registered", nameof(valueType)); } IType?type = typeGroup.GetTypeForPointerMode(pointerMode); if (type == null) { IPointerType pointerType = new PointerTypeImpl(typeGroup.Value, pointerMode); type = pointerType; typeGroup.SetTypeForPointerMode(pointerMode, pointerType); _valueTypes[valueType] = typeGroup; } return(type); }
public GetInterfaceVirtualMethod(INamedTypeSymbol type) { Name = "__get_interface"; MetadataName = Name; MethodKind = MethodKind.Ordinary; ContainingType = type; ReceiverType = type; ContainingNamespace = type.ContainingNamespace; IsVirtual = true; IsOverride = type.BaseType != null; ReturnType = new PointerTypeImpl { PointedAtType = new TypeImpl { SpecialType = SpecialType.System_Void } }; Parameters = ImmutableArray.Create <IParameterSymbol>(new ParameterImpl { Name = "value", Type = type.GetBaseType().GetMembers().OfType <IMethodSymbol>().First(m => m.Name == "GetType").ReturnType }); }