private static bool AssignedType(ISymbol symbol, SemanticModel semanticModel, CancellationToken cancellationToken, out ITypeSymbol memberType) { foreach (var reference in symbol.DeclaringSyntaxReferences) { var node = reference.GetSyntax(cancellationToken); if (AssignmentWalker.SingleForSymbol( symbol, node.FirstAncestor <TypeDeclarationSyntax>(), Search.TopLevel, semanticModel, cancellationToken, out var assignment) && assignment.Right is IdentifierNameSyntax identifier) { var ctor = assignment.FirstAncestor <ConstructorDeclarationSyntax>(); if (ctor != null && ctor.ParameterList != null && ctor.ParameterList.Parameters.TryGetFirst( p => p.Identifier.ValueText == identifier.Identifier.ValueText, out var parameter)) { memberType = semanticModel.GetDeclaredSymbolSafe(parameter, cancellationToken)?.Type; return(true); } } } memberType = null; return(false); }
internal static bool TryGetAssignment(this BlockSyntax body, ISymbol symbol, SemanticModel semanticModel, CancellationToken cancellationToken, out AssignmentExpressionSyntax result) { result = null; if (symbol == null) { return(false); } return(AssignmentWalker.FirstWith(symbol, body, Search.TopLevel, semanticModel, cancellationToken, out result)); }
/// <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 = AssignmentWalker.Create(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); } } } } } }
internal static bool AssignsSymbolInSetter(IPropertySymbol property, ISymbol symbol, SemanticModel semanticModel, CancellationToken cancellationToken) { var setMethod = property?.SetMethod; if (setMethod == null || setMethod.DeclaringSyntaxReferences.Length == 0) { return(false); } if (TryGetSetter(property, cancellationToken, out AccessorDeclarationSyntax setter)) { if (AssignmentWalker.FirstForSymbol(symbol, setter, Search.Recursive, semanticModel, cancellationToken)) { return(true); } } return(false); }