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