internal TypeVariablesExpansion(TypeAndCustomInfo declaredTypeAndInfo) { var declaredType = declaredTypeAndInfo.Type; Debug.Assert(declaredType.IsGenericType); Debug.Assert(!declaredType.IsGenericTypeDefinition); _customTypeInfoMap = CustomTypeInfoTypeArgumentMap.Create(declaredTypeAndInfo); var typeDef = declaredType.GetGenericTypeDefinition(); _typeParameters = typeDef.GetGenericArguments(); _typeArguments = declaredType.GetGenericArguments(); Debug.Assert(_typeParameters.Length == _typeArguments.Length); Debug.Assert(Array.TrueForAll(_typeParameters, t => t.IsGenericParameter)); Debug.Assert(Array.TrueForAll(_typeArguments, t => !t.IsGenericParameter)); }
internal static EvalResult CreateMemberDataItem( ResultProvider resultProvider, DkmInspectionContext inspectionContext, MemberAndDeclarationInfo member, DkmClrValue memberValue, EvalResultDataItem parent, CustomTypeInfoTypeArgumentMap customTypeInfoMap, ExpansionFlags flags) { var fullNameProvider = resultProvider.FullNameProvider; var declaredType = member.Type; var declaredTypeInfo = customTypeInfoMap.SubstituteCustomTypeInfo(member.OriginalDefinitionType, member.TypeInfo); string memberName; // Considering, we're not handling the case of a member inherited from a generic base type. var typeDeclaringMember = member.GetExplicitlyImplementedInterface(out memberName) ?? member.DeclaringType; var typeDeclaringMemberInfo = typeDeclaringMember.IsInterface ? customTypeInfoMap.SubstituteCustomTypeInfo(typeDeclaringMember.GetInterfaceListEntry(member.DeclaringType), customInfo: null) : null; var memberNameForFullName = fullNameProvider.GetClrValidIdentifier(inspectionContext, memberName); var appDomain = memberValue.Type.AppDomain; string fullName; if (memberNameForFullName == null) { fullName = null; } else { memberName = memberNameForFullName; fullName = MakeFullName( fullNameProvider, inspectionContext, memberNameForFullName, new TypeAndCustomInfo(DkmClrType.Create(appDomain, typeDeclaringMember), typeDeclaringMemberInfo), // Note: Won't include DynamicAttribute. member.RequiresExplicitCast, member.IsStatic, parent); } return resultProvider.CreateDataItem( inspectionContext, memberName, typeDeclaringMemberAndInfo: (member.IncludeTypeInMemberName || typeDeclaringMember.IsInterface) ? new TypeAndCustomInfo(DkmClrType.Create(appDomain, typeDeclaringMember), typeDeclaringMemberInfo) : default(TypeAndCustomInfo), // Note: Won't include DynamicAttribute. declaredTypeAndInfo: new TypeAndCustomInfo(DkmClrType.Create(appDomain, declaredType), declaredTypeInfo), value: memberValue, useDebuggerDisplay: parent != null, expansionFlags: flags, childShouldParenthesize: false, fullName: fullName, formatSpecifiers: Formatter.NoFormatSpecifiers, category: DkmEvaluationResultCategory.Other, flags: memberValue.EvalFlags, evalFlags: DkmEvaluationFlags.None); }
private static EvalResult GetMemberRow( ResultProvider resultProvider, DkmInspectionContext inspectionContext, DkmClrValue value, MemberAndDeclarationInfo member, EvalResultDataItem parent, CustomTypeInfoTypeArgumentMap customTypeInfoMap) { var memberValue = value.GetMemberValue(member, inspectionContext); return CreateMemberDataItem( resultProvider, inspectionContext, member, memberValue, parent, customTypeInfoMap, ExpansionFlags.All); }
private MemberExpansion(MemberAndDeclarationInfo[] members, CustomTypeInfoTypeArgumentMap customTypeInfoMap) { Debug.Assert(members != null); Debug.Assert(members.Length > 0); Debug.Assert(customTypeInfoMap != null); _members = members; _customTypeInfoMap = customTypeInfoMap; }
private static void GetPublicAndNonPublicMembers( ArrayBuilder<MemberAndDeclarationInfo> allMembers, CustomTypeInfoTypeArgumentMap customTypeInfoMap, out Expansion publicExpansion, out Expansion nonPublicExpansion) { var publicExpansions = ArrayBuilder<Expansion>.GetInstance(); var publicMembers = ArrayBuilder<MemberAndDeclarationInfo>.GetInstance(); var nonPublicMembers = ArrayBuilder<MemberAndDeclarationInfo>.GetInstance(); foreach (var member in allMembers) { if (member.BrowsableState.HasValue) { switch (member.BrowsableState.Value) { case DkmClrDebuggerBrowsableAttributeState.RootHidden: if (publicMembers.Count > 0) { publicExpansions.Add(new MemberExpansion(publicMembers.ToArray(), customTypeInfoMap)); publicMembers.Clear(); } publicExpansions.Add(new RootHiddenExpansion(member, customTypeInfoMap)); continue; case DkmClrDebuggerBrowsableAttributeState.Never: continue; } } if (member.HideNonPublic && !member.IsPublic) { nonPublicMembers.Add(member); } else { publicMembers.Add(member); } } if (publicMembers.Count > 0) { publicExpansions.Add(new MemberExpansion(publicMembers.ToArray(), customTypeInfoMap)); } publicMembers.Free(); publicExpansion = AggregateExpansion.CreateExpansion(publicExpansions); publicExpansions.Free(); nonPublicExpansion = (nonPublicMembers.Count > 0) ? new NonPublicMembersExpansion( members: new MemberExpansion(nonPublicMembers.ToArray(), customTypeInfoMap)) : null; nonPublicMembers.Free(); }
private static TypeAndCustomInfo GetTupleFieldTypeAndInfo( DkmClrAppDomain appDomain, FieldInfo field, CustomTypeInfoTypeArgumentMap customTypeInfoMap) { var declaringTypeDef = field.DeclaringType.GetGenericTypeDefinition(); var fieldDef = declaringTypeDef.GetTupleField(field.Name); var fieldType = DkmClrType.Create(appDomain, field.FieldType); var fieldTypeInfo = customTypeInfoMap.SubstituteCustomTypeInfo(fieldDef.FieldType, null); return new TypeAndCustomInfo(fieldType, fieldTypeInfo); }
internal static Expansion CreateExpansion( MemberAndDeclarationInfo members, CustomTypeInfoTypeArgumentMap customTypeInfoMap) { return new RootHiddenExpansion(members, customTypeInfoMap); }
internal RootHiddenExpansion(MemberAndDeclarationInfo member, CustomTypeInfoTypeArgumentMap customTypeInfoMap) { _member = member; _customTypeInfoMap = customTypeInfoMap; }