Ejemplo n.º 1
0
        private static string GetGenericCloseGlyph(TypeParameterDisplayMode displayMode)
        {
            switch (displayMode)
            {
            case TypeParameterDisplayMode.SystemStandard:
                return("]");

            case TypeParameterDisplayMode.DebuggerStandard:
                return(">");

            case TypeParameterDisplayMode.CommentStandard:
                return("}");

            default:
                return(string.Empty);
            }
        }
Ejemplo n.º 2
0
 public string BuildTypeName(IType target, bool shortFormGeneric = false, bool numericTypeParams = false, TypeParameterDisplayMode typeParameterDisplayMode = TypeParameterDisplayMode.SystemStandard)
 {
     callcount++;
     return(TypeExtensions.BuildTypeNameInternal(target, shortFormGeneric, numericTypeParams, typeParameterDisplayMode));
 }
Ejemplo n.º 3
0
        internal static string BuildTypeNameInternal(this IType target, bool shortFormGeneric = false, bool numericTypeParams = false, TypeParameterDisplayMode typeParameterDisplayMode = TypeParameterDisplayMode.SystemStandard)
        {
            switch (target.ElementClassification)
            {
            case TypeElementClassification.None:
                if (target is IGenericParameter)
                {
                    if (numericTypeParams)
                    {
                        var genericParameter = (IGenericParameter)target;
                        if (genericParameter.Parent is IType)
                        {
                            return(string.Format("!{0}", genericParameter.Position));
                        }
                        else
                        {
                            return(string.Format("!!{0}", genericParameter.Position));
                        }
                    }
                    else
                    {
                        return(((IGenericParameter)(target)).Name);
                    }
                }
                string targetName    = target.Name;
                var    genericTarget = target as IGenericType;
                if (typeParameterDisplayMode == TypeParameterDisplayMode.SystemStandard && genericTarget != null && genericTarget.IsGenericConstruct)
                {
                    int count = 0;
                    if (genericTarget.ElementClassification == TypeElementClassification.None)
                    {
                        if ((count = genericTarget.TypeParameters.Count) > 0)
                        {
                            targetName += '`' + count.ToString();
                        }
                    }
                    else if (genericTarget.ElementClassification == TypeElementClassification.GenericTypeDefinition)
                    {
                        var genericElementType = genericTarget.ElementType as IGenericType;
                        if (genericElementType != null)
                        {
                            if ((count = genericElementType.TypeParameters.Count) > 0)
                            {
                                targetName += '`' + count.ToString();
                            }
                        }
                        else
                        {
                            targetName += "`?";
                        }
                    }
                }
                if (target.Parent != null && !(target.Parent is INamespaceDeclaration ||
                                               target.Parent is IAssembly))
                {
                    return(string.Format("{0}+{1}", target.Parent.BuildVariedName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode), targetName));
                }
                else if (!string.IsNullOrEmpty(target.NamespaceName))
                {
                    return(string.Format("{0}.{1}", target.NamespaceName, targetName));
                }
                else
                {
                    return(targetName);
                }

            case TypeElementClassification.Array:
                if (target is IArrayType)
                {
                    var arrayVariant = target as IArrayType;
                    if (arrayVariant.Flags == ArrayFlags.Vector)
                    {
                        return(string.Format("{0}[]", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams)));
                    }
                    else if ((arrayVariant.Flags & ArrayFlags.DimensionLengths) == ArrayFlags.DimensionLengths || (arrayVariant.Flags & ArrayFlags.DimensionLowerBounds) == ArrayFlags.DimensionLowerBounds)
                    {
                        var lengths         = arrayVariant.Lengths;
                        var lowerBounds     = arrayVariant.LowerBounds;
                        int lengthCount     = 0,
                            lowerBoundCount = 0;
                        if (lengths != null)
                        {
                            lengthCount = lengths.Count;
                        }
                        if (lowerBounds != null)
                        {
                            lowerBoundCount = lowerBounds.Count;
                        }
                        StringBuilder sb    = new StringBuilder();
                        bool          first = true;
                        for (int i = 0; i < arrayVariant.ArrayRank; i++)
                        {
                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                sb.Append(",");
                            }
                            bool addedDots;
                            if (addedDots = (i < lowerBoundCount))
                            {
                                sb.AppendFormat("{0}...", lowerBounds[i]);
                            }
                            if (i < lengthCount)
                            {
                                if (addedDots)
                                {
                                    sb.Append(lowerBounds[i] + lengths[i] - 1);
                                }
                                else
                                {
                                    sb.AppendFormat("0...{0}", lengths[i] - 1);
                                }
                            }
                        }
                        return(string.Format("{0}[{1}]", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams), sb.ToString()));
                    }
                    else
                    {
                        return(string.Format("{0}[{1}]", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams), ','.Repeat(arrayVariant.ArrayRank - 1)));
                    }
                }
                else
                {
                    return(string.Format("{0}[?,...]", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams)));
                }

            case TypeElementClassification.Nullable:
                return(string.Format("{0}?", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams)));

            case TypeElementClassification.Pointer:
                return(string.Format("{0}*", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams)));

            case TypeElementClassification.Reference:
                return(string.Format("{0}&", target.ElementType.BuildTypeName(shortFormGeneric, numericTypeParams)));

            case TypeElementClassification.GenericTypeDefinition:
                if (target is IGenericType)
                {
                    /*Apply the rules across the generic parameters.  With an alternate route for numeric identity. */
                    return(string.Format("{0}{2}{1}{3}", target.ElementType.BuildTypeName(typeParameterDisplayMode: typeParameterDisplayMode), string.Join(",",
                                                                                                                                                           ((IGenericType)(target)).GenericParameters.OnAll(genericReplacement =>
                    {
                        if (shortFormGeneric)
                        {
                            if (genericReplacement.IsGenericTypeParameter)
                            {
                                if (numericTypeParams)
                                {
                                    var genericParameterReplacement = (IGenericParameter)genericReplacement;
                                    if (genericParameterReplacement.Parent is IType)
                                    {
                                        return string.Format("!{0}", genericParameterReplacement.Position);
                                    }
                                    else
                                    {
                                        return string.Format("!!{0}", genericParameterReplacement.Position);
                                    }
                                }
                                else
                                {
                                    return genericReplacement.Name;
                                }
                            }
                            else
                            {
                                return genericReplacement.BuildTypeName(shortFormGeneric, true);
                            }
                        }
                        else if (genericReplacement.IsGenericTypeParameter)
                        {
                            if (numericTypeParams && typeParameterDisplayMode != TypeParameterDisplayMode.CommentStandard)
                            {
                                var genericParameterReplacement = (IGenericParameter)genericReplacement;
                                if (genericParameterReplacement.Parent is IType)
                                {
                                    return string.Format("[!{0}]", genericParameterReplacement.Position);
                                }
                                else
                                {
                                    return string.Format("[!!{0}]", genericParameterReplacement.Position);
                                }
                            }
                            else
                            {
                                return string.Format("[{0}]", genericReplacement.Name);
                            }
                        }
                        else if (genericReplacement.Assembly == null)
                        {
                            return genericReplacement.FullName;
                        }
                        else if (typeParameterDisplayMode == TypeParameterDisplayMode.CommentStandard)
                        {
                            return genericReplacement.BuildTypeName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode);
                        }
                        else
                        {
                            try
                            {
                                IAssembly replacementAssembly = genericReplacement.Assembly;
                                return string.Format("[{0}, {1}]", genericReplacement.FullName, replacementAssembly.ToString());
                            }
                            //For Symbol types.
                            catch (NotSupportedException)
                            {
                                return string.Format("{0}", genericReplacement.FullName);
                            }
                        }
                    }).ToArray()), GetGenericOpenGlyph(typeParameterDisplayMode), GetGenericCloseGlyph(typeParameterDisplayMode)));
                }
                else     /* If they report they're generic, but do not implement the proper interface, we're somewhat out of luck. */
                {
                    return(string.Format("{0}{1}[?],...{2}", target.ElementType.BuildTypeName(true, numericTypeParams, typeParameterDisplayMode), GetGenericOpenGlyph(typeParameterDisplayMode), GetGenericCloseGlyph(typeParameterDisplayMode)));
                }
            }
            return(null);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Debug method used to display the name of a type in a near CLR-identical manner.
        /// </summary>
        /// <param name="target">The <see cref="IType"/> to build the type name for.</param>
        /// <param name="shortFormGeneric">Whether the names of the type-parameters
        /// within the type are shortened for use within the brackets
        /// of a generic-type instance vs. their full type-name.</param>
        /// <param name="numericTypeParams">Whether type-parameters are shown as numbers.</param>
        /// <param name="typeParameterDisplayMode">Whether to use angle brackets or square brackets
        /// based upon the call-site's intent.  <see cref="TypeParameterDisplayMode.SystemStandard"/> shows
        /// square brackets ('[' and ']'), and <see cref="TypeParameterDisplayMode.DebuggerStandard"/>
        /// shows angle brackets ('&lt;' and '&gt;').</param>
        /// <returns></returns>
        public static string BuildTypeName(this IType target, bool shortFormGeneric = false, bool numericTypeParams = false, TypeParameterDisplayMode typeParameterDisplayMode = TypeParameterDisplayMode.SystemStandard)
        {
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }
            var identityManager = target.IdentityManager;

            if (identityManager == null)
            {
                return(target.Name);
            }
            ITypeNameBuilderService builderService;

            if (identityManager.TryGetService(IdentityManagerServiceGuids.TypeNameBuilderService, out builderService))
            {
                return(builderService.BuildTypeName(target, shortFormGeneric, numericTypeParams, typeParameterDisplayMode));
            }
            return(target.Name);
        }
Ejemplo n.º 5
0
 private static string BuildMemberName(this IMember member, bool shortFormGeneric = false, bool numericTypeParams = false, TypeParameterDisplayMode typeParameterDisplayMode = TypeParameterDisplayMode.SystemStandard)
 {
     if (member.Parent is IType)
     {
         return(string.Format("{0}::{1}", ((IType)(member.Parent)).BuildTypeName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode), member.ToString()));
     }
     else if (member.Parent is INamespaceDeclaration)
     {
         return(string.Format("{0}.{1}", ((INamespaceDeclaration)(member.Parent)).FullName, member.ToString()));
     }
     else if (member.Parent is IMember)
     {
         return(string.Format("{0}->{1}", ((IMember)(member.Parent)).BuildMemberName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode), member.ToString()));
     }
     throw new ArgumentException("Unrecognized entity in member nesting chain.");
 }
Ejemplo n.º 6
0
 private static string BuildVariedName(this ITypeParent target, bool shortFormGeneric = false, bool numericTypeParams = false, TypeParameterDisplayMode typeParameterDisplayMode = TypeParameterDisplayMode.SystemStandard)
 {
     if (target is IMember)
     {
         return(((IMember)(target)).BuildMemberName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode));
     }
     else if (target is IType)
     {
         return(((IType)(target)).BuildTypeName(shortFormGeneric, numericTypeParams, typeParameterDisplayMode));
     }
     else if (target is INamespaceDeclaration)
     {
         return(((INamespaceDeclaration)target).FullName);
     }
     throw new ArgumentException("Unrecognized entity in type nesting chain.");
 }