private static void ConvertStringEmptyToEmptyStringLiteral(CodeRefactoringContext context, MemberAccessExpressionSyntax memberAccess, SemanticModel semanticModel) { if (StringEmptyRefactoring.CanConvertStringEmptyToEmptyStringLiteral(memberAccess, semanticModel, context.CancellationToken)) { context.RegisterRefactoring( "Convert to \"\"", cancellationToken => { return(StringEmptyRefactoring.ConvertStringEmptyToEmptyStringLiteralAsync( context.Document, memberAccess, cancellationToken)); }); } else { memberAccess = (MemberAccessExpressionSyntax)memberAccess .FirstAncestor(SyntaxKind.SimpleMemberAccessExpression); if (memberAccess != null) { ConvertStringEmptyToEmptyStringLiteral(context, memberAccess, semanticModel); } } }
private void AnalyzeSimpleMemberAccessExpression(SyntaxNodeAnalysisContext context) { if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true) { return; } var memberAccess = (MemberAccessExpressionSyntax)context.Node; AnalyzePredefinedType(context, memberAccess); if (StringEmptyRefactoring.CanConvertStringEmptyToEmptyStringLiteral(memberAccess, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic( DiagnosticDescriptors.AvoidUsageOfStringEmpty, memberAccess.GetLocation()); } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { SyntaxNode root = await context .Document .GetSyntaxRootAsync(context.CancellationToken) .ConfigureAwait(false); MemberAccessExpressionSyntax memberAccess = root .FindNode(context.Span, getInnermostNodeForTie: true)? .FirstAncestorOrSelf <MemberAccessExpressionSyntax>(); CodeAction codeAction = CodeAction.Create( "Convert to \"\"", cancellationToken => { return(StringEmptyRefactoring.ConvertStringEmptyToEmptyStringLiteralAsync( context.Document, memberAccess, cancellationToken)); }, DiagnosticIdentifiers.AvoidUsageOfStringEmpty + EquivalenceKeySuffix); context.RegisterCodeFix(codeAction, context.Diagnostics); }