File: Language\Components\EmptyLayoutIntermediateNode.cs
Web Access
Project: Microsoft.CodeAnalysis.Razor.Compiler.csproj (Microsoft.CodeAnalysis.Razor.Compiler)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;

namespace Microsoft.AspNetCore.Razor.Language.Components;

internal sealed class EmptyLayoutIntermediateNode : ExtensionIntermediateNode
{
    public const string TypeName = "__EmptyLayout";

    public override IntermediateNodeCollection Children => IntermediateNodeCollection.ReadOnly;

    public override void Accept(IntermediateNodeVisitor visitor) => AcceptExtensionNode(this, visitor);

    protected override IntermediateNode CloneNode()
        => new EmptyLayoutIntermediateNode { IsSynthesizedHelper = IsSynthesizedHelper };

    public override void WriteNode(CodeTarget target, CodeRenderingContext context)
    {
        var writer = context.CodeWriter;
        writer.WriteLine($"file sealed class {TypeName} : global::{ComponentsApi.LayoutComponentBase.FullTypeName}");
        using (writer.BuildScope())
        {
            writer.WriteLine("#pragma warning disable 1998");
            writer.WriteLine($"protected override void {ComponentsApi.ComponentBase.BuildRenderTree}(global::{ComponentsApi.RenderTreeBuilder.FullTypeName} {ComponentsApi.RenderTreeBuilder.BuilderParameter})");
            using (writer.BuildScope())
            {
                // Forward Body unchanged so the explicit layout adds no wrapper around the page.
                writer.WriteLine($"{ComponentsApi.RenderTreeBuilder.BuilderParameter}.{ComponentsApi.RenderTreeBuilder.AddContent}(0, {ComponentsApi.LayoutComponentBase.Body});");
            }
            writer.WriteLine("#pragma warning restore 1998");
        }
    }
}