Пример #1
0
 private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options)
 {
     if (type.IsGenericType)
     {
         var genericArguments = type.GetGenericArguments();
         ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options);
     }
     else if (type.IsArray)
     {
         ProcessArrayType(builder, type, options);
     }
     else if (_builtInTypeNames.TryGetValue(type, out var builtInName))
     {
         builder.Append(builtInName);
     }
     else if (type.IsGenericParameter)
     {
         if (options.IncludeGenericParameterNames)
         {
             builder.Append(type.Name);
         }
     }
     else
     {
         builder.Append(options.FullName ? type.FullName : type.Name);
     }
 }
Пример #2
0
    private static void ProcessArrayType(StringBuilder builder, Type type, DisplayNameOptions options)
    {
        var innerType = type;

        while (innerType.IsArray)
        {
            if (innerType.GetElementType() is { } inner)
            {
                innerType = inner;
            }
        }

        ProcessType(builder, innerType, options);

        while (type.IsArray)
        {
            builder.Append('[');
            builder.Append(',', type.GetArrayRank() - 1);
            builder.Append(']');
            if (type.GetElementType() is not {
            } elementType)
            {
                break;
            }

            type = elementType;
        }
    }
Пример #3
0
    private static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length,
                                           DisplayNameOptions options)
    {
        var offset = 0;

        if (type.IsNested && type.DeclaringType is not null)
        {
            offset = type.DeclaringType.GetGenericArguments().Length;
        }

        if (options.FullName)
        {
            if (type.IsNested && type.DeclaringType is not null)
            {
                ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options);
                builder.Append('+');
            }
            else if (!string.IsNullOrEmpty(type.Namespace))
            {
                builder.Append(type.Namespace);
                builder.Append('.');
            }
        }

        var genericPartIndex = type.Name.IndexOf('`');

        if (genericPartIndex <= 0)
        {
            builder.Append(type.Name);
            return;
        }

        if (type.Assembly.ManifestModule.Name == "FSharp.Core.dll" &&
            FSharpTypeNames.TryGetValue(type.Name, out var builtInName))
        {
            builder.Append(builtInName);
        }
        else
        {
            builder.Append(type.Name, 0, genericPartIndex);
        }

        builder.Append('<');
        for (var i = offset; i < length; i++)
        {
            ProcessType(builder, genericArguments[i], options);
            if (i + 1 == length)
            {
                continue;
            }

            builder.Append(',');
            if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter)
            {
                builder.Append(' ');
            }
        }

        builder.Append('>');
    }
        public void MapDisplayNameTests(string setting, DisplayNameOptions outcome)
        {
            var runsettings = $"<RunSettings><NUnit><DisplayName>{setting}</DisplayName></NUnit></RunSettings>";

            _settings.Load(runsettings);
            Assert.That(_settings.DisplayName, Is.EqualTo(outcome));
        }
Пример #5
0
 private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options)
 {
     if (type.IsGenericType)
     {
         var underlyingType = Nullable.GetUnderlyingType(type);
         if (underlyingType != null)
         {
             ProcessType(builder, underlyingType, options);
             builder.Append('?');
         }
         else
         {
             var genericArguments = type.GetGenericArguments();
             ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options);
         }
     }
     else if (type.IsArray)
     {
         ProcessArrayType(builder, type, options);
     }
     else if (BuiltInTypeNames.TryGetValue(type, out var builtInName))
     {
         builder.Append(builtInName);
     }
     else if (type.Namespace == nameof(System))
     {
         builder.Append(type.Name);
     }
     else if (type.Assembly.ManifestModule.Name == "FSharp.Core.dll" &&
              FSharpTypeNames.TryGetValue(type.Name, out builtInName))
     {
         builder.Append(builtInName);
     }
     else if (type.IsGenericParameter)
     {
         if (options.IncludeGenericParameterNames)
         {
             builder.Append(type.Name);
         }
     }
     else
     {
         builder.Append(options.FullName ? type.FullName ?? type.Name : type.Name);
     }
 }
Пример #6
0
        private static void ProcessArrayType(StringBuilder builder, Type type, DisplayNameOptions options)
        {
            var innerType = type;

            while (innerType != null && innerType.IsArray)
            {
                innerType = innerType.GetElementType();
            }

            ProcessType(builder, innerType, options);
            while (type != null && type.IsArray)
            {
                builder.Append('[');
                builder.Append(',', type.GetArrayRank() - 1);
                builder.Append(']');
                type = type.GetElementType();
            }
        }
Пример #7
0
        static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length, DisplayNameOptions options)
        {
            var offset = 0;

            if (type.IsNested)
            {
                offset = type.DeclaringType !.GetGenericArguments().Length;
            }

            if (options.FullName)
            {
                if (type.IsNested)
                {
                    ProcessGenericType(builder, type.DeclaringType !, genericArguments, offset, options);
                    builder.Append('+');
                }
                else if (!string.IsNullOrEmpty(type.Namespace))
                {
                    builder.Append(type.Namespace);
                    builder.Append('.');
                }
            }

#if NETCOREAPP3_1
            var genericPartIndex = type.Name.IndexOf('`', StringComparison.Ordinal);
#else
            var genericPartIndex = type.Name.IndexOf('`');
#endif

            if (genericPartIndex <= 0)
            {
                builder.Append(type.Name);
                return;
            }

            builder.Append(type.Name, 0, genericPartIndex);
            builder.Append('<');

            for (var i = offset; i < length; i++)
            {
                ProcessType(builder, genericArguments[i], options);

                if (i + 1 == length)
                {
                    continue;
                }

                builder.Append(',');

                if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter)
                {
                    builder.Append(' ');
                }
            }

            builder.Append('>');
        }
Пример #8
0
        private static string GetName(SyntaxNode node, DisplayNameOptions options)
        {
            const string missingTokenPlaceholder = "?";

            switch (node.Kind())
            {
                case SyntaxKind.CompilationUnit:
                    return null;
                case SyntaxKind.IdentifierName:
                    var identifier = ((IdentifierNameSyntax)node).Identifier;
                    return identifier.IsMissing ? missingTokenPlaceholder : identifier.Text;
                case SyntaxKind.IncompleteMember:
                    return missingTokenPlaceholder;
                case SyntaxKind.NamespaceDeclaration:
                    return GetName(((NamespaceDeclarationSyntax)node).Name, options);
                case SyntaxKind.QualifiedName:
                    var qualified = (QualifiedNameSyntax)node;
                    return GetName(qualified.Left, options) + dotToken + GetName(qualified.Right, options);
            }

            string name = null;
            var memberDeclaration = node as MemberDeclarationSyntax;
            if (memberDeclaration != null)
            {
                if (memberDeclaration.Kind() == SyntaxKind.ConversionOperatorDeclaration)
                {
                    name = (memberDeclaration as ConversionOperatorDeclarationSyntax)?.Type.ToString();
                }
                else
                {
                    var nameToken = memberDeclaration.GetNameToken();
                    if (nameToken != default(SyntaxToken))
                    {
                        name = nameToken.IsMissing ? missingTokenPlaceholder : nameToken.Text;
                        if (memberDeclaration.Kind() == SyntaxKind.DestructorDeclaration)
                        {
                            name = "~" + name;
                        }
                        if ((options & DisplayNameOptions.IncludeTypeParameters) != 0)
                        {
                            var pooled = PooledStringBuilder.GetInstance();
                            var builder = pooled.Builder;
                            builder.Append(name);
                            AppendTypeParameterList(builder, memberDeclaration.GetTypeParameterList());
                            name = pooled.ToStringAndFree();
                        }
                    }
                    else
                    {
                        Debug.Assert(memberDeclaration.Kind() == SyntaxKind.IncompleteMember);
                        name = "?";
                    }
                }
            }
            else
            {
                var fieldDeclarator = node as VariableDeclaratorSyntax;
                if (fieldDeclarator != null)
                {
                    var nameToken = fieldDeclarator.Identifier;
                    if (nameToken != default(SyntaxToken))
                    {
                        name = nameToken.IsMissing ? missingTokenPlaceholder : nameToken.Text;
                    }
                }
            }
            Debug.Assert(name != null, "Unexpected node type " + node.Kind());
            return name;
        }
Пример #9
0
        public string GetDisplayName(SyntaxNode node, DisplayNameOptions options, string rootNamespace = null)
        {
            if (node == null)
            {
                return string.Empty;
            }

            var pooled = PooledStringBuilder.GetInstance();
            var builder = pooled.Builder;

            // return type
            var memberDeclaration = node as MemberDeclarationSyntax;
            if ((options & DisplayNameOptions.IncludeType) != 0)
            {
                var type = memberDeclaration.GetMemberType();
                if (type != null && !type.IsMissing)
                {
                    builder.Append(type);
                    builder.Append(' ');
                }
            }

            var names = ArrayBuilder<string>.GetInstance();
            // containing type(s)
            var parent = node.GetAncestor<TypeDeclarationSyntax>() ?? node.Parent;
            while (parent is TypeDeclarationSyntax)
            {
                names.Push(GetName(parent, options));
                parent = parent.Parent;
            }
            // containing namespace(s) in source (if any)
            if ((options & DisplayNameOptions.IncludeNamespaces) != 0)
            {
                while (parent != null && parent.Kind() == SyntaxKind.NamespaceDeclaration)
                {
                    names.Add(GetName(parent, options));
                    parent = parent.Parent;
                }
            }
            while (!names.IsEmpty())
            {
                var name = names.Pop();
                if (name != null)
                {
                    builder.Append(name);
                    builder.Append(dotToken);
                }
            }

            // name (including generic type parameters)
            builder.Append(GetName(node, options));

            // parameter list (if any)
            if ((options & DisplayNameOptions.IncludeParameters) != 0)
            {
                builder.Append(memberDeclaration.GetParameterList());
            }

            return pooled.ToStringAndFree();
        }
 public string GetDisplayName(SyntaxNode node, DisplayNameOptions options, string rootNamespace = null)
 {
     throw new NotImplementedException();
 }
Пример #11
0
 public string GetDisplayName(SyntaxNode node, DisplayNameOptions options, string rootNamespace = null)
 {
     throw new NotImplementedException();
 }
Пример #12
0
        private static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length, DisplayNameOptions options)
        {
            var offset = 0;

            if (type.IsNested)
            {
                offset = type.DeclaringType.GetGenericArguments().Length;
            }

            if (options.FullName)
            {
                if (type.IsNested)
                {
                    ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options);
                    builder.Append('+');
                }
                else
                {
                    builder.Append(type.Namespace);
                    builder.Append('.');
                }
            }

            var genericPartIndex = type.Name.IndexOf('`');

            if (genericPartIndex <= 0)
            {
                builder.Append(type.Name);
                return;
            }

            builder.Append(type.Name, 0, genericPartIndex);

            builder.Append('<');
            for (var i = offset; i < length; i++)
            {
                ProcessType(builder, genericArguments[i], options);
                if (i + 1 == length)
                {
                    continue;
                }

                builder.Append(',');
                if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter)
                {
                    builder.Append(' ');
                }
            }
            builder.Append('>');
        }
Пример #13
0
        private static void ProcessGenericType([NotNull] StringBuilder builder, [NotNull] Type type, Type[] genericArguments, int length, DisplayNameOptions options)
        {
            var offset = 0;

            if (type.IsNested)
            {
                offset = type.DeclaringType.GetGenericArguments().Length;
            }

            if (options.FullName)
            {
                if (type.IsNested)
                {
                    ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options);
                    _ = builder.Append(options.NestedTypeDelimiter);
                }
                else if (!string.IsNullOrEmpty(type.Namespace))
                {
                    _ = builder.Append(type.Namespace);
                    _ = builder.Append(ControlChars.Dot);
                }
            }

            var genericPartIndex = type.Name.IndexOf('`', StringComparison.Ordinal);

            if (genericPartIndex <= 0)
            {
                _ = builder.Append(type.Name);
                return;
            }

            _ = builder.Append(type.Name, 0, genericPartIndex);

            if (options.IncludeGenericParameters)
            {
                _ = builder.Append(ControlChars.StartAngleBracket);

                for (var typeCount = offset; typeCount < length; typeCount++)
                {
                    ProcessType(builder, genericArguments[typeCount], options);

                    if (typeCount + 1 == length)
                    {
                        continue;
                    }

                    _ = builder.Append(ControlChars.Comma);
                    if (options.IncludeGenericParameterNames || !genericArguments[typeCount + 1].IsGenericParameter)
                    {
                        _ = builder.Append(ControlChars.Space);
                    }
                }

                _ = builder.Append(ControlChars.EndAngleBracket);
            }
        }
Пример #14
0
        internal static void ProcessType([NotNull] StringBuilder builder, [NotNull] Type type, DisplayNameOptions options)
        {
            if (type.IsGenericType)
            {
                Type[] genericArguments = type.GetGenericArguments();
                ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options);
            }
            else if (type.IsArray)
            {
                ProcessType(builder, type, options);
            }
            else if (BuiltInTypeNames.TryGetValue(type, out var builtInName))
            {
                _ = builder.Append(builtInName);
            }
            else if (type.IsGenericParameter)
            {
                if (options.IncludeGenericParameterNames)
                {
                    _ = builder.Append(type.Name);
                }
            }
            else
            {
                var name = options.FullName ? type.FullName : type.Name;
                _ = builder.Append(name);

                if (options.NestedTypeDelimiter != ControlChars.Plus)
                {
                    _ = builder.Replace(ControlChars.Plus, options.NestedTypeDelimiter, builder.Length - name.Length, name.Length);
                }
            }
        }