private IFieldSymbol GetNamedField( INamedTypeSymbol containingType, IFieldSymbol unnamedField, CancellationToken cancellationToken) { foreach (var member in containingType.GetMembers()) { cancellationToken.ThrowIfCancellationRequested(); if (member.Kind == SymbolKind.Field) { var fieldSymbol = (IFieldSymbol)member; if (unnamedField.Equals(fieldSymbol.CorrespondingTupleField) && !fieldSymbol.Name.Equals(unnamedField.Name)) { return(fieldSymbol); } } } return(null); }
internal static bool Assigns(IFieldSymbol field, SyntaxNode scope, SemanticModel semanticModel, CancellationToken cancellationToken) { if (field == null || scope == null) { return(false); } using (var walker = Borrow(scope)) { foreach (var assignment in walker.Assignments) { var assignedSymbol = semanticModel.GetSymbolSafe(assignment.Left, cancellationToken); if (field.Equals(assignedSymbol)) { return(true); } } } return(false); }
private static bool IsDisposeWithNullPropagationCallOnField(InvocationExpressionSyntax expression, IFieldSymbol fieldSymbol, SemanticModel semanticModel) { var memberBinding = (MemberBindingExpressionSyntax)expression.Expression; if (memberBinding?.Name == null) { return(false); } if (memberBinding.Name.Identifier.ToString() != "Dispose" || memberBinding.Name.Arity != 0) { return(false); } var conditionalAccessExpression = memberBinding.Parent.Parent as ConditionalAccessExpressionSyntax; if (conditionalAccessExpression == null) { return(false); } var result = fieldSymbol.Equals(semanticModel.GetSymbolInfo(conditionalAccessExpression.Expression).Symbol); return(result); }
public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeActionInNonGenerated( c => { var propertyDeclaration = (PropertyDeclarationSyntax)c.Node; var propertySymbol = c.SemanticModel.GetDeclaredSymbol(propertyDeclaration); if (propertyDeclaration.AccessorList == null || propertyDeclaration.AccessorList.Accessors.Count != 2 || propertySymbol == null) { return; } var getter = propertyDeclaration.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration)); var setter = propertyDeclaration.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.SetAccessorDeclaration)); if (getter == null || setter == null) { return; } IFieldSymbol getterField = null; IFieldSymbol setterField = null; if (TryGetFieldFromGetter(getter, c.SemanticModel, out getterField) && TryGetFieldFromSetter(setter, c.SemanticModel, out setterField) && getterField.Equals(setterField) && !getterField.GetAttributes().Any() && getterField.IsStatic == propertySymbol.IsStatic && getterField.Type.Equals(propertySymbol.Type)) { c.ReportDiagnostic(Diagnostic.Create(Rule, propertyDeclaration.Identifier.GetLocation())); } }, SyntaxKind.PropertyDeclaration); }
private static bool CallsDisposeOnField(IFieldSymbol fieldSymbol, MethodDeclarationSyntax method, SemanticModel semanticModel) { var body = (SyntaxNode)method.Body ?? method.ExpressionBody; var hasDisposeCall = body.DescendantNodes().OfKind <InvocationExpressionSyntax>(SyntaxKind.InvocationExpression) .Any(invocation => { if (!invocation?.Expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) ?? true) { return(false); } var memberAccess = (MemberAccessExpressionSyntax)invocation.Expression; if (memberAccess?.Name == null) { return(false); } if (memberAccess.Name.Identifier.ToString() != "Dispose" || memberAccess.Name.Arity != 0) { return(false); } return(fieldSymbol.Equals(semanticModel.GetSymbolInfo(memberAccess.Expression).Symbol)); }); return(hasDisposeCall); }
private static bool CallsDisposeOnField(IFieldSymbol fieldSymbol, MethodDeclarationSyntax method, SemanticModel semanticModel) { var body = (SyntaxNode)method.Body ?? method.ExpressionBody; var hasDisposeCall = body.DescendantNodes().OfKind<InvocationExpressionSyntax>(SyntaxKind.InvocationExpression) .Any(invocation => { if (!invocation?.Expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) ?? true) return false; var memberAccess = (MemberAccessExpressionSyntax)invocation.Expression; if (memberAccess?.Name == null) return false; if (memberAccess.Name.Identifier.ToString() != "Dispose" || memberAccess.Name.Arity != 0) return false; if (!memberAccess.Expression.IsKind(SyntaxKind.IdentifierName)) return false; return fieldSymbol.Equals(semanticModel.GetSymbolInfo(memberAccess.Expression).Symbol); }); return hasDisposeCall; }
private IFieldSymbol GetNamedField( INamedTypeSymbol containingType, IFieldSymbol unnamedField, CancellationToken cancellationToken) { foreach (var member in containingType.GetMembers()) { cancellationToken.ThrowIfCancellationRequested(); if (member.Kind == SymbolKind.Field) { var fieldSymbol = (IFieldSymbol)member; if (unnamedField.Equals(fieldSymbol.CorrespondingTupleField) && !fieldSymbol.Name.Equals(unnamedField.Name)) { return fieldSymbol; } } } return null; }
private static bool CallsDisposeOnField(IFieldSymbol fieldSymbol, MethodDeclarationSyntax disposeMethod, SemanticModel semanticModel) { var hasDisposeCall = disposeMethod.Body.Statements.OfType<ExpressionStatementSyntax>() .Any(exp => { var invocation = exp.Expression as InvocationExpressionSyntax; if (!invocation?.Expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) ?? true) return false; var memberAccess = (MemberAccessExpressionSyntax)invocation.Expression; if (memberAccess.Name.Identifier.ToString() != "Dispose" || memberAccess.Name.Arity != 0) return false; var memberAccessIdentificer = memberAccess.Expression as IdentifierNameSyntax; if (memberAccessIdentificer == null) return false; return fieldSymbol.Equals(semanticModel.GetSymbolInfo(memberAccessIdentificer).Symbol); }); return hasDisposeCall; }