提交 f885ee7c 编写于 作者: A Andrew Hall (METAL)

PR feedback

上级 ef0abfae
...@@ -682,6 +682,6 @@ public void ChangeSolution(Solution solution) ...@@ -682,6 +682,6 @@ public void ChangeSolution(Solution solution)
} }
public override bool CanApplyParseOptionChange(ParseOptions oldOptions, ParseOptions newOptions, Project project) public override bool CanApplyParseOptionChange(ParseOptions oldOptions, ParseOptions newOptions, Project project)
=> true; => true;
} }
} }
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#nullable enable #nullable enable
using System.Composition; using System.Composition;
using System.Drawing.Text;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Host.Mef;
...@@ -25,20 +26,21 @@ public bool CanApplyChange(ParseOptions oldOptions, ParseOptions newOptions, str ...@@ -25,20 +26,21 @@ public bool CanApplyChange(ParseOptions oldOptions, ParseOptions newOptions, str
var oldCSharpOptions = (CSharpParseOptions)oldOptions; var oldCSharpOptions = (CSharpParseOptions)oldOptions;
var newCSharpOptions = (CSharpParseOptions)newOptions; 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)) if (string.IsNullOrEmpty(maxLangVersion))
{ {
parsedMaxLanguageVersion = LanguageVersion.Latest; return true;
} }
else 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) public void Apply(ParseOptions options, ProjectPropertyStorage storage)
......
...@@ -33,47 +33,37 @@ static string DefaultNamespaceOfSingleProject(TestEnvironment environment) ...@@ -33,47 +33,37 @@ static string DefaultNamespaceOfSingleProject(TestEnvironment environment)
=> environment.Workspace.CurrentSolution.Projects.Single().DefaultNamespace; => environment.Workspace.CurrentSolution.Projects.Single().DefaultNamespace;
} }
[WpfFact] [WpfTheory]
[Trait(Traits.Feature, Traits.Features.ProjectSystemShims)] [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 var catalog = TestEnvironment.s_exportCatalog.Value
.WithParts( .WithParts(
typeof(CSharpParseOptionsChangingService)); typeof(CSharpParseOptionsChangingService));
const LanguageVersion attemptedVersion = LanguageVersion.CSharp8;
var factory = ExportProviderCache.GetOrCreateExportProviderFactory(catalog); var factory = ExportProviderCache.GetOrCreateExportProviderFactory(catalog);
using (var environment = new TestEnvironment(exportProviderFactory: factory)) using (var environment = new TestEnvironment(exportProviderFactory: factory))
using (var project = CSharpHelpers.CreateCSharpCPSProject(environment, "Test")) using (var cpsProject = 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)
{ {
var project = environment.Workspace.CurrentSolution.Projects.Single(); var project = environment.Workspace.CurrentSolution.Projects.Single();
var oldParseOptions = (CSharpParseOptions)project.ParseOptions; var oldParseOptions = (CSharpParseOptions)project.ParseOptions;
return environment.Workspace.CanApplyParseOptionChange( cpsProject.SetProperty(AdditionalPropertyNames.MaxSupportedLangVersion, maxSupportedLangVersion.ToDisplayString());
var canApply = environment.Workspace.CanApplyParseOptionChange(
oldParseOptions, oldParseOptions,
oldParseOptions.WithLanguageVersion(newVersion), oldParseOptions.WithLanguageVersion(attemptedVersion),
project); project);
Assert.Equal(attemptedVersion <= maxSupportedLangVersion, canApply);
} }
} }
} }
......
...@@ -314,7 +314,14 @@ internal string DefaultNamespace ...@@ -314,7 +314,14 @@ internal string DefaultNamespace
w => w.OnDefaultNamespaceChanged(Id, value)); w => w.OnDefaultNamespaceChanged(Id, value));
} }
internal void SetMaxLangVersion(string version) => _workspace.SetMaxLanguageVersion(Id, version); /// <summary>
/// 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.
/// </summary>
internal string MaxLangVersion
{
set => _workspace.SetMaxLanguageVersion(Id, value);
}
#region Batching #region Batching
......
...@@ -1889,11 +1889,11 @@ internal void EnsureDocumentOptionProvidersInitialized() ...@@ -1889,11 +1889,11 @@ internal void EnsureDocumentOptionProvidersInitialized()
} }
} }
internal void SetMaxLanguageVersion(ProjectId projectId, string maxLangVer) internal void SetMaxLanguageVersion(ProjectId projectId, string maxLanguageVersion)
{ {
lock (_gate) lock (_gate)
{ {
_projectToMaxSupportedLangVersionMap[projectId] = maxLangVer; _projectToMaxSupportedLangVersionMap[projectId] = maxLanguageVersion;
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册