File: LanguageServices\CSharpStructuralTypeDisplayService.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.
 
#nullable disable
 
using System;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.LanguageService;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.LanguageServices;
 
[ExportLanguageService(typeof(IStructuralTypeDisplayService), LanguageNames.CSharp), Shared]
internal class CSharpStructuralTypeDisplayService : AbstractStructuralTypeDisplayService
{
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public CSharpStructuralTypeDisplayService()
    {
    }
 
    protected override ISyntaxFacts SyntaxFactsService => CSharpSyntaxFacts.Instance;
 
    protected override ImmutableArray<SymbolDisplayPart> GetNormalAnonymousTypeParts(
        INamedTypeSymbol anonymousType, SemanticModel semanticModel, int position)
    {
        using var _ = ArrayBuilder<SymbolDisplayPart>.GetInstance(out var members);
 
        members.Add(Keyword(SyntaxFacts.GetText(SyntaxKind.NewKeyword)));
        members.AddRange(Space());
        members.Add(Punctuation(SyntaxFacts.GetText(SyntaxKind.OpenBraceToken)));
        members.AddRange(Space());
 
        var first = true;
        foreach (var property in anonymousType.GetValidAnonymousTypeProperties())
        {
            if (!first)
            {
                members.Add(Punctuation(SyntaxFacts.GetText(SyntaxKind.CommaToken)));
                members.AddRange(Space());
            }
 
            first = false;
            members.AddRange(property.Type.ToMinimalDisplayParts(semanticModel, position, s_minimalWithoutExpandedTuples).Select(p => p.MassageErrorTypeNames("?")));
            members.AddRange(Space());
            members.Add(new SymbolDisplayPart(SymbolDisplayPartKind.PropertyName, property, CSharpSyntaxFacts.Instance.EscapeIdentifier(property.Name)));
        }
 
        members.AddRange(Space());
        members.Add(Punctuation(SyntaxFacts.GetText(SyntaxKind.CloseBraceToken)));
 
        return members.ToImmutableAndClear();
    }
}