internal DynamicFlagsCustomTypeInfo SubstituteDynamicFlags(Type type, DynamicFlagsCustomTypeInfo originalDynamicFlags) { if (_typeDefinition == null) { return(originalDynamicFlags); } var substitutedFlags = ArrayBuilder <bool> .GetInstance(); int f = 0; foreach (Type curr in new TypeWalker(type)) { if (curr.IsGenericParameter && curr.DeclaringType.Equals(_typeDefinition)) { AppendFlagsFor(curr, substitutedFlags); } else { substitutedFlags.Add(originalDynamicFlags[f]); } f++; } var result = DynamicFlagsCustomTypeInfo.Create(substitutedFlags); substitutedFlags.Free(); return(result); }
/// <returns>The qualified name (i.e. including containing types and namespaces) of a named, /// pointer, or array type.</returns> internal string GetTypeName(TypeAndCustomInfo typeAndInfo, bool escapeKeywordIdentifiers, out bool sawInvalidIdentifier) { var type = typeAndInfo.Type; if (type == null) { throw new ArgumentNullException(nameof(type)); } var dynamicFlags = DynamicFlagsCustomTypeInfo.Create(typeAndInfo.Info); var index = 0; var pooled = PooledStringBuilder.GetInstance(); AppendQualifiedTypeName(pooled.Builder, type, dynamicFlags, ref index, escapeKeywordIdentifiers, out sawInvalidIdentifier); return(pooled.ToStringAndFree()); }
internal DkmEvaluationAsyncResult FormatAsyncResult(string name, string fullName, DkmClrValue value, DkmClrType declaredType = null, bool[] declaredTypeInfo = null, DkmInspectionContext inspectionContext = null) { DkmEvaluationAsyncResult asyncResult = default(DkmEvaluationAsyncResult); var workList = new DkmWorkList(); value.GetResult( workList, DeclaredType: declaredType ?? value.Type, CustomTypeInfo: DynamicFlagsCustomTypeInfo.Create(declaredTypeInfo).GetCustomTypeInfo(), InspectionContext: inspectionContext ?? DefaultInspectionContext, FormatSpecifiers: Formatter.NoFormatSpecifiers, ResultName: name, ResultFullName: fullName, CompletionRoutine: r => asyncResult = r); workList.Execute(); return(asyncResult); }
internal DkmEvaluationResult FormatResult(string name, string fullName, DkmClrValue value, DkmClrType declaredType = null, bool[] declaredTypeInfo = null, DkmInspectionContext inspectionContext = null) { DkmEvaluationResult evaluationResult = null; var workList = new DkmWorkList(); _resultProvider.GetResult( value, workList, declaredType: declaredType ?? value.Type, customTypeInfo: DynamicFlagsCustomTypeInfo.Create(declaredTypeInfo).GetCustomTypeInfo(), inspectionContext: inspectionContext ?? DefaultInspectionContext, formatSpecifiers: Formatter.NoFormatSpecifiers, resultName: name, resultFullName: null, completionRoutine: asyncResult => evaluationResult = asyncResult.Result); workList.Execute(); return(evaluationResult); }
internal static DynamicFlagsMap Create(TypeAndCustomInfo typeAndInfo) { var type = typeAndInfo.Type; Debug.Assert(type != null); if (!type.IsGenericType) { return(s_empty); } var dynamicFlags = DynamicFlagsCustomTypeInfo.Create(typeAndInfo.Info); if (!dynamicFlags.Any()) { return(s_empty); } var typeDefinition = type.GetGenericTypeDefinition(); Debug.Assert(typeDefinition != null); var typeArgs = type.GetGenericArguments(); Debug.Assert(typeArgs.Length > 0); int pos = 1; // Consider "type" to have already been consumed. var startsBuilder = ArrayBuilder <int> .GetInstance(); foreach (var typeArg in typeArgs) { startsBuilder.Add(pos); foreach (Type curr in new TypeWalker(typeArg)) { pos++; } } Debug.Assert(pos > 1); startsBuilder.Add(pos); return(new DynamicFlagsMap(typeDefinition, dynamicFlags, startsBuilder.ToArrayAndFree())); }
public static DynamicFlagsCustomTypeInfo GetDynamicFlags(this IList <CustomAttributeData> attributes) { foreach (var attribute in attributes) { if (attribute.Constructor.DeclaringType.IsType("System.Runtime.CompilerServices", "DynamicAttribute")) { var arguments = attribute.ConstructorArguments; if (arguments.Count == 0) { var builder = ArrayBuilder <bool> .GetInstance(1); builder.Add(true); var result = DynamicFlagsCustomTypeInfo.Create(builder); builder.Free(); return(result); } else if (arguments.Count == 1) { var argumentType = arguments[0].ArgumentType; if (argumentType.IsArray && argumentType.GetElementType().IsBoolean()) { // Per https://msdn.microsoft.com/en-us/library/system.reflection.customattributetypedargument.argumenttype(v=vs.110).aspx, // if ArgumentType indicates an array, then Value will actually be a ReadOnlyCollection. var collection = (ReadOnlyCollection <CustomAttributeTypedArgument>)arguments[0].Value; var numFlags = collection.Count; var builder = ArrayBuilder <bool> .GetInstance(numFlags); foreach (var typedArg in collection) { builder.Add((bool)typedArg.Value); } var result = DynamicFlagsCustomTypeInfo.Create(builder); builder.Free(); return(result); } } } } return(default(DynamicFlagsCustomTypeInfo)); }
internal Expansion GetTypeExpansion( DkmInspectionContext inspectionContext, TypeAndCustomInfo declaredTypeAndInfo, DkmClrValue value, ExpansionFlags flags) { var declaredType = declaredTypeAndInfo.Type; Debug.Assert(!declaredType.IsTypeVariables()); if ((inspectionContext.EvaluationFlags & DkmEvaluationFlags.NoExpansion) != 0) { return(null); } var runtimeType = value.Type.GetLmrType(); // If the value is an array, expand the array elements. if (runtimeType.IsArray) { var sizes = value.ArrayDimensions; if (sizes == null) { // Null array. No expansion. return(null); } var lowerBounds = value.ArrayLowerBounds; Type elementType; DkmClrCustomTypeInfo elementTypeInfo; if (declaredType.IsArray) { elementType = declaredType.GetElementType(); elementTypeInfo = DynamicFlagsCustomTypeInfo.Create(declaredTypeAndInfo.Info).SkipOne().GetCustomTypeInfo(); } else { elementType = runtimeType.GetElementType(); elementTypeInfo = null; } return(ArrayExpansion.CreateExpansion(new TypeAndCustomInfo(elementType, elementTypeInfo), sizes, lowerBounds)); } if (this.Formatter.IsPredefinedType(runtimeType)) { return(null); } if (declaredType.IsFunctionPointer()) { // Function pointers have no expansion return(null); } if (declaredType.IsPointer) { // If this ever happens, the element type info is just .SkipOne(). Debug.Assert(!DynamicFlagsCustomTypeInfo.Create(declaredTypeAndInfo.Info).Any()); var elementType = declaredType.GetElementType(); return(value.IsNull || elementType.IsVoid() ? null : new PointerDereferenceExpansion(new TypeAndCustomInfo(elementType))); } if (value.EvalFlags.Includes(DkmEvaluationResultFlags.ExceptionThrown) && runtimeType.IsEmptyResultsViewException()) { // The value is an exception thrown expanding an empty // IEnumerable. Use the runtime type of the exception and // skip base types. (This matches the native EE behavior // to expose a single property from the exception.) flags &= ~ExpansionFlags.IncludeBaseMembers; } return(MemberExpansion.CreateExpansion(inspectionContext, declaredTypeAndInfo, value, flags, TypeHelpers.IsVisibleMember, this.Formatter)); }
internal static EvalResultDataItem CreateMemberDataItem( ResultProvider resultProvider, DkmInspectionContext inspectionContext, MemberAndDeclarationInfo member, DkmClrValue memberValue, EvalResultDataItem parent, DynamicFlagsMap dynamicFlagsMap, ExpansionFlags flags) { var declaredType = member.Type; var declaredTypeInfo = dynamicFlagsMap.SubstituteDynamicFlags(member.OriginalDefinitionType, DynamicFlagsCustomTypeInfo.Create(member.TypeInfo)).GetCustomTypeInfo(); 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 ? dynamicFlagsMap.SubstituteDynamicFlags(typeDeclaringMember.GetInterfaceListEntry(member.DeclaringType), originalDynamicFlags: default(DynamicFlagsCustomTypeInfo)).GetCustomTypeInfo() : null; var formatter = resultProvider.Formatter; bool sawInvalidIdentifier; memberName = formatter.GetIdentifierEscapingPotentialKeywords(memberName, out sawInvalidIdentifier); var fullName = sawInvalidIdentifier ? null : MakeFullName( formatter, memberName, new TypeAndCustomInfo(typeDeclaringMember, typeDeclaringMemberInfo), // Note: Won't include DynamicAttribute. member.RequiresExplicitCast, member.IsStatic, parent); return(resultProvider.CreateDataItem( inspectionContext, memberName, typeDeclaringMemberAndInfo: (member.IncludeTypeInMemberName || typeDeclaringMember.IsInterface) ? new TypeAndCustomInfo(typeDeclaringMember, typeDeclaringMemberInfo) : default(TypeAndCustomInfo), // Note: Won't include DynamicAttribute. declaredTypeAndInfo: new TypeAndCustomInfo(declaredType, declaredTypeInfo), value: memberValue, parent: parent, expansionFlags: flags, childShouldParenthesize: false, fullName: fullName, formatSpecifiers: Formatter.NoFormatSpecifiers, category: DkmEvaluationResultCategory.Other, flags: memberValue.EvalFlags, evalFlags: DkmEvaluationFlags.None)); }
internal static EvalResult CreateMemberDataItem( ResultProvider resultProvider, DkmInspectionContext inspectionContext, MemberAndDeclarationInfo member, DkmClrValue memberValue, EvalResultDataItem parent, DynamicFlagsMap dynamicFlagsMap, ExpansionFlags flags) { var fullNameProvider = resultProvider.FullNameProvider; var declaredType = member.Type; var declaredTypeInfo = dynamicFlagsMap.SubstituteDynamicFlags(member.OriginalDefinitionType, DynamicFlagsCustomTypeInfo.Create(member.TypeInfo)).GetCustomTypeInfo(); 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 ? dynamicFlagsMap.SubstituteDynamicFlags(typeDeclaringMember.GetInterfaceListEntry(member.DeclaringType), originalDynamicFlags: default(DynamicFlagsCustomTypeInfo)).GetCustomTypeInfo() : 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)); }
public DynamicFlagsCustomTypeInfo ToDynamicFlagsCustomTypeInfo() { return(DynamicFlagsCustomTypeInfo.Create(this)); }