Exemple #1
0
 private SymbolComparer(SymbolDisplayFormat format, bool systemNamespaceFirst, bool includeNamespaces, SymbolDisplayAdditionalMemberOptions additionalOptions)
 {
     Format = format;
     SystemNamespaceFirst = systemNamespaceFirst;
     IncludeNamespaces    = includeNamespaces;
     AdditionalOptions    = additionalOptions;
 }
 public static SymbolComparer Create(
     bool systemNamespaceFirst = true,
     bool includeNamespaces    = true,
     SymbolDisplayAdditionalMemberOptions additionalOptions = SymbolDisplayAdditionalMemberOptions.None)
 {
     return(new SymbolComparer(
                TypeSymbolDisplayFormats.GetFormat(includeNamespaces: false),
                systemNamespaceFirst: systemNamespaceFirst,
                includeNamespaces: includeNamespaces,
                additionalOptions: additionalOptions));
 }
Exemple #3
0
 public static IEnumerable <ISymbol> Sort(
     this IEnumerable <ISymbol> items,
     SymbolDisplayFormat format,
     bool systemNamespaceFirst,
     bool includeContainingNamespace = true,
     SymbolDisplayAdditionalMemberOptions additionalOptions = SymbolDisplayAdditionalMemberOptions.None)
 {
     return(Sort(
                items: items,
                selector: f => f,
                format: format,
                systemNamespaceFirst: systemNamespaceFirst,
                includeContainingNamespace: includeContainingNamespace,
                additionalOptions: additionalOptions));
 }
Exemple #4
0
 public static IEnumerable <T> Sort <T>(
     this IEnumerable <T> items,
     Func <T, ISymbol> selector,
     SymbolDisplayFormat format,
     bool systemNamespaceFirst,
     bool includeContainingNamespace = true,
     SymbolDisplayAdditionalMemberOptions additionalOptions = SymbolDisplayAdditionalMemberOptions.None)
 {
     if (includeContainingNamespace)
     {
         return(items
                .OrderBy(f => selector(f).ContainingNamespace, NamespaceSymbolComparer.GetInstance(systemNamespaceFirst))
                .ThenBy(f => selector(f).ToDisplayString(format, additionalOptions)));
     }
     else
     {
         return(items
                .OrderBy(f => selector(f).ToDisplayString(format, additionalOptions)));
     }
 }
        public static ImmutableArray <SymbolDisplayPart> ToDisplayParts(this ISymbol symbol, SymbolDisplayFormat format, SymbolDisplayAdditionalMemberOptions additionalOptions)
        {
            if (additionalOptions == SymbolDisplayAdditionalMemberOptions.None)
            {
                return(symbol.ToDisplayParts(format));
            }

            ImmutableArray <SymbolDisplayPart> parts = symbol.ToDisplayParts(format);
            int length = parts.Length;

            for (int i = 0; i < length; i++)
            {
                SymbolDisplayPart part = parts[i];

                switch (part.Kind)
                {
                case SymbolDisplayPartKind.Keyword:
                {
                    switch (part.ToString())
                    {
                    case "this":
                    {
                        if ((additionalOptions & SymbolDisplayAdditionalMemberOptions.UseItemPropertyName) != 0 &&
                            (symbol as IPropertySymbol)?.IsIndexer == true)
                        {
                            parts = parts.Replace(part, SymbolDisplayPartFactory.PropertyName("Item", part.Symbol));
                        }

                        break;
                    }

                    case "operator":
                    {
                        if ((additionalOptions & SymbolDisplayAdditionalMemberOptions.UseOperatorName) != 0 &&
                            symbol is IMethodSymbol methodSymbol &&
                            methodSymbol.MethodKind == MethodKind.UserDefinedOperator)
                        {
                            string name = methodSymbol.Name;

                            Debug.Assert(name.StartsWith("op_", StringComparison.Ordinal), name);

                            if (name.StartsWith("op_", StringComparison.Ordinal) &&
                                i < length - 2 &&
                                parts[i + 1].IsSpace() &&
                                parts[i + 2].Kind == SymbolDisplayPartKind.MethodName)
                            {
                                parts   = parts.Replace(parts[i + 2], SymbolDisplayPartFactory.MethodName(name.Substring(3), parts[i + 2].Symbol));
                                parts   = parts.RemoveRange(i, 2);
                                length -= 2;
                            }
                        }

                        break;
                    }

                    case "implicit":
                    case "explicit":
                    {
                        if ((additionalOptions & SymbolDisplayAdditionalMemberOptions.UseOperatorName) != 0 &&
                            symbol is IMethodSymbol methodSymbol &&
                            methodSymbol.MethodKind == MethodKind.Conversion)
                        {
                            string name = methodSymbol.Name;

                            Debug.Assert(name.StartsWith("op_", StringComparison.Ordinal), name);

                            if (name.StartsWith("op_", StringComparison.Ordinal) &&
                                i < length - 2 &&
                                parts[i + 1].IsSpace() &&
                                parts[i + 2].IsKeyword("operator"))
                            {
                                List <SymbolDisplayPart> list = parts.ToList();

                                list[i + 2] = SymbolDisplayPartFactory.MethodName(name.Substring(3), list[i + 4].Symbol);
                                list.RemoveRange(i, 2);
                                length -= 2;

                                if (i == length - 3 &&
                                    list[i + 1].IsSpace() &&
                                    list[i + 2].IsName())
                                {
                                    list.RemoveRange(i + 1, 2);
                                    length -= 2;
                                }
                                else if (i < length - 5 &&
                                         list[i + 1].IsSpace() &&
                                         list[i + 2].IsName() &&
                                         list[i + 3].IsPunctuation() &&
                                         list[i + 4].IsName() &&
                                         list[i + 5].IsPunctuation())
                                {
                                    list.Insert(i + 5, list[i + 2]);
                                    list.Insert(i + 5, SymbolDisplayPartFactory.Text(" to "));
                                    list.RemoveRange(i + 1, 2);
                                    length -= 5;
                                }

                                parts = list.ToImmutableArray();
                            }
                        }

                        break;
                    }
                    }

                    break;
                }
                }
            }

            return(parts);
        }
 public static string ToDisplayString(this ISymbol symbol, SymbolDisplayFormat format, SymbolDisplayAdditionalMemberOptions additionalOptions)
 {
     return(symbol.ToDisplayParts(format, additionalOptions).ToDisplayString());
 }