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); } }
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; } }
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)); }
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); } }
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(); } }
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('>'); }
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; }
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(); }
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('>'); }
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); } }
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); } } }