Exemplo n.º 1
0
        /// <summary>
        /// Try to reteive relevant <see cref="ClassificationTypeNames"/> for the <paramref name="part"/>
        /// </summary>
        /// <returns>
        /// <see langword="true"/> if the <see cref="SymbolDisplayPart.Kind"/> of <paramref name="part"/>
        /// is not one of keyword or punctuation types
        /// </returns>
        public static bool TryGetClassificationName(SymbolDisplayPart part, out string classification)
        {
            classification =
                part.Kind == SymbolDisplayPartKind.AliasName ? ClassificationTypeNames.Identifier :
                part.Kind == SymbolDisplayPartKind.AnonymousTypeIndicator ? ClassificationTypeNames.Text :
                part.Kind == SymbolDisplayPartKind.AssemblyName ? ClassificationTypeNames.Identifier :
                part.Kind == SymbolDisplayPartKind.ClassName ? ClassificationTypeNames.ClassName :
                part.Kind == SymbolDisplayPartKind.DelegateName ? ClassificationTypeNames.DelegateName :
                part.Kind == SymbolDisplayPartKind.EnumName ? ClassificationTypeNames.EnumName : // TODO: enum meber
                part.Kind == SymbolDisplayPartKind.ErrorTypeName ? ClassificationTypeNames.Identifier :
                part.Kind == SymbolDisplayPartKind.EventName ? ClassificationTypeNames.EventName :
                part.Kind == SymbolDisplayPartKind.FieldName ? ClassificationTypeNames.FieldName :
                part.Kind == SymbolDisplayPartKind.InterfaceName ? ClassificationTypeNames.InterfaceName :
                part.Kind == SymbolDisplayPartKind.LabelName ? ClassificationTypeNames.Identifier : // TODO: label name
                part.Kind == SymbolDisplayPartKind.LocalName ? ClassificationTypeNames.LocalName :
                part.Kind == SymbolDisplayPartKind.MethodName ? ClassificationTypeNames.MethodName :
                part.Kind == SymbolDisplayPartKind.ModuleName ? ClassificationTypeNames.ModuleName :
                part.Kind == SymbolDisplayPartKind.NamespaceName ? ClassificationTypeNames.Identifier : // TODO: namespace name
                part.Kind == SymbolDisplayPartKind.ParameterName ? ClassificationTypeNames.ParameterName :
                part.Kind == SymbolDisplayPartKind.PropertyName ? ClassificationTypeNames.PropertyName :
                part.Kind == SymbolDisplayPartKind.RangeVariableName ? ClassificationTypeNames.Identifier : // TODO: range variable name
                part.Kind == SymbolDisplayPartKind.StructName ? ClassificationTypeNames.StructName :
                part.Kind == SymbolDisplayPartKind.TypeParameterName ? ClassificationTypeNames.TypeParameterName :
                null;

            return(!(classification is null));
        }
Exemplo n.º 2
0
 public TaggedText ToTag(SymbolDisplayPart displayPart)
 {
     TaggedText ToTag()
     {
         if (displayPart.Symbol is null)
         {
             return(default);
        protected override void WriteParameterName(ISymbol symbol, SymbolDisplayPart part)
        {
            if (DocumentationDisplayMode == DocumentationDisplayMode.ToolTip)
            {
                XElement element = DocumentationProvider?
                                   .GetXmlDocumentation(symbol)?
                                   .Element(WellKnownXmlTags.Param, "name", part.ToString());

                if (element != null)
                {
                    WriteStartElement("span");
                    WriteStartAttribute("title");
                    WriteDocumentationCommentToolTip(element);
                    WriteEndAttribute();
                }

                base.WriteParameterName(symbol, part);

                if (element != null)
                {
                    WriteEndElement();
                }
            }
            else
            {
                base.WriteParameterName(symbol, part);
            }
        }
Exemplo n.º 4
0
 public static bool IsName(this SymbolDisplayPart displayPart) =>
 displayPart.IsAnyKind(SymbolDisplayPartKind.ClassName, SymbolDisplayPartKind.DelegateName,
                       SymbolDisplayPartKind.EnumName, SymbolDisplayPartKind.EventName,
                       SymbolDisplayPartKind.FieldName, SymbolDisplayPartKind.InterfaceName,
                       SymbolDisplayPartKind.LocalName, SymbolDisplayPartKind.MethodName,
                       SymbolDisplayPartKind.NamespaceName, SymbolDisplayPartKind.ParameterName,
                       SymbolDisplayPartKind.PropertyName, SymbolDisplayPartKind.StructName);
        internal static bool IsName(this SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.AliasName:
            case SymbolDisplayPartKind.AssemblyName:
            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.DelegateName:
            case SymbolDisplayPartKind.EnumName:
            case SymbolDisplayPartKind.ErrorTypeName:
            case SymbolDisplayPartKind.EventName:
            case SymbolDisplayPartKind.FieldName:
            case SymbolDisplayPartKind.InterfaceName:
            case SymbolDisplayPartKind.LabelName:
            case SymbolDisplayPartKind.LocalName:
            case SymbolDisplayPartKind.MethodName:
            case SymbolDisplayPartKind.ModuleName:
            case SymbolDisplayPartKind.NamespaceName:
            case SymbolDisplayPartKind.ParameterName:
            case SymbolDisplayPartKind.PropertyName:
            case SymbolDisplayPartKind.StructName:
            case SymbolDisplayPartKind.TypeParameterName:
            case SymbolDisplayPartKind.RangeVariableName:
                return(true);

            default:
                return(false);
            }
        }
Exemplo n.º 6
0
        private ImmutableArray <SymbolDisplayPart> AppendAccessorAttributes(
            ImmutableArray <SymbolDisplayPart> parts,
            IMethodSymbol method,
            string keyword)
        {
            ImmutableArray <SymbolDisplayPart> attributeParts = SymbolDeclarationBuilder.GetAttributesParts(
                method.GetAttributes(),
                predicate: IsVisibleAttribute,
                splitAttributes: Options.SplitAttributes,
                includeAttributeArguments: Options.IncludeAttributeArguments,
                addNewLine: false);

            if (attributeParts.Any())
            {
                SymbolDisplayPart part = parts.FirstOrDefault(f => f.IsKeyword(keyword));

                Debug.Assert(part.Kind == SymbolDisplayPartKind.Keyword);

                if (part.Kind == SymbolDisplayPartKind.Keyword)
                {
                    int index = parts.IndexOf(part);

                    parts = parts.Insert(index, SymbolDisplayPartFactory.Space());
                    parts = parts.InsertRange(index, attributeParts);
                }
            }

            return(parts);
        }
Exemplo n.º 7
0
        public static SymbolDisplayPart MassageErrorTypeNames(
            this SymbolDisplayPart part,
            string?replacement = null
            )
        {
            if (part.Kind == SymbolDisplayPartKind.ErrorTypeName)
            {
                var text = part.ToString();
                if (text == string.Empty)
                {
                    return(replacement == null
                      ? new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, "object")
                      : new SymbolDisplayPart(SymbolDisplayPartKind.Text, null, replacement));
                }

                if (SyntaxFacts.GetKeywordKind(text) != SyntaxKind.None)
                {
                    return(new SymbolDisplayPart(
                               SymbolDisplayPartKind.ErrorTypeName,
                               null,
                               string.Format("@{0}", text)
                               ));
                }
            }

            return(part);
        }
Exemplo n.º 8
0
        private DisplayPartContent GetPartContent(SymbolDisplayPart item)
        {
            if (item.Kind == SymbolDisplayPartKind.NamespaceName || item.Kind == SymbolDisplayPartKind.Punctuation || item.Kind == SymbolDisplayPartKind.PropertyName)
            {
                return(new DisplayPartContent(item.ToString(), Brushes.Black));
            }
            else if (item.Kind == SymbolDisplayPartKind.ClassName || item.Kind == SymbolDisplayPartKind.InterfaceName || item.Kind == SymbolDisplayPartKind.EnumName || item.Kind == SymbolDisplayPartKind.DelegateName || item.Kind == SymbolDisplayPartKind.TypeParameterName)
            {
                return(new DisplayPartContent(item.ToString(), new SolidColorBrush(Color.FromRgb(43, 145, 175))));
            }
            else if (item.Kind == SymbolDisplayPartKind.MethodName || item.Kind == SymbolDisplayPartKind.ExtensionMethodName)
            {
                return(new DisplayPartContent(item.ToString(), new SolidColorBrush(Color.FromRgb(116, 83, 31))));
            }
            else if (item.Kind == SymbolDisplayPartKind.Keyword)
            {
                return(new DisplayPartContent(item.ToString(), Brushes.Blue));
            }
            else if (item.Kind == SymbolDisplayPartKind.ParameterName)
            {
                return(new DisplayPartContent(item.ToString(), Brushes.DarkSlateGray));
            }
            else if (item.Kind == SymbolDisplayPartKind.Space)
            {
                return(new DisplayPartContent(item.ToString(), Brushes.Transparent));
            }

            return(new DisplayPartContent());
        }
Exemplo n.º 9
0
        private SymbolDisplayStyle GetDisplayCategory(SymbolDisplayPart symbolDisplayPart)
        {
            if (symbolDisplayPart.Kind == SymbolDisplayPartKind.MethodName)
            {
                return(SymbolDisplayStyle.MethodName);
            }

            return(SymbolDisplayStyle.Normal);
        }
        public override void Write(SymbolDisplayPart part)
        {
            base.Write(part);

            if (part.Kind == SymbolDisplayPartKind.LineBreak)
            {
                _pendingIndentation = true;
            }
        }
Exemplo n.º 11
0
 public static bool IsAnyKind(this SymbolDisplayPart displayPart, params SymbolDisplayPartKind[] kinds)
 {
     foreach (var kind in kinds)
     {
         if (displayPart.Kind == kind)
         {
             return(true);
         }
     }
     return(false);
 }
Exemplo n.º 12
0
 public static void WriteSymbolDisplayPart(this IFastJsonWriter writer, SymbolDisplayPart part, bool selected)
 {
     writer.WriteStartObject();
     writer.WriteProperty("text", part.ToString());
     writer.WriteProperty("kind", FastConvert.EnumToLowerInvariantString(part.Kind));
     if (selected)
     {
         writer.WriteProperty("selected", true);
     }
     writer.WriteEndObject();
 }
Exemplo n.º 13
0
        private static JObject Categorize(SymbolDisplayPart part)
        {
            var kind = part.Kind.ToString();

            kind = capital.Replace(kind, "$1-$2").ToLowerInvariant();

            return(new JObject(
                       new JProperty("kind", new JValue(kind)),
                       new JProperty("val", new JValue(part.ToString()))
                       ));
        }
Exemplo n.º 14
0
        public static Run ToRun(this SymbolDisplayPart part)
        {
            var text = part.ToVisibleDisplayString(includeLeftToRightMarker: true);

            var run = new Run(text);

            //var format = formatMap.GetTextProperties(typeMap.GetClassificationType(part.Kind.ToClassificationTypeName()));
            //run.SetTextProperties(format);

            return(run);
        }
Exemplo n.º 15
0
        private static void AddAccessorAttributes(
            ImmutableArray <SymbolDisplayPart> .Builder parts,
            IMethodSymbol methodSymbol,
            SymbolDisplayFormat format,
            SymbolDisplayAdditionalOptions additionalOptions,
            Func <ISymbol, AttributeData, bool> shouldDisplayAttribute)
        {
            ImmutableArray <SymbolDisplayPart> attributeParts = GetAttributesParts(
                methodSymbol,
                format: format,
                additionalOptions: additionalOptions,
                shouldDisplayAttribute: shouldDisplayAttribute,
                formatAttributes: false);

            if (attributeParts.Any())
            {
                string keyword = GetKeyword();

                SymbolDisplayPart part = parts.FirstOrDefault(f => f.IsKeyword(keyword));

                Debug.Assert(part.Kind == SymbolDisplayPartKind.Keyword);

                if (part.Kind == SymbolDisplayPartKind.Keyword)
                {
                    int index = parts.IndexOf(part);

                    parts.Insert(index, SymbolDisplayPartFactory.Space());
                    parts.InsertRange(index, attributeParts);
                }
            }

            string GetKeyword()
            {
                switch (methodSymbol.MethodKind)
                {
                case MethodKind.EventAdd:
                    return("add");

                case MethodKind.EventRemove:
                    return("remove");

                case MethodKind.PropertyGet:
                    return("get");

                case MethodKind.PropertySet:
                    return("set");

                default:
                    throw new InvalidOperationException();
                }
            }
        }
Exemplo n.º 16
0
        protected override ImmutableArray <SymbolDisplayPart> .Builder GetAnonymousTypeParts(
            SymbolDisplayPart part, ITypeSymbol anonymousType)
        {
            var builder = ImmutableArray.CreateBuilder <SymbolDisplayPart>();

            builder.Add(CreateSpaces(2));
            builder.Add(part);
            builder.Add(CreateSpaces(1));
            builder.Add(CreateText("is"));
            builder.Add(CreateSpaces(1));
            builder.Add(CreateKeyword("New"));
            builder.Add(CreateSpaces(1));
            builder.Add(CreateKeyword("With"));
            builder.Add(CreateSpaces(1));
            builder.Add(CreatePunctuation("{"));

            var wasAdded = false;

            foreach (var member in anonymousType.GetMembers())
            {
                if (!(member is IPropertySymbol property) || !property.CanBeReferencedByName)
                {
                    continue;
                }

                if (wasAdded)
                {
                    builder.Add(CreatePunctuation(","));
                }

                wasAdded = true;
                // NOTE: Key shows only for readonly properties
                if (property.IsReadOnly)
                {
                    builder.Add(CreateSpaces(1));
                    builder.Add(CreateKeyword("Key"));
                }

                builder.Add(CreateSpaces(1));
                builder.Add(CreatePunctuation("."));
                builder.Add(new SymbolDisplayPart(SymbolDisplayPartKind.PropertyName, property, property.Name));
                builder.Add(CreateSpaces(1));
                builder.Add(CreateKeyword("As"));
                builder.AddRange(ToMinimalDisplayParts(property.Type));
                builder.Add(CreateSpaces(1));
            }

            builder.Add(CreateSpaces(1));
            builder.Add(CreatePunctuation("}"));
            return(builder);
        }
Exemplo n.º 17
0
        SymbolDisplayPart Mutator(SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.Punctuation when part.ToString() == ".":
                return(new SymbolDisplayPart(part.Kind, part.Symbol, "_"));

            case SymbolDisplayPartKind.InterfaceName when part.ToString().StartsWith(Prefix.ProtectedToPublicInterface):
                return(new SymbolDisplayPart(part.Kind, part.Symbol,
                                             part.ToString().Replace(Prefix.ProtectedToPublicInterface, "")));
            }

            return(part);
        }
Exemplo n.º 18
0
        public TokenApiView(SymbolDisplayPart part)
        {
            this.DisplayString = part.ToString();
            this.IsNavigable   = false;
            if (part.Symbol == null)
            {
                this.Id = "";
            }
            else
            {
                var typeParamIndex = part.Symbol.ToDisplayString().LastIndexOf("<");
                if (typeParamIndex > 0)
                {
                    this.Id = part.Symbol.ToDisplayString().Remove(typeParamIndex);
                }
                else
                {
                    this.Id = part.Symbol.ToDisplayString();
                }
            }

            switch (part.Kind)
            {
            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.ErrorTypeName:
            case SymbolDisplayPartKind.InterfaceName:
            case SymbolDisplayPartKind.StructName:
                this.Type        = TypeReferenceApiView.TokenType.ClassType;
                this.IsNavigable = true;
                break;

            case SymbolDisplayPartKind.EnumName:
                this.Type        = TypeReferenceApiView.TokenType.EnumType;
                this.IsNavigable = true;
                break;

            case SymbolDisplayPartKind.Punctuation:
            case SymbolDisplayPartKind.Space:
                this.Type = TypeReferenceApiView.TokenType.Punctuation;
                break;

            case SymbolDisplayPartKind.Keyword:
                this.Type = TypeReferenceApiView.TokenType.BuiltInType;
                break;

            default:
                this.Type = TypeReferenceApiView.TokenType.TypeArgument;
                break;
            }
        }
Exemplo n.º 19
0
        internal static bool IsMemberName(this SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.EventName:
            case SymbolDisplayPartKind.FieldName:
            case SymbolDisplayPartKind.MethodName:
            case SymbolDisplayPartKind.PropertyName:
                return(true);

            default:
                return(false);
            }
        }
        internal static bool IsTypeName(this SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.DelegateName:
            case SymbolDisplayPartKind.EnumName:
            case SymbolDisplayPartKind.InterfaceName:
            case SymbolDisplayPartKind.StructName:
                return(true);

            default:
                return(false);
            }
        }
        public static string ToVisibleDisplayString(this SymbolDisplayPart part, bool includeLeftToRightMarker)
        {
            var text = part.ToString();

            if (includeLeftToRightMarker)
            {
                var classificationTypeName = part.Kind.ToClassificationTypeName();
                if (classificationTypeName == ClassificationTypeNames.Punctuation ||
                    classificationTypeName == ClassificationTypeNames.WhiteSpace)
                {
                    text = LeftToRightMarkerPrefix + text;
                }
            }

            return(text);
        }
Exemplo n.º 22
0
        public static string ToVisibleDisplayString(this SymbolDisplayPart part, bool includeLeftToRightMarker)
        {
            var text = part.ToString();

            if (includeLeftToRightMarker)
            {
                if (part.Kind == SymbolDisplayPartKind.Punctuation ||
                    part.Kind == SymbolDisplayPartKind.Space ||
                    part.Kind == SymbolDisplayPartKind.LineBreak)
                {
                    text = LeftToRightMarkerPrefix + text;
                }
            }

            return(text);
        }
Exemplo n.º 23
0
        public static IList <SymbolDisplayPart> ToAwaitableParts(this ISymbol symbol, string awaitKeyword, string initializedVariableName, SemanticModel semanticModel, int position)
        {
            var spacePart = new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " ");
            var parts     = new List <SymbolDisplayPart>();

            parts.AddLineBreak();
            parts.AddText(WorkspacesResources.Usage_colon);
            parts.AddLineBreak();
            parts.AddText("  ");

            var returnType = symbol.InferAwaitableReturnType(semanticModel, position);

            returnType = returnType != null && returnType.SpecialType != SpecialType.System_Void ? returnType : null;
            if (returnType != null)
            {
                if (semanticModel.Language == "C#")
                {
                    parts.AddRange(returnType.ToMinimalDisplayParts(semanticModel, position));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.LocalName, null, initializedVariableName));
                }
                else
                {
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, "Dim"));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.LocalName, null, initializedVariableName));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, "as"));
                    parts.Add(spacePart);
                    parts.AddRange(returnType.ToMinimalDisplayParts(semanticModel, position));
                }

                parts.Add(spacePart);
                parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "="));
                parts.Add(spacePart);
            }

            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, awaitKeyword));
            parts.Add(spacePart);
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.MethodName, symbol, symbol.Name));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "("));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, symbol.GetParameters().Any() ? "..." : ""));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, ")"));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, semanticModel.Language == "C#" ? ";" : ""));

            return(parts);
        }
Exemplo n.º 24
0
        public static IList <SymbolDisplayPart> ReplaceAnonymousTypes(
            IList <SymbolDisplayPart> parts,
            IDictionary <INamedTypeSymbol, string> anonymousTypeToName)
        {
            var result = parts;

            for (var i = 0; i < result.Count; i++)
            {
                var part = result[i];
                if (part.Symbol is INamedTypeSymbol type && anonymousTypeToName.TryGetValue(type, out var name) && part.ToString() != name)
                {
                    result    = result == parts ? new List <SymbolDisplayPart>(parts) : result;
                    result[i] = new SymbolDisplayPart(part.Kind, part.Symbol, name);
                }
            }

            return(result);
        }
Exemplo n.º 25
0
        public static IList<SymbolDisplayPart> ReplaceAnonymousTypes(
            IList<SymbolDisplayPart> parts,
            IDictionary<INamedTypeSymbol, string> anonymousTypeToName)
        {
            var result = parts;
            for (int i = 0; i < result.Count; i++)
            {
                var part = result[i];
                var type = part.Symbol as INamedTypeSymbol;
                if (type != null && anonymousTypeToName.TryGetValue(type, out var name) && part.ToString() != name)
                {
                    result = result == parts ? new List<SymbolDisplayPart>(parts) : result;
                    result[i] = new SymbolDisplayPart(part.Kind, part.Symbol, name);
                }
            }

            return result;
        }
        internal static bool IsTypeNameOrMemberName(this SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.DelegateName:
            case SymbolDisplayPartKind.EnumName:
            case SymbolDisplayPartKind.EventName:
            case SymbolDisplayPartKind.FieldName:
            case SymbolDisplayPartKind.InterfaceName:
            case SymbolDisplayPartKind.MethodName:
            case SymbolDisplayPartKind.PropertyName:
            case SymbolDisplayPartKind.StructName:
                return(true);

            default:
                return(false);
            }
        }
Exemplo n.º 27
0
        public static ImmutableArray <SymbolDisplayPart> RemoveAttributeSuffix(ImmutableArray <SymbolDisplayPart> parts)
        {
            SymbolDisplayPart part = parts.FirstOrDefault(f => f.Kind == SymbolDisplayPartKind.ClassName);

            Debug.Assert(part.Kind == SymbolDisplayPartKind.ClassName, part.Kind.ToString());

            if (part.Kind == SymbolDisplayPartKind.ClassName)
            {
                const string attributeSuffix = "Attribute";

                string text = part.ToString();

                if (text.EndsWith(attributeSuffix, StringComparison.Ordinal))
                {
                    parts = parts.Replace(part, part.WithText(text.Remove(text.Length - attributeSuffix.Length)));
                }
            }

            return(parts);
        }
        internal static bool IsMemberName(this SymbolDisplayPart part)
        {
            switch (part.Kind)
            {
            case SymbolDisplayPartKind.EventName:
            case SymbolDisplayPartKind.FieldName:
            case SymbolDisplayPartKind.MethodName:
            case SymbolDisplayPartKind.ExtensionMethodName:
            case SymbolDisplayPartKind.PropertyName:
            case SymbolDisplayPartKind.EnumMemberName:
            case SymbolDisplayPartKind.ConstantName:
                return(true);

            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.StructName:
                return(part.Symbol is IMethodSymbol methodSymbol && methodSymbol.MethodKind.Is(MethodKind.Constructor, MethodKind.Destructor));

            default:
                return(false);
            }
        }
Exemplo n.º 29
0
        private static Run ToRun(this SymbolDisplayPart text)
        {
            var run = new Run(text.ToString());

            switch (text.Kind)
            {
            case SymbolDisplayPartKind.Keyword:
                run.Foreground = Brushes.Blue;
                break;

            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.DelegateName:
            case SymbolDisplayPartKind.EnumName:
            case SymbolDisplayPartKind.EventName:
            case SymbolDisplayPartKind.InterfaceName:
            case SymbolDisplayPartKind.StructName:
                run.Foreground = Brushes.Teal;
                break;
            }

            return(run);
        }
Exemplo n.º 30
0
        public static Run ToRun(this SymbolDisplayPart part)
        {
            var text = part.ToVisibleDisplayString(includeLeftToRightMarker: true);

            var run = new Run(text);

            switch (part.Kind)
            {
            case SymbolDisplayPartKind.Keyword:
                run.Foreground = Brushes.Blue;
                break;

            case SymbolDisplayPartKind.StructName:
            case SymbolDisplayPartKind.EnumName:
            case SymbolDisplayPartKind.TypeParameterName:
            case SymbolDisplayPartKind.ClassName:
            case SymbolDisplayPartKind.DelegateName:
            case SymbolDisplayPartKind.InterfaceName:
                run.Foreground = Brushes.Teal;
                break;
            }

            return(run);
        }
Exemplo n.º 31
0
        /// <summary>
        /// シンボル名を返す
        /// </summary>
        /// <param name="target">対象DisplayPartsインスタンス</param>
        /// <param name="exclusionGenericElements">ジェネリックス要素の除外</param>
        /// <returns>シンボル名</returns>
        internal static string GetSymbolName(SymbolDisplayPart target, bool exclusionGenericElements = false)
        {
            if (target.Symbol is null)
            {
                return($"{target}");
            }

            var name = GetSymbolName(target.Symbol);

            // ジェネリックスの場合はパラメータ除去
            if (exclusionGenericElements && target.Symbol is INamedTypeSymbol symbol && symbol.IsGenericType)
            {
                if (name.EndsWith(">", StringComparison.CurrentCulture))
                {
                    name = name.Substring(0, name.IndexOf("<", StringComparison.CurrentCulture));
                }
                else
                {
                    name = $"{target}";
                }
            }

            return(name);
        }
Exemplo n.º 32
0
        private void Initialize()
        {
            var content = new StringBuilder();
            var prettyPrintedContent = new StringBuilder();

            var parts = new List<SymbolDisplayPart>();
            var prettyPrintedParts = new List<SymbolDisplayPart>();

            var parameters = new List<IParameter>();

            var signaturePrefixParts = _signatureHelpItem.PrefixDisplayParts;
            var signaturePrefixContent = _signatureHelpItem.PrefixDisplayParts.GetFullText();

            AddRange(signaturePrefixParts, parts, prettyPrintedParts);
            Append(signaturePrefixContent, content, prettyPrintedContent);

            var separatorParts = _signatureHelpItem.SeparatorDisplayParts;
            var separatorContent = separatorParts.GetFullText();

            var newLinePart = new SymbolDisplayPart(SymbolDisplayPartKind.LineBreak, null, "\r\n");
            var newLineContent = newLinePart.ToString();
            var spacerPart = new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, new string(' ', signaturePrefixContent.Length));
            var spacerContent = spacerPart.ToString();

            var paramColumnCount = 0;

            for (int i = 0; i < _signatureHelpItem.Parameters.Length; i++)
            {
                var sigHelpParameter = _signatureHelpItem.Parameters[i];

                var parameterPrefixParts = sigHelpParameter.PrefixDisplayParts;
                var parameterPrefixContext = sigHelpParameter.PrefixDisplayParts.GetFullText();

                var parameterParts = AddOptionalBrackets(sigHelpParameter.IsOptional, sigHelpParameter.DisplayParts);
                var parameterContent = parameterParts.GetFullText();

                var parameterSuffixParts = sigHelpParameter.SuffixDisplayParts;
                var parameterSuffixContext = sigHelpParameter.SuffixDisplayParts.GetFullText();

                paramColumnCount += separatorContent.Length + parameterPrefixContext.Length + parameterContent.Length + parameterSuffixContext.Length;

                if (i > 0)
                {
                    AddRange(separatorParts, parts, prettyPrintedParts);
                    Append(separatorContent, content, prettyPrintedContent);

                    if (paramColumnCount > MaxParamColumnCount)
                    {
                        prettyPrintedParts.Add(newLinePart);
                        prettyPrintedParts.Add(spacerPart);
                        prettyPrintedContent.Append(newLineContent);
                        prettyPrintedContent.Append(spacerContent);

                        paramColumnCount = 0;
                    }
                }

                AddRange(parameterPrefixParts, parts, prettyPrintedParts);
                Append(parameterPrefixContext, content, prettyPrintedContent);

                parameters.Add(new Parameter(this, sigHelpParameter, parameterContent, content.Length, prettyPrintedContent.Length));

                AddRange(parameterParts, parts, prettyPrintedParts);
                Append(parameterContent, content, prettyPrintedContent);

                AddRange(parameterSuffixParts, parts, prettyPrintedParts);
                Append(parameterSuffixContext, content, prettyPrintedContent);
            }

            AddRange(_signatureHelpItem.SuffixDisplayParts, parts, prettyPrintedParts);
            Append(_signatureHelpItem.SuffixDisplayParts.GetFullText(), content, prettyPrintedContent);

            if (_parameterIndex >= 0)
            {
                var sigHelpParameter = _signatureHelpItem.Parameters[_parameterIndex];

                AddRange(sigHelpParameter.SelectedDisplayParts, parts, prettyPrintedParts);
                Append(sigHelpParameter.SelectedDisplayParts.GetFullText(), content, prettyPrintedContent);
            }

            AddRange(_signatureHelpItem.DescriptionParts, parts, prettyPrintedParts);
            Append(_signatureHelpItem.DescriptionParts.GetFullText(), content, prettyPrintedContent);

            var documentation = _signatureHelpItem.DocumentationFactory(CancellationToken.None).ToList();
            if (documentation.Count > 0)
            {
                AddRange(new[] { newLinePart }, parts, prettyPrintedParts);
                Append(newLineContent, content, prettyPrintedContent);

                AddRange(documentation, parts, prettyPrintedParts);
                Append(documentation.GetFullText(), content, prettyPrintedContent);
            }

            _content = content.ToString();
            _prettyPrintedContent = prettyPrintedContent.ToString();
            _displayParts = parts.ToImmutableArrayOrEmpty();
            _prettyPrintedDisplayParts = prettyPrintedParts.ToImmutableArrayOrEmpty();
            _parameters = parameters.ToReadOnlyCollection();
        }
 private static bool CompareParts(SymbolDisplayPart p1, SymbolDisplayPart p2)
 {
     return p1.ToString() == p2.ToString();
 }
Exemplo n.º 34
0
        public static IList<SymbolDisplayPart> ToAwaitableParts(this ISymbol symbol, string awaitKeyword, string initializedVariableName, SemanticModel semanticModel, int position)
        {
            var spacePart = new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " ");
            var parts = new List<SymbolDisplayPart>();

            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Text, null, $"\r\n{WorkspacesResources.Usage_colon}\r\n  "));

            var returnType = symbol.InferAwaitableReturnType(semanticModel, position);
            returnType = returnType != null && returnType.SpecialType != SpecialType.System_Void ? returnType : null;
            if (returnType != null)
            {
                if (semanticModel.Language == "C#")
                {
                    parts.AddRange(returnType.ToMinimalDisplayParts(semanticModel, position));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.LocalName, null, initializedVariableName));
                }
                else
                {
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, "Dim"));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.LocalName, null, initializedVariableName));
                    parts.Add(spacePart);
                    parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, "as"));
                    parts.Add(spacePart);
                    parts.AddRange(returnType.ToMinimalDisplayParts(semanticModel, position));
                }

                parts.Add(spacePart);
                parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "="));
                parts.Add(spacePart);
            }

            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, awaitKeyword));
            parts.Add(spacePart);
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.MethodName, symbol, symbol.Name));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "("));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, symbol.GetParameters().Any() ? "..." : ""));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, ")"));
            parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, semanticModel.Language == "C#" ? ";" : ""));

            return parts;
        }