public override SyntaxNode?VisitInvocationExpression(InvocationExpressionSyntax node) { var nullableArguments = node.ArgumentList.Arguments .Select((arg, index) => (Argument: arg, Index: index)) .Where(indexedArg => NullUtilities.CanBeNull(indexedArg.Argument.Expression, _semanticModel)) .ToList(); if (nullableArguments.Count == 0) { return(node); } var methodDeclaration = _semanticModel.GetSymbolInfo(node); var methodSyntax = (MethodDeclarationSyntax?)methodDeclaration.Symbol?.DeclaringSyntaxReferences .FirstOrDefault()? .GetSyntaxAsync()?.GetAwaiter().GetResult(); if (methodSyntax == null) { return(node); } foreach (var indexedArg in nullableArguments) { var nullableParameter = methodSyntax.ParameterList.Parameters[indexedArg.Index]; _parameterCallback(nullableParameter); } return(node); }
private bool IsInitializedToNull(VariableDeclaratorSyntax variableDeclarator) { if (variableDeclarator.Initializer != null) { return(NullUtilities.CanBeNull(variableDeclarator.Initializer.Value, _semanticModel)); } return(false); }
public override SyntaxNode?VisitCastExpression(CastExpressionSyntax node) { var type = node.Type; if (type is NullableTypeSyntax) { return(node); } return(NullUtilities.CanBeNull(node.Expression, _semanticModel) ? node.WithType(NullUtilities.ToNullable(type)) : node); }
private bool GetterReturnsNull(PropertyDeclarationSyntax node) { var propertySymbol = _semanticModel.GetDeclaredSymbol(node); if (propertySymbol.GetMethod == null) { return(false); } var getter = propertySymbol.GetMethod; var getterSyntax = getter.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() as AccessorDeclarationSyntax; if (getterSyntax?.Body != null) { return(NullUtilities.ReturnsNull(getterSyntax.Body.Statements, _semanticModel)); } if (getterSyntax?.ExpressionBody != null) { return(NullUtilities.CanBeNull(getterSyntax.ExpressionBody.Expression, _semanticModel)); } return(false); }
private bool IsNotNullInitialized(PropertyDeclarationSyntax node) { return(node.Initializer != null && !NullUtilities.CanBeNull(node.Initializer.Value, _semanticModel)); }