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

PR feedback

上级 ef0abfae
......@@ -682,6 +682,6 @@ public void ChangeSolution(Solution solution)
}
public override bool CanApplyParseOptionChange(ParseOptions oldOptions, ParseOptions newOptions, Project project)
=> true;
=> true;
}
}
......@@ -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)
......
......@@ -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);
}
}
}
......
......@@ -314,7 +314,14 @@ internal string DefaultNamespace
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
......
......@@ -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;
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册