/// <inheritdoc/> protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContext context) { var syntaxRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken) .ConfigureAwait(false); foreach (var diagnostic in context.Diagnostics) { var node = syntaxRoot.FindNode(diagnostic.Location.SourceSpan); if (node is IdentifierNameSyntax identifierName) { context.RegisterCodeFix( "Throw if null.", (editor, _) => editor.ReplaceNode( node, SyntaxFactory.ParseExpression($"{identifierName.Identifier.ValueText} ?? throw new System.ArgumentNullException(nameof({identifierName.Identifier.ValueText}))").WithSimplifiedNames()), this.GetType(), diagnostic); } else if (node is ParameterSyntax parameter) { var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken) .ConfigureAwait(false); var method = parameter.FirstAncestor <BaseMethodDeclarationSyntax>(); if (method != null) { using (var walker = AssignmentExecutionWalker.Borrow(method, Search.TopLevel, semanticModel, context.CancellationToken)) { if (TryFirstAssignedWith(parameter, walker.Assignments, out var assignedValue)) { context.RegisterCodeFix( "Throw if null on first assignment.", (editor, _) => editor.ReplaceNode( assignedValue, SyntaxFactory.ParseExpression($"{assignedValue.Identifier.ValueText} ?? throw new System.ArgumentNullException(nameof({assignedValue.Identifier.ValueText}))").WithSimplifiedNames()), this.GetType(), diagnostic); } else if (method.Body != null) { context.RegisterCodeFix( "Add null check.", (editor, _) => editor.ReplaceNode( method.Body, method.Body.InsertNodesBefore( method.Body.Statements[0], new[] { IfNullThrow(parameter.Identifier.ValueText) })), this.GetType(), diagnostic); } } } } } }
/// <inheritdoc/> protected override async Task RegisterCodeFixesAsync(DocumentEditorCodeFixContext context) { var syntaxRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken) .ConfigureAwait(false); foreach (var diagnostic in context.Diagnostics) { var node = syntaxRoot.FindNode(diagnostic.Location.SourceSpan); if (node is IdentifierNameSyntax identifierName) { context.RegisterCodeFix( "Throw if null.", (editor, _) => editor.ReplaceNode( node, SyntaxFactory.ParseExpression($"{identifierName.Identifier.ValueText} ?? throw new System.ArgumentNullException(nameof({identifierName.Identifier.ValueText}))").WithSimplifiedNames()), this.GetType(), diagnostic); } else if (node is ParameterSyntax parameter) { var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken) .ConfigureAwait(false); if (parameter.Parent is ParameterListSyntax parameterList && parameterList.Parent is BaseMethodDeclarationSyntax methodDeclaration) { using (var walker = AssignmentExecutionWalker.Borrow(methodDeclaration, Scope.Member, semanticModel, context.CancellationToken)) { if (TryFirstAssignedWith(parameter, walker.Assignments, out var assignedValue)) { context.RegisterCodeFix( "Throw if null on first assignment.", (editor, _) => editor.ReplaceNode( assignedValue, SyntaxFactory.ParseExpression($"{assignedValue.Identifier.ValueText} ?? throw new System.ArgumentNullException(nameof({assignedValue.Identifier.ValueText}))").WithSimplifiedNames()), this.GetType(), diagnostic); } else if (methodDeclaration.Body is BlockSyntax block) { context.RegisterCodeFix( "Add null check.", (editor, _) => editor.ReplaceNode( block, x => WithNullCheck(x, parameter)), this.GetType(), diagnostic); } } } } } }