private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context) { var methodDeclaration = (MethodDeclarationSyntax)context.Node; if (AddReturnStatementThatReturnsDefaultValueRefactoring.CanRefactor(methodDeclaration, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(DiagnosticDescriptors.AddReturnStatementThatReturnsDefaultValue, methodDeclaration.Identifier); } AsynchronousMethodNameShouldEndWithAsyncRefactoring.Analyze(context, methodDeclaration); NonAsynchronousMethodNameShouldNotEndWithAsyncRefactoring.Analyze(context, methodDeclaration); }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { SyntaxNode root = await context.GetSyntaxRootAsync().ConfigureAwait(false); MethodDeclarationSyntax methodDeclaration = root .FindNode(context.Span, getInnermostNodeForTie: true)? .FirstAncestorOrSelf <MethodDeclarationSyntax>(); if (methodDeclaration == null) { return; } SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); IMethodSymbol methodSymbol = semanticModel.GetDeclaredSymbol(methodDeclaration, context.CancellationToken); Debug.Assert(methodSymbol != null, $"{nameof(methodSymbol)} is null"); if (methodSymbol != null) { foreach (Diagnostic diagnostic in context.Diagnostics) { switch (diagnostic.Id) { case DiagnosticIdentifiers.AsynchronousMethodNameShouldEndWithAsync: { string oldName = methodDeclaration.Identifier.ValueText; string newName = await NameGenerators.AsyncMethod.EnsureUniqueMemberNameAsync( oldName, methodSymbol, context.Solution(), cancellationToken : context.CancellationToken).ConfigureAwait(false); CodeAction codeAction = CodeAction.Create( $"Rename '{oldName}' to '{newName}'", c => Renamer.RenameSymbolAsync(context.Solution(), methodSymbol, newName, default(OptionSet), c), diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.AddReturnStatementThatReturnsDefaultValue: { CodeAction codeAction = CodeAction.Create( "Add return statement that returns default value", c => AddReturnStatementThatReturnsDefaultValueRefactoring.RefactorAsync(context.Document, methodDeclaration, c), diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } case DiagnosticIdentifiers.NonAsynchronousMethodNameShouldNotEndWithAsync: { string name = methodDeclaration.Identifier.ValueText; string newName = name.Remove(name.Length - AsyncSuffix.Length); newName = await NameGenerator.Default.EnsureUniqueMemberNameAsync( newName, methodSymbol, context.Solution(), cancellationToken : context.CancellationToken).ConfigureAwait(false); CodeAction codeAction = CodeAction.Create( $"Rename '{name}' to '{newName}'", c => Renamer.RenameSymbolAsync(context.Solution(), methodSymbol, newName, default(OptionSet), c), diagnostic.Id + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, diagnostic); break; } } } } }