File: SignatureHelp\GenericNameSignatureHelpProvider_Method.cs
Web Access
Project: ..\..\..\src\Features\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.Features.csproj (Microsoft.CodeAnalysis.CSharp.Features)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Shared.Extensions;
 
namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp
{
    internal partial class GenericNameSignatureHelpProvider
    {
        private static IList<SymbolDisplayPart> GetPreambleParts(
            IMethodSymbol method,
            SemanticModel semanticModel,
            int position)
        {
            var result = new List<SymbolDisplayPart>();
 
            var awaitable = method.GetOriginalUnreducedDefinition().IsAwaitableNonDynamic(semanticModel, position);
            var extension = method.GetOriginalUnreducedDefinition().IsExtensionMethod();
 
            if (awaitable && extension)
            {
                result.Add(Punctuation(SyntaxKind.OpenParenToken));
                result.Add(Text(CSharpFeaturesResources.awaitable));
                result.Add(Punctuation(SyntaxKind.CommaToken));
                result.Add(Text(CSharpFeaturesResources.extension));
                result.Add(Punctuation(SyntaxKind.CloseParenToken));
                result.Add(Space());
            }
            else if (awaitable)
            {
                result.Add(Punctuation(SyntaxKind.OpenParenToken));
                result.Add(Text(CSharpFeaturesResources.awaitable));
                result.Add(Punctuation(SyntaxKind.CloseParenToken));
                result.Add(Space());
            }
            else if (extension)
            {
                result.Add(Punctuation(SyntaxKind.OpenParenToken));
                result.Add(Text(CSharpFeaturesResources.extension));
                result.Add(Punctuation(SyntaxKind.CloseParenToken));
                result.Add(Space());
            }
 
            result.AddRange(method.ReturnType.ToMinimalDisplayParts(semanticModel, position));
            result.Add(Space());
            var containingType = GetContainingType(method);
            if (containingType != null)
            {
                result.AddRange(containingType.ToMinimalDisplayParts(semanticModel, position));
                result.Add(Punctuation(SyntaxKind.DotToken));
            }
 
            result.Add(new SymbolDisplayPart(SymbolDisplayPartKind.MethodName, method, method.Name));
            result.Add(Punctuation(SyntaxKind.LessThanToken));
 
            return result;
        }
 
        private static ITypeSymbol? GetContainingType(IMethodSymbol method)
        {
            var result = method.ReceiverType;
            if (result is not INamedTypeSymbol namedTypeSymbol || !namedTypeSymbol.IsScriptClass)
            {
                return result;
            }
            else
            {
                return null;
            }
        }
 
        private static IList<SymbolDisplayPart> GetPostambleParts(IMethodSymbol method, SemanticModel semanticModel, int position)
        {
            var result = new List<SymbolDisplayPart>
            {
                Punctuation(SyntaxKind.GreaterThanToken),
                Punctuation(SyntaxKind.OpenParenToken)
            };
 
            var first = true;
            foreach (var parameter in method.Parameters)
            {
                if (!first)
                {
                    result.Add(Punctuation(SyntaxKind.CommaToken));
                    result.Add(Space());
                }
 
                first = false;
                result.AddRange(parameter.ToMinimalDisplayParts(semanticModel, position));
            }
 
            result.Add(Punctuation(SyntaxKind.CloseParenToken));
            return result;
        }
    }
}