diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpDocument.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpDocument.cs new file mode 100644 index 0000000000..299b22b96c --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpDocument.cs @@ -0,0 +1,36 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.Language +{ + internal class DefaultRazorCSharpDocument : RazorCSharpDocument + { + private readonly string _generatedCode; + private readonly RazorDiagnostic[] _diagnostics; + private readonly LineMapping[] _lineMappings; + + public DefaultRazorCSharpDocument( + string generatedCode, + RazorDiagnostic[] diagnostics, + LineMapping[] lineMappings) + { + if (generatedCode == null) + { + throw new ArgumentNullException(nameof(generatedCode)); + } + + _generatedCode = generatedCode; + _diagnostics = diagnostics ?? Array.Empty(); + _lineMappings = lineMappings ?? Array.Empty(); + } + + public override IReadOnlyList Diagnostics => _diagnostics; + + public override string GeneratedCode => _generatedCode; + + public override IReadOnlyList LineMappings => _lineMappings; + } +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs index 95503f8fae..1634405947 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs @@ -68,13 +68,10 @@ namespace Microsoft.AspNetCore.Razor.Language } diagnostics.AddRange(renderingContext.Diagnostics); - var csharpDocument = new RazorCSharpDocument() - { - GeneratedCode = renderingContext.Writer.GenerateCode(), - LineMappings = renderingContext.LineMappings, - Diagnostics = diagnostics - }; - + var csharpDocument = RazorCSharpDocument.Create( + renderingContext.Writer.GenerateCode(), + diagnostics, + renderingContext.LineMappings); codeDocument.SetCSharpDocument(csharpDocument); } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/RazorCSharpDocument.cs b/src/Microsoft.AspNetCore.Razor.Language/RazorCSharpDocument.cs index 37d973bc25..f2981dfae8 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/RazorCSharpDocument.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/RazorCSharpDocument.cs @@ -1,16 +1,56 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; +using System.Linq; namespace Microsoft.AspNetCore.Razor.Language { - public class RazorCSharpDocument + public abstract class RazorCSharpDocument { - public string GeneratedCode { get; set; } + public abstract string GeneratedCode { get; } - public IReadOnlyList LineMappings { get; set; } + public abstract IReadOnlyList LineMappings { get; } - public IReadOnlyList Diagnostics { get; set; } + public abstract IReadOnlyList Diagnostics { get; } + + public static RazorCSharpDocument Create(string generatedCode, IEnumerable diagnostics) + { + if (generatedCode == null) + { + throw new ArgumentNullException(nameof(generatedCode)); + } + + if (diagnostics == null) + { + throw new ArgumentNullException(nameof(diagnostics)); + } + + return new DefaultRazorCSharpDocument(generatedCode, diagnostics.ToArray(), lineMappings: null); + } + + public static RazorCSharpDocument Create( + string generatedCode, + IEnumerable diagnostics, + IEnumerable lineMappings) + { + if (generatedCode == null) + { + throw new ArgumentNullException(nameof(generatedCode)); + } + + if (diagnostics == null) + { + throw new ArgumentNullException(nameof(diagnostics)); + } + + if (lineMappings == null) + { + throw new ArgumentNullException(nameof(lineMappings)); + } + + return new DefaultRazorCSharpDocument(generatedCode, diagnostics.ToArray(), lineMappings.ToArray()); + } } } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/RazorCodeDocumentExtensionsTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/RazorCodeDocumentExtensionsTest.cs index 886cb43e07..ce2576d37d 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/RazorCodeDocumentExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/RazorCodeDocumentExtensionsTest.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Razor.Language.Intermediate; using Xunit; @@ -92,7 +93,7 @@ namespace Microsoft.AspNetCore.Razor.Language // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var expected = new RazorCSharpDocument(); + var expected = RazorCSharpDocument.Create("", Array.Empty()); codeDocument.Items[typeof(RazorCSharpDocument)] = expected; // Act @@ -108,7 +109,7 @@ namespace Microsoft.AspNetCore.Razor.Language // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var expected = new RazorCSharpDocument(); + var expected = RazorCSharpDocument.Create("", Array.Empty()); // Act codeDocument.SetCSharpDocument(expected);