public GetTypeMask ( Devsense.PHP.Syntax.Ast tref, bool includesSubclasses = true ) : TypeRefMask | ||
tref | Devsense.PHP.Syntax.Ast | |
includesSubclasses | bool | |
return | TypeRefMask |
/// <summary> /// Gets type mask representing given type name. /// </summary> public static TypeRefMask GetTypeMask(TypeRefContext /*!*/ typeCtx, string tname, NamingContext naming, bool fullyQualified = false) { if (!string.IsNullOrEmpty(tname)) { // handle various array conventions if (tname.LastCharacter() == ']') { // "TName[]" if (tname.EndsWith("[]", StringComparison.Ordinal)) { var elementType = GetTypeMask(typeCtx, tname.Remove(tname.Length - 2), naming, fullyQualified); return(typeCtx.GetArrayTypeMask(elementType)); } // "array[TName]" var arrayTypeName = QualifiedName.Array.Name.Value; if (tname.Length > arrayTypeName.Length && tname[arrayTypeName.Length] == '[' && tname.StartsWith(arrayTypeName, StringComparison.OrdinalIgnoreCase)) { var elementTypeName = tname.Substring(arrayTypeName.Length + 1, tname.Length - arrayTypeName.Length - 2); var elementType = GetTypeMask(typeCtx, elementTypeName, naming, fullyQualified); return(typeCtx.GetArrayTypeMask(elementType)); } // unknown something // ... } else if (tname[0] == '&') { return(GetTypeMask(typeCtx, tname.Substring(1), naming, fullyQualified).WithRefFlag); } else { var result = GetKnownTypeMask(typeCtx, tname); if (result.IsUninitialized) { var qname = NameUtils.MakeQualifiedName(tname, false); if (!fullyQualified && naming != null && !qname.IsReservedClassName) { qname = QualifiedName.TranslateAlias(qname, AliasKind.Type, naming.Aliases, naming.CurrentNamespace); } if (qname.IsPrimitiveTypeName) { result = GetKnownTypeMask(typeCtx, qname.Name.Value); if (!result.IsUninitialized) { return(result); } } result = typeCtx.GetTypeMask(qname, true); } //Contract.Assert(!result.IsUninitialized); return(result); } } return(0); }
private static void AddTypeIfInContext( TypeRefContext typeCtx, Func <ITypeRef, bool> selector, bool includeSubclasses, ref TypeRefMask mask) { var closureTypeRef = typeCtx.Types.FirstOrDefault(selector); if (closureTypeRef != null) { mask |= typeCtx.GetTypeMask(closureTypeRef, includeSubclasses); } }
/// <summary> /// Gets type mask representing given type name. /// </summary> public static TypeRefMask GetTypeMask(TypeRefContext/*!*/typeCtx, string tname, NamingContext naming, bool fullyQualified = false) { if (!string.IsNullOrEmpty(tname)) { // handle various array conventions if (tname.LastCharacter() == ']') { // "TName[]" if (tname.EndsWith("[]", StringComparison.Ordinal)) { var elementType = GetTypeMask(typeCtx, tname.Remove(tname.Length - 2), naming, fullyQualified); return typeCtx.GetArrayTypeMask(elementType); } // "array[TName]" var arrayTypeName = QualifiedName.Array.Name.Value; if (tname.Length > arrayTypeName.Length && tname[arrayTypeName.Length] == '[' && tname.StartsWith(arrayTypeName, StringComparison.OrdinalIgnoreCase)) { var elementTypeName = tname.Substring(arrayTypeName.Length + 1, tname.Length - arrayTypeName.Length - 2); var elementType = GetTypeMask(typeCtx, elementTypeName, naming, fullyQualified); return typeCtx.GetArrayTypeMask(elementType); } // unknown something // ... } else { var result = GetKnownTypeMask(typeCtx, tname); if (result.IsUninitialized) { var qname = NameUtils.MakeQualifiedName(tname, false); if (!fullyQualified && naming != null && !qname.IsReservedClassName) qname = QualifiedName.TranslateAlias(qname, AliasKind.Type, naming.Aliases, naming.CurrentNamespace); if (qname.IsPrimitiveTypeName) { result = GetKnownTypeMask(typeCtx, qname.Name.Value); if (!result.IsUninitialized) return result; } result = typeCtx.GetTypeMask(qname, true); } //Contract.Assert(!result.IsUninitialized); return result; } } return 0; }