From ccf56256d928ed20358f1bd36928a5f5bde76163 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 30 Jul 2019 12:10:13 -0700 Subject: [PATCH] Add support for non-numeric CSharpLanguageVersions. - We would default to improper C# language versions when given non-numeric `LangVersion`s. For instance when given `CSharpLanguageVersion.Latest` we'd default to 7.3 which was inconsistent with how the rest of the C# world functioned. - Added a test. aspnet/AspNetCoredotnet/aspnetcore-tooling#11139 \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/a08d0b067336f5c03fe226cdd7d119d5970535a7 --- .../RazorProjectEngineBuilderExtensions.cs | 7 +++-- ...RazorProjectEngineBuilderExtensionsTest.cs | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/Razor/Microsoft.CodeAnalysis.Razor/test/RazorProjectEngineBuilderExtensionsTest.cs diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs index 642110102d..6e57ab1016 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs @@ -32,12 +32,15 @@ namespace Microsoft.CodeAnalysis.Razor builder.Features.Remove(existingFeature); } - builder.Features.Add(new ConfigureParserForCSharpVersionFeature(csharpLanguageVersion)); + // This will convert any "latest", "default" or "LatestMajor" LanguageVersions into their numerical equivalent. + var effectiveCSharpLanguageVersion = LanguageVersionFacts.MapSpecifiedToEffectiveVersion(csharpLanguageVersion); + builder.Features.Add(new ConfigureParserForCSharpVersionFeature(effectiveCSharpLanguageVersion)); return builder; } - private class ConfigureParserForCSharpVersionFeature : IConfigureRazorCodeGenerationOptionsFeature + // Internal for testing + internal class ConfigureParserForCSharpVersionFeature : IConfigureRazorCodeGenerationOptionsFeature { public ConfigureParserForCSharpVersionFeature(LanguageVersion csharpLanguageVersion) { diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/RazorProjectEngineBuilderExtensionsTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/RazorProjectEngineBuilderExtensionsTest.cs new file mode 100644 index 0000000000..fd31ccc33d --- /dev/null +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/RazorProjectEngineBuilderExtensionsTest.cs @@ -0,0 +1,31 @@ +// 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.Linq; +using Microsoft.AspNetCore.Razor.Language; +using Xunit; +using static Microsoft.CodeAnalysis.Razor.RazorProjectEngineBuilderExtensions; + +namespace Microsoft.CodeAnalysis.Razor +{ + public class RazorProjectEngineBuilderExtensionsTest + { + [Fact] + public void SetCSharpLanguageVersion_ResolvesNonNumericCSharpLangVersions() + { + // Arrange + var csharpLanguageVersion = CSharp.LanguageVersion.Latest; + + // Act + var projectEngine = RazorProjectEngine.Create(builder => + { + builder.SetCSharpLanguageVersion(csharpLanguageVersion); + }); + + // Assert + var feature = projectEngine.EngineFeatures.OfType().FirstOrDefault(); + Assert.NotNull(feature); + Assert.NotEqual(csharpLanguageVersion, feature.CSharpLanguageVersion); + } + } +}