提交 318c4bf5 编写于 作者: C Cyrus Najmabadi

Add feature to generate a member name for an anonymous type.

上级 0c884ee6
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
using System.Composition;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
namespace Microsoft.CodeAnalysis.CSharp.AddAnonymousTypeMemberName
{
[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
internal class AddAnonymousTypeMemberNameCodeFixProvider : SyntaxEditorBasedCodeFixProvider
{
private const string CS0746 = nameof(CS0746); // Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.
public override ImmutableArray<string> FixableDiagnosticIds { get; }
= ImmutableArray.Create(CS0746);
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var document = context.Document;
var cancellationToken = context.CancellationToken;
var diagnostic = context.Diagnostics[0];
var declarator = await GetMemberDeclaratorAsync(document, diagnostic, cancellationToken).ConfigureAwait(false);
if (declarator == null)
{
return;
}
context.RegisterCodeFix(
new MyCodeAction(c => FixAsync(document, diagnostic, c)),
context.Diagnostics);
}
private async Task<AnonymousObjectMemberDeclaratorSyntax> GetMemberDeclaratorAsync(
Document document, Diagnostic diagnostic, CancellationToken cancellationToken)
{
var span = diagnostic.Location.SourceSpan;
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var node = root.FindNode(span, getInnermostNodeForTie: true) as ExpressionSyntax;
if (node?.Span != span)
{
return null;
}
if (!(node.Parent is AnonymousObjectMemberDeclaratorSyntax declarator))
{
return null;
}
// Can't add a name of the declarator already has a name.
if (declarator.NameEquals != null)
{
return null;
}
return declarator;
}
protected override async Task FixAllAsync(
Document document, ImmutableArray<Diagnostic> diagnostics,
SyntaxEditor editor, CancellationToken cancellationToken)
{
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
foreach (var diagnostic in diagnostics)
{
await FixOneAsync(
document, semanticModel, diagnostic,
editor, cancellationToken).ConfigureAwait(false);
}
}
private async Task FixOneAsync(
Document document, SemanticModel semanticModel, Diagnostic diagnostic,
SyntaxEditor editor, CancellationToken cancellationToken)
{
var declarator = await GetMemberDeclaratorAsync(document, diagnostic, cancellationToken).ConfigureAwait(false);
if (declarator == null)
{
return;
}
var semanticFacts = document.GetLanguageService<ISemanticFactsService>();
var name = semanticFacts.GenerateNameForExpression(semanticModel, declarator.Expression, capitalize: true, cancellationToken);
if (string.IsNullOrEmpty(name))
{
return;
}
editor.ReplaceNode(
declarator,
(current, _) =>
{
var currentDeclarator = (AnonymousObjectMemberDeclaratorSyntax)current;
return currentDeclarator.WithNameEquals(SyntaxFactory.NameEquals(name));
});
}
private class MyCodeAction : CodeAction.DocumentChangeAction
{
public MyCodeAction(Func<CancellationToken, Task<Document>> createChangedDocument)
: base(FeaturesResources.Add_member_name, createChangedDocument)
{
}
}
}
}
......@@ -179,6 +179,15 @@ internal class FeaturesResources {
}
}
/// <summary>
/// Looks up a localized string similar to Add member name.
/// </summary>
internal static string Add_member_name {
get {
return ResourceManager.GetString("Add_member_name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Add missing cases.
/// </summary>
......@@ -941,7 +950,7 @@ internal class FeaturesResources {
return ResourceManager.GetString("Convert_to_query", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Convert to struct.
/// </summary>
......
......@@ -1403,4 +1403,7 @@ This version used in: {2}</value>
<data name="Formatting_document" xml:space="preserve">
<value>Formatting document</value>
</data>
<data name="Add_member_name" xml:space="preserve">
<value>Add member name</value>
</data>
</root>
\ No newline at end of file
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="cs" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="de" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="es" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="fr" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="it" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ja" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ko" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="pl" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="pt-BR" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="ru" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="tr" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="zh-Hans" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
......@@ -2,6 +2,11 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
<file datatype="xml" source-language="en" target-language="zh-Hant" original="../FeaturesResources.resx">
<body>
<trans-unit id="Add_member_name">
<source>Add member name</source>
<target state="new">Add member name</target>
<note />
</trans-unit>
<trans-unit id="Add_parameter_to_0_and_overrides_implementations">
<source>Add parameter to '{0}' (and overrides/implementations)</source>
<target state="new">Add parameter to '{0}' (and overrides/implementations)</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册