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));
        }
Example #2
0
 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);
 }
Example #3
0
 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);
 }
Example #4
0
        private MemberExpansion(MemberAndDeclarationInfo[] members, CustomTypeInfoTypeArgumentMap customTypeInfoMap)
        {
            Debug.Assert(members != null);
            Debug.Assert(members.Length > 0);
            Debug.Assert(customTypeInfoMap != null);

            _members = members;
            _customTypeInfoMap = customTypeInfoMap;
        }
Example #5
0
        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();
        }
Example #6
0
 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);
 }
Example #7
0
 internal static Expansion CreateExpansion(
     MemberAndDeclarationInfo members,
     CustomTypeInfoTypeArgumentMap customTypeInfoMap)
 {
     return new RootHiddenExpansion(members, customTypeInfoMap);
 }
Example #8
0
 internal RootHiddenExpansion(MemberAndDeclarationInfo member, CustomTypeInfoTypeArgumentMap customTypeInfoMap)
 {
     _member = member;
     _customTypeInfoMap = customTypeInfoMap;
 }