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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
 }