From fb037bda01fd53d8490cf0b4ce1e0f7e3f11e649 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 5 Apr 2019 21:24:50 -0700 Subject: [PATCH] Set CSharpLangVersion during runtime compilation (#9135) * Set CSharpLangVersion during runtime compilation * Pass CSharpLangVersion inferred by the CSharpCompiler to RazorEngine * Set GenerateRazorHostingAssemblyInfo in Razor.RuntimeCompilation targets * Unskip failing test Fixes https://github.com/aspnet/AspNetCore/issues/8996 --- .../src/CSharpCompiler.cs | 24 +++++++++++-------- ...timeCompilationMvcCoreBuilderExtensions.cs | 2 ++ ...tCore.Mvc.Razor.RuntimeCompilation.targets | 3 +++ .../test/CSharpCompilerTest.cs | 2 +- src/ProjectTemplates/test/MvcTemplateTest.cs | 2 +- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs index ec1ea76ac0..92860f2f0c 100644 --- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs +++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs @@ -209,19 +209,23 @@ namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation var parseOptions = new CSharpParseOptions(preprocessorSymbols: defines); - if (!string.IsNullOrEmpty(dependencyContextOptions.LanguageVersion)) + if (string.IsNullOrEmpty(dependencyContextOptions.LanguageVersion)) { - if (LanguageVersionFacts.TryParse(dependencyContextOptions.LanguageVersion, out var languageVersion)) - { - parseOptions = parseOptions.WithLanguageVersion(languageVersion); - } - else - { - Debug.Fail($"LanguageVersion {languageVersion} specified in the deps file could not be parsed."); - } + // During preview releases, Roslyn assumes Preview language version for netcoreapp3.0 targeting projects. + // We will match the behavior if the project does not specify a value for C# language (e.g. if you're using Razor compilation in a F# project). + // Prior to 3.0 RTM, this value needs to be changed to "Latest". This is tracked via https://github.com/aspnet/AspNetCore/issues/9129 + parseOptions = parseOptions.WithLanguageVersion(LanguageVersion.Preview); + } + else if (LanguageVersionFacts.TryParse(dependencyContextOptions.LanguageVersion, out var languageVersion)) + { + parseOptions = parseOptions.WithLanguageVersion(languageVersion); + } + else + { + Debug.Fail($"LanguageVersion {languageVersion} specified in the deps file could not be parsed."); } return parseOptions; } } -} \ No newline at end of file +} diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs index bd42adb829..f7e1d9142a 100644 --- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs +++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs @@ -83,6 +83,7 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(s => { var fileSystem = s.GetRequiredService(); + var csharpCompiler = s.GetRequiredService(); var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder => { RazorExtensions.Register(builder); @@ -95,6 +96,7 @@ namespace Microsoft.Extensions.DependencyInjection // TagHelperDescriptorProviders (actually do tag helper discovery) builder.Features.Add(new DefaultTagHelperDescriptorProvider()); builder.Features.Add(new ViewComponentTagHelperDescriptorProvider()); + builder.SetCSharpLanguageVersion(csharpCompiler.ParseOptions.LanguageVersion); }); return projectEngine; diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/build/netcoreapp3.0/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.targets b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/build/netcoreapp3.0/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.targets index 967b60429c..506e12c735 100644 --- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/build/netcoreapp3.0/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.targets +++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/build/netcoreapp3.0/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.targets @@ -2,5 +2,8 @@ true true + + + true diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/test/CSharpCompilerTest.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/test/CSharpCompilerTest.cs index 06a76959ee..3ff7c6f1c5 100644 --- a/src/Mvc/Mvc.Razor.RuntimeCompilation/test/CSharpCompilerTest.cs +++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/test/CSharpCompilerTest.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation // Act & Assert var parseOptions = compiler.ParseOptions; - Assert.Equal(LanguageVersion.CSharp7_3, parseOptions.LanguageVersion); + Assert.Equal(LanguageVersion.CSharp8, parseOptions.LanguageVersion); Assert.Equal(new[] { "DEBUG" }, parseOptions.PreprocessorSymbolNames); } diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs index 201b4dcdf1..59c38cf22b 100644 --- a/src/ProjectTemplates/test/MvcTemplateTest.cs +++ b/src/ProjectTemplates/test/MvcTemplateTest.cs @@ -26,7 +26,7 @@ namespace Templates.Test [Theory] [InlineData(null)] - [InlineData("F#", Skip = "https://github.com/aspnet/AspNetCore/issues/8996")] + [InlineData("F#")] public async Task MvcTemplate_NoAuthImplAsync(string languageOverride) { Project = await ProjectFactory.GetOrCreateProject("mvcnoauth" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);