public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var diagnostic = context.Diagnostics.First(); var serializedNamingStyle = diagnostic.Properties[nameof(NamingStyle)]; var style = NamingStyle.FromXElement(XElement.Parse(serializedNamingStyle)); var document = context.Document; var span = context.Span; var root = await document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); var node = root.FindNode(span); var model = await document.GetSemanticModelAsync(context.CancellationToken).ConfigureAwait(false); var symbol = model.GetDeclaredSymbol(node, context.CancellationToken); var fixedNames = style.MakeCompliant(symbol.Name); foreach (var fixedName in fixedNames) { var solution = context.Document.Project.Solution; context.RegisterCodeFix( new FixNameCodeAction( string.Format(FeaturesResources.FixNamingViolation, fixedName), async c => await Renamer.RenameSymbolAsync( solution, symbol, fixedName, document.Options, c).ConfigureAwait(false), nameof(AbstractNamingStyleCodeFixProvider)), diagnostic); } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var diagnostic = context.Diagnostics.First(); var serializedNamingStyle = diagnostic.Properties[nameof(NamingStyle)]; var style = NamingStyle.FromXElement(XElement.Parse(serializedNamingStyle)); var document = context.Document; var span = context.Span; var root = await document .GetSyntaxRootAsync(context.CancellationToken) .ConfigureAwait(false); var node = root.FindNode(span); if (document.GetLanguageService <ISyntaxFactsService>().IsIdentifierName(node)) { // The location we get from the analyzer only contains the identifier token and when we get its containing node, // it is usually the right one (such as a variable declarator, designation or a foreach statement) // because there is no other node in between. But there is one case in a VB catch clause where the token // is wrapped in an identifier name. So if what we found is an identifier, take the parent node instead. // Note that this is the correct thing to do because GetDeclaredSymbol never works on identifier names. node = node.Parent; } var model = await document .GetSemanticModelAsync(context.CancellationToken) .ConfigureAwait(false); var symbol = model.GetDeclaredSymbol(node, context.CancellationToken); // TODO: We should always be able to find the symbol that generated this diagnostic, // but this cannot always be done by simply asking for the declared symbol on the node // from the symbol's declaration location. // See https://github.com/dotnet/roslyn/issues/16588 if (symbol == null) { return; } var fixedNames = style.MakeCompliant(symbol.Name); foreach (var fixedName in fixedNames) { context.RegisterCodeFix( new FixNameCodeAction( #if !CODE_STYLE document.Project.Solution, symbol, fixedName, #endif string.Format(CodeFixesResources.Fix_Name_Violation_colon_0, fixedName), c => FixAsync(document, symbol, fixedName, c), equivalenceKey: nameof(NamingStyleCodeFixProvider) ), diagnostic ); } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var diagnostic = context.Diagnostics.First(); var serializedNamingStyle = diagnostic.Properties[nameof(NamingStyle)]; var style = NamingStyle.FromXElement(XElement.Parse(serializedNamingStyle)); var document = context.Document; var span = context.Span; var root = await document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); var node = root.FindNode(span); var model = await document.GetSemanticModelAsync(context.CancellationToken).ConfigureAwait(false); var symbol = model.GetDeclaredSymbol(node, context.CancellationToken); // TODO: We should always be able to find the symbol that generated this diagnostic, // but this cannot always be done by simply asking for the declared symbol on the node // from the symbol's declaration location. // See https://github.com/dotnet/roslyn/issues/16588 if (symbol == null) { return; } var fixedNames = style.MakeCompliant(symbol.Name); foreach (var fixedName in fixedNames) { var solution = context.Document.Project.Solution; context.RegisterCodeFix( new FixNameCodeAction( solution, symbol, fixedName, string.Format(FeaturesResources.Fix_Name_Violation_colon_0, fixedName), c => FixAsync(document, symbol, fixedName, c), equivalenceKey: nameof(NamingStyleCodeFixProvider)), diagnostic); } }