示例#1
0
        /// <summary>
        /// Gets type mask corresponding to given qualified name within this context.
        /// </summary>
        public TypeRefMask GetTypeMask(QualifiedName qname, bool includesSubclasses = true)
        {
            if (qname.IsReservedClassName)
            {
                return(GetTypeMaskOfReservedClassName(qname.Name));
            }

            return(GetTypeMask(TypeRefFactory.CreateTypeRef(qname), includesSubclasses));
        }
示例#2
0
        /// <summary>
        /// Gets type mask corresponding to given TypeRef within this context.
        /// </summary>
        public TypeRefMask GetTypeMask(AST.TypeRef /*!*/ tref, bool includesSubclasses = true)
        {
            Contract.ThrowIfNull(tref);

            if (tref != null)
            {
                if (tref is AST.PrimitiveTypeRef)
                {
                    switch (((AST.PrimitiveTypeRef)tref).PrimitiveTypeName)
                    {
                    case AST.PrimitiveTypeRef.PrimitiveType.@int: return(GetLongTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.@float: return(GetDoubleTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.@string: return(GetStringTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.@bool: return(GetBooleanTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.array: return(GetArrayTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.callable: return(GetCallableTypeMask());

                    case AST.PrimitiveTypeRef.PrimitiveType.@void: return(0);

                    case AST.PrimitiveTypeRef.PrimitiveType.iterable: return(GetArrayTypeMask() | GetTypeMask(NameUtils.SpecialNames.Traversable, true));      // array | Traversable

                    case AST.PrimitiveTypeRef.PrimitiveType.@object: return(GetSystemObjectTypeMask());

                    default: throw new ArgumentException();
                    }
                }
                else if (tref is AST.INamedTypeRef named)
                {
                    return(GetTypeMask(named.ClassName, includesSubclasses));
                }
                else if (tref is AST.ReservedTypeRef reserved)
                {
                    return(GetTypeMaskOfReservedClassName(reserved.QualifiedName.Value.Name));
                }
                else if (tref is AST.AnonymousTypeRef)
                {
                    return(GetTypeMask(((AST.AnonymousTypeRef)tref).TypeDeclaration.GetAnonymousTypeQualifiedName(), false));
                }
                else if (tref is AST.MultipleTypeRef)
                {
                    TypeRefMask result = 0;
                    foreach (var x in ((AST.MultipleTypeRef)tref).MultipleTypes)
                    {
                        result |= GetTypeMask(x, includesSubclasses);
                    }
                    return(result);
                }
                else if (tref is AST.NullableTypeRef nullable)
                {
                    return(GetTypeMask(nullable.TargetType) | this.GetNullTypeMask());
                }
                else if (tref is AST.GenericTypeRef)
                {
                    return(GetTypeMask(TypeRefFactory.CreateTypeRef(tref), includesSubclasses));
                }
                else if (tref is AST.IndirectTypeRef)
                {
                    return(GetTypeMask((AST.IndirectTypeRef)tref, true));
                }
            }

            return(TypeRefMask.AnyType);
        }