From f885ee7cf22aa6b124a4b429bc2083a6f36bc716 Mon Sep 17 00:00:00 2001 From: "Andrew Hall (METAL)" Date: Mon, 5 Aug 2019 17:54:56 -0700 Subject: [PATCH] PR feedback --- .../TestUtilities/Workspaces/TestWorkspace.cs | 2 +- .../CSharpParseOptionsChangingService.cs | 16 +++---- .../CPS/AdditionalPropertiesTests.cs | 42 +++++++------------ .../ProjectSystem/VisualStudioProject.cs | 9 +++- .../VisualStudioWorkspaceImpl.cs | 4 +- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/EditorFeatures/TestUtilities/Workspaces/TestWorkspace.cs b/src/EditorFeatures/TestUtilities/Workspaces/TestWorkspace.cs index ca7a29be04e..751c43d5da4 100644 --- a/src/EditorFeatures/TestUtilities/Workspaces/TestWorkspace.cs +++ b/src/EditorFeatures/TestUtilities/Workspaces/TestWorkspace.cs @@ -682,6 +682,6 @@ public void ChangeSolution(Solution solution) } public override bool CanApplyParseOptionChange(ParseOptions oldOptions, ParseOptions newOptions, Project project) - => true; + => true; } } diff --git a/src/VisualStudio/CSharp/Impl/Utilities/CSharpParseOptionsChangingService.cs b/src/VisualStudio/CSharp/Impl/Utilities/CSharpParseOptionsChangingService.cs index ecb2f567469..e387ac42a7f 100644 --- a/src/VisualStudio/CSharp/Impl/Utilities/CSharpParseOptionsChangingService.cs +++ b/src/VisualStudio/CSharp/Impl/Utilities/CSharpParseOptionsChangingService.cs @@ -3,6 +3,7 @@ #nullable enable using System.Composition; +using System.Drawing.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Host.Mef; @@ -25,20 +26,21 @@ public bool CanApplyChange(ParseOptions oldOptions, ParseOptions newOptions, str var oldCSharpOptions = (CSharpParseOptions)oldOptions; var newCSharpOptions = (CSharpParseOptions)newOptions; - LanguageVersion parsedMaxLanguageVersion; + // Currently, only changes to the LanguageVersion of parse options are supported. + if (oldCSharpOptions.WithLanguageVersion(newCSharpOptions.SpecifiedLanguageVersion) != newOptions) + { + return false; + } if (string.IsNullOrEmpty(maxLangVersion)) { - parsedMaxLanguageVersion = LanguageVersion.Latest; + return true; } else { - Contract.ThrowIfFalse(LanguageVersionFacts.TryParse(maxLangVersion, out parsedMaxLanguageVersion)); + Contract.ThrowIfFalse(LanguageVersionFacts.TryParse(maxLangVersion, out var parsedMaxLanguageVersion)); + return newCSharpOptions.LanguageVersion <= parsedMaxLanguageVersion; } - - // Currently, only changes to the LanguageVersion of parse options are supported. - return oldCSharpOptions.WithLanguageVersion(newCSharpOptions.SpecifiedLanguageVersion) == newOptions && - newCSharpOptions.LanguageVersion <= parsedMaxLanguageVersion; } public void Apply(ParseOptions options, ProjectPropertyStorage storage) diff --git a/src/VisualStudio/CSharp/Test/ProjectSystemShim/CPS/AdditionalPropertiesTests.cs b/src/VisualStudio/CSharp/Test/ProjectSystemShim/CPS/AdditionalPropertiesTests.cs index 14ececfa563..33618947782 100644 --- a/src/VisualStudio/CSharp/Test/ProjectSystemShim/CPS/AdditionalPropertiesTests.cs +++ b/src/VisualStudio/CSharp/Test/ProjectSystemShim/CPS/AdditionalPropertiesTests.cs @@ -33,47 +33,37 @@ static string DefaultNamespaceOfSingleProject(TestEnvironment environment) => environment.Workspace.CurrentSolution.Projects.Single().DefaultNamespace; } - [WpfFact] + [WpfTheory] [Trait(Traits.Feature, Traits.Features.ProjectSystemShims)] - public void SetProperty_MaxSupportedLangVersion_CPS() + [InlineData(LanguageVersion.CSharp7_3)] + [InlineData(LanguageVersion.CSharp8)] + [InlineData(LanguageVersion.Latest)] + [InlineData(LanguageVersion.LatestMajor)] + [InlineData(LanguageVersion.Preview)] + public void SetProperty_MaxSupportedLangVersion_CPS(LanguageVersion maxSupportedLangVersion) { var catalog = TestEnvironment.s_exportCatalog.Value .WithParts( typeof(CSharpParseOptionsChangingService)); + const LanguageVersion attemptedVersion = LanguageVersion.CSharp8; + var factory = ExportProviderCache.GetOrCreateExportProviderFactory(catalog); using (var environment = new TestEnvironment(exportProviderFactory: factory)) - using (var project = CSharpHelpers.CreateCSharpCPSProject(environment, "Test")) - { - Assert.True(CanApplyVersionChange(environment, LanguageVersion.CSharp8)); - - // Test max version is less than attempted version - var maxSupportedLangVersion = LanguageVersion.CSharp7_3; - project.SetProperty(AdditionalPropertyNames.MaxSupportedLangVersion, maxSupportedLangVersion.ToDisplayString()); - Assert.False(CanApplyVersionChange(environment, LanguageVersion.CSharp8)); - - // Test max version equals attempted version - maxSupportedLangVersion = LanguageVersion.CSharp8; - project.SetProperty(AdditionalPropertyNames.MaxSupportedLangVersion, maxSupportedLangVersion.ToDisplayString()); - Assert.True(CanApplyVersionChange(environment, LanguageVersion.CSharp8)); - - // Test max version is greater than attempted version - maxSupportedLangVersion = LanguageVersion.Preview; - project.SetProperty(AdditionalPropertyNames.MaxSupportedLangVersion, maxSupportedLangVersion.ToDisplayString()); - Assert.True(CanApplyVersionChange(environment, LanguageVersion.CSharp8)); - - } - - static bool CanApplyVersionChange(TestEnvironment environment, LanguageVersion newVersion) + using (var cpsProject = CSharpHelpers.CreateCSharpCPSProject(environment, "Test")) { var project = environment.Workspace.CurrentSolution.Projects.Single(); var oldParseOptions = (CSharpParseOptions)project.ParseOptions; - return environment.Workspace.CanApplyParseOptionChange( + cpsProject.SetProperty(AdditionalPropertyNames.MaxSupportedLangVersion, maxSupportedLangVersion.ToDisplayString()); + + var canApply = environment.Workspace.CanApplyParseOptionChange( oldParseOptions, - oldParseOptions.WithLanguageVersion(newVersion), + oldParseOptions.WithLanguageVersion(attemptedVersion), project); + + Assert.Equal(attemptedVersion <= maxSupportedLangVersion, canApply); } } } diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioProject.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioProject.cs index 0d7675965c9..c4f4fd20945 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioProject.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioProject.cs @@ -314,7 +314,14 @@ internal string DefaultNamespace w => w.OnDefaultNamespaceChanged(Id, value)); } - internal void SetMaxLangVersion(string version) => _workspace.SetMaxLanguageVersion(Id, version); + /// + /// The max language version supported for this project, if applicable. Useful to help indicate what + /// language version features should be suggested to a user, as well as if they can be upgraded. + /// + internal string MaxLangVersion + { + set => _workspace.SetMaxLanguageVersion(Id, value); + } #region Batching diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioWorkspaceImpl.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioWorkspaceImpl.cs index 733cc1244b6..2b8ae0f903f 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioWorkspaceImpl.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioWorkspaceImpl.cs @@ -1889,11 +1889,11 @@ internal void EnsureDocumentOptionProvidersInitialized() } } - internal void SetMaxLanguageVersion(ProjectId projectId, string maxLangVer) + internal void SetMaxLanguageVersion(ProjectId projectId, string maxLanguageVersion) { lock (_gate) { - _projectToMaxSupportedLangVersionMap[projectId] = maxLangVer; + _projectToMaxSupportedLangVersionMap[projectId] = maxLanguageVersion; } } } -- GitLab