File: SignatureHelp\ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs
Web Access
Project: src\roslyn\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 System.Collections.Immutable;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.SignatureHelp;

namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp;

internal sealed partial class ObjectCreationExpressionSignatureHelpProvider
{
    private static ImmutableArray<SignatureHelpItem> ConvertDelegateTypeConstructor(
        BaseObjectCreationExpressionSyntax objectCreationExpression,
        IMethodSymbol invokeMethod,
        SemanticModel semanticModel,
        IStructuralTypeDisplayService structuralTypeDisplayService,
        int position)
    {
        var item = CreateItem(
            invokeMethod, semanticModel,
            objectCreationExpression.SpanStart,
            structuralTypeDisplayService,
            isVariadic: false,
            documentationFactory: null,
            prefixParts: GetDelegateTypePreambleParts(invokeMethod, semanticModel, position),
            separatorParts: GetSeparatorParts(),
            suffixParts: GetDelegateTypePostambleParts(),
            parameters: GetDelegateTypeParameters(invokeMethod, semanticModel, position));

        return [item];
    }

    private static IList<SymbolDisplayPart> GetDelegateTypePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position)
    {
        var result = new List<SymbolDisplayPart>();

        result.AddRange(invokeMethod.ContainingType.ToMinimalDisplayParts(semanticModel, position));
        result.Add(Punctuation(SyntaxKind.OpenParenToken));

        return result;
    }

    private static IList<SignatureHelpSymbolParameter> GetDelegateTypeParameters(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position)
    {
        const string TargetName = "target";

        var parts = new List<SymbolDisplayPart>();
        parts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position));
        parts.Add(Space());
        parts.Add(Punctuation(SyntaxKind.OpenParenToken));

        var first = true;
        foreach (var parameter in invokeMethod.Parameters)
        {
            if (!first)
            {
                parts.Add(Punctuation(SyntaxKind.CommaToken));
                parts.Add(Space());
            }

            first = false;
            parts.AddRange(parameter.Type.ToMinimalDisplayParts(semanticModel, position));
        }

        parts.Add(Punctuation(SyntaxKind.CloseParenToken));
        parts.Add(Space());
        parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, null, TargetName));

        return [new SignatureHelpSymbolParameter(
            TargetName,
            isOptional: false,
            documentationFactory: null,
            displayParts: parts)];
    }

    private static IList<SymbolDisplayPart> GetDelegateTypePostambleParts()
        => [Punctuation(SyntaxKind.CloseParenToken)];
}