File: Mvc\MvcViewDocumentClassifierPass.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.CodeAnalysis.Razor.Compiler\src\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;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
 
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions;
 
public sealed class MvcViewDocumentClassifierPass : DocumentClassifierPassBase
{
    private readonly bool _useConsolidatedMvcViews;
 
    public static readonly string MvcViewDocumentKind = "mvc.1.0.view";
 
    protected override string DocumentKind => MvcViewDocumentKind;
 
    protected override bool IsMatch(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode) => true;
 
    public MvcViewDocumentClassifierPass() : this(false) { }
 
    public MvcViewDocumentClassifierPass(bool useConsolidatedMvcViews)
    {
        _useConsolidatedMvcViews = useConsolidatedMvcViews;
    }
 
    protected override void OnDocumentStructureCreated(
        RazorCodeDocument codeDocument,
        NamespaceDeclarationIntermediateNode @namespace,
        ClassDeclarationIntermediateNode @class,
        MethodDeclarationIntermediateNode method)
    {
        base.OnDocumentStructureCreated(codeDocument, @namespace, @class, method);
 
        if (!codeDocument.TryGetNamespace(fallbackToRootNamespace: false, out var namespaceName))
        {
            @namespace.Name = _useConsolidatedMvcViews ? "AspNetCoreGeneratedDocument" : "AspNetCore";
        }
        else
        {
            @namespace.Name = namespaceName;
        }
 
        if (!codeDocument.TryComputeClassName(out var className))
        {
            // It's possible for a Razor document to not have a file path.
            // Eg. When we try to generate code for an in memory document like default imports.
            var checksum = ChecksumUtilities.BytesToString(codeDocument.Source.Text.GetChecksum());
            @class.Name = "AspNetCore_" + checksum;
        }
        else
        {
            @class.Name = className;
        }
        @class.BaseType = new BaseTypeWithModel("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>", location: null);
 
        @class.Modifiers = _useConsolidatedMvcViews
            ? CommonModifiers.InternalSealed
            : CommonModifiers.Public;
 
        @class.NullableContext = true;
 
        method.Name = "ExecuteAsync";
        method.Modifiers = CommonModifiers.PublicAsyncOverride;
        method.ReturnType = $"global::{typeof(System.Threading.Tasks.Task).FullName}";
    }
}