未验证 提交 336cd2dc 编写于 作者: A Andrew Hall 提交者: GitHub

Merge pull request #34914 Update upgrade fixer

Don’t suggest upgrading to an unsupported state
......@@ -2,6 +2,7 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp;
......@@ -46,10 +47,27 @@ internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProvider
await TestAsync(initialMarkup, initialMarkup, parseOptions); // no change to markup
}
private async Task TestLanguageVersionNotUpgradedAsync(string initialMarkup,
#pragma warning disable IDE0060 // Remove unused parameter
LanguageVersion expected,
#pragma warning restore IDE0060 // Remove unused parameter
ParseOptions parseOptions,
int index = 0)
{
var parameters = new TestParameters(parseOptions: parseOptions, index: index);
using (var workspace = CreateWorkspaceFromOptions(initialMarkup, parameters))
{
var (actions, actionsToInvoke) = await GetCodeActionsAsync(workspace, parameters);
Assert.Empty(actions);
Assert.Null(actionsToInvoke);
}
}
[Fact]
public async Task UpgradeProjectFromCSharp7_2ToCSharp8()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"class C
{
object F = [|null!|];
......@@ -61,7 +79,7 @@ public async Task UpgradeProjectFromCSharp7_2ToCSharp8()
[Fact]
public async Task UpgradeProjectFromCSharp7ToCSharp8()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"class C
{
object F = [|null!|];
......@@ -321,7 +339,7 @@ class Program
[Fact]
public async Task UpgradeProjectForVerbatimInterpolatedString()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
class Program
{
......@@ -366,7 +384,7 @@ void A()
[Fact]
public async Task UpgradeAllProjectsToCSharp8()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"<Workspace>
<Project Language=""C#"" LanguageVersion=""6"">
<Document>
......@@ -471,10 +489,8 @@ void A()
<Project Language=""C#"" LanguageVersion=""800"">
</Project>
</Workspace>",
new[] {
string.Format(CSharpFeaturesResources.Upgrade_this_project_to_csharp_language_version_0, versionPreview),
string.Format(CSharpFeaturesResources.Upgrade_all_csharp_projects_to_language_version_0, versionPreview)
});
new string[0]
);
}
[Fact]
......@@ -578,10 +594,7 @@ class C
<Project Language=""Visual Basic"">
</Project>
</Workspace>",
new[] {
string.Format(CSharpFeaturesResources.Upgrade_this_project_to_csharp_language_version_0, previewVersion),
string.Format(CSharpFeaturesResources.Upgrade_all_csharp_projects_to_language_version_0, previewVersion)
});
new string[0]);
}
[Fact]
......@@ -737,7 +750,7 @@ public void N()
[Fact]
public async Task UpgradeProjectForDefaultInterfaceImplementation_CS8703()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
public interface I1
{
......@@ -751,7 +764,7 @@ public interface I1
[Fact]
public async Task UpgradeProjectForDefaultInterfaceImplementation_CS8706()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
<Workspace>
<Project Language=""C#"" AssemblyName=""Assembly1"" CommonReferences=""true"">
......@@ -780,7 +793,7 @@ void M1()
[Fact]
public async Task UpgradeProjectWithOpenTypeMatchingConstantPattern_01()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
class Test
{
......@@ -793,7 +806,7 @@ class Test
[Fact]
public async Task UpgradeProjectWithOpenTypeMatchingConstantPattern_02()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
class Test
{
......@@ -806,7 +819,7 @@ class Test
[Fact]
public async Task UpgradeProjectWithOpenTypeMatchingConstantPattern_03()
{
await TestLanguageVersionUpgradedAsync(
await TestLanguageVersionNotUpgradedAsync(
@"
class Test
{
......
......@@ -85,8 +85,11 @@ public override bool IsUpgrade(ParseOptions projectOptions, string newVersion)
var parseOptions = (CSharpParseOptions)projectOptions;
Contract.ThrowIfFalse(LanguageVersionFacts.TryParse(newVersion, out var parsedNewVersion));
var mappedVersion = parsedNewVersion.MapSpecifiedToEffectiveVersion();
// treat equivalent versions (one generic and one specific) to be a valid upgrade
return parsedNewVersion.MapSpecifiedToEffectiveVersion() >= parseOptions.LanguageVersion &&
return mappedVersion >= parseOptions.LanguageVersion &&
mappedVersion < LanguageVersion.CSharp8 &&
parseOptions.SpecifiedLanguageVersion.ToDisplayString() != newVersion;
}
}
......
......@@ -39,15 +39,24 @@ protected ImmutableArray<CodeAction> GetUpgradeProjectCodeActionsAsync(CodeFixCo
var project = context.Document.Project;
var solution = project.Solution;
var newVersion = SuggestedVersion(context.Diagnostics);
var result = new List<CodeAction>();
var language = project.Language;
var upgradeableProjects = solution.Projects.Where(p => CanUpgrade(p, language, newVersion)).AsImmutable();
if (upgradeableProjects.Length == 0)
{
return ImmutableArray<CodeAction>.Empty;
}
var fixOneProjectTitle = string.Format(UpgradeThisProjectResource, newVersion);
var fixOneProject = new ProjectOptionsChangeAction(fixOneProjectTitle,
_ => Task.FromResult(UpgradeProject(project, newVersion)));
result.Add(fixOneProject);
if (solution.Projects.Count(p => CanUpgrade(p, language, newVersion)) > 1)
if (upgradeableProjects.Length > 1)
{
var fixAllProjectsTitle = string.Format(UpgradeAllProjectsResource, newVersion);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册