File: EmbeddedLanguages\StackFrame\StackFrameCompilationUnit.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.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;
using Microsoft.CodeAnalysis.EmbeddedLanguages.Common;
 
namespace Microsoft.CodeAnalysis.EmbeddedLanguages.StackFrame;
 
using StackFrameNodeOrToken = EmbeddedSyntaxNodeOrToken<StackFrameKind, StackFrameNode>;
using StackFrameToken = EmbeddedSyntaxToken<StackFrameKind>;
 
/// <summary>
/// The root unit for a stackframe. Includes the method declaration for the stack frame and optional file information. 
/// Any leading "at " is considered trivia of <see cref="MethodDeclaration"/>, and " in " is put as trivia for the <see cref="FileInformationExpression"/>.
/// Remaining unparsable text is put as leading trivia on the <see cref="EndOfLineToken"/>
/// </summary>
internal sealed class StackFrameCompilationUnit(StackFrameMethodDeclarationNode methodDeclaration, StackFrameFileInformationNode? fileInformationExpression, StackFrameToken endOfLineToken) : StackFrameNode(StackFrameKind.CompilationUnit)
{
    /// <summary>
    /// Represents the method declaration for a stack frame. Requires at least a member 
    /// access and argument list with no parameters to be considered valid
    /// </summary>
    public readonly StackFrameMethodDeclarationNode MethodDeclaration = methodDeclaration;
 
    /// <summary>
    /// File information for a stack frame. May be optionally contained. If available, represents
    /// the file path of a stackframe and optionally the line number. This is available as hint information
    /// and may be useful for a user, but is not always accurate when mapping back to source.
    /// </summary>
    public readonly StackFrameFileInformationNode? FileInformationExpression = fileInformationExpression;
 
    /// <summary>
    /// The end token of a frame. Any trailing text is added as leading trivia of this token.
    /// </summary>
    public readonly StackFrameToken EndOfLineToken = endOfLineToken;
 
    internal override int ChildCount => 3;
 
    public override void Accept(IStackFrameNodeVisitor visitor)
        => visitor.Visit(this);
 
    internal override StackFrameNodeOrToken ChildAt(int index)
        => index switch
        {
            0 => MethodDeclaration,
            1 => FileInformationExpression,
            2 => EndOfLineToken,
            _ => throw new InvalidOperationException()
        };
}