コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: TypeManager.cs プロジェクト: sfuller/MonC
        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);
        }
コード例 #3
0
 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
     });
 }