File: SignatureHelp\GenericNameSignatureHelpProvider_Method.cs
Web Access
Project: src\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;
    }
}