Пример #1
0
        private bool CheckMethod(IMethodSymbol methodSymbol)
        {
            Location   location   = methodSymbol.Locations[0];
            SyntaxNode syntaxNode = RolsynExtensions.GetSyntaxNodeFromLocation(solution, location);

            SemanticModel semanticModel = RolsynExtensions.GetSemanticModelFromLocation(solution, location);
            bool          result        = false;

            if (syntaxNode is MethodDeclarationSyntax)
            {
                MethodDeclarationSyntax             methodDeclarationSyntax = syntaxNode as MethodDeclarationSyntax;
                SyntaxList <StatementSyntax>        statements = methodDeclarationSyntax.Body.Statements;
                IEnumerable <ReturnStatementSyntax> returns    = statements.OfType <ReturnStatementSyntax>();
                foreach (ReturnStatementSyntax returnSyntax in returns)
                {
                    ISymbol returnSymbol = semanticModel.GetSymbolInfo(returnSyntax.Expression).Symbol;
                    if (returnSymbol is IFieldSymbol)
                    {
                        return(CheckFieldSymbol(returnSymbol as IFieldSymbol));
                    }
                }
            }
            ISymbol isymbol = semanticModel.GetDeclaredSymbol(syntaxNode);

            return(result);
        }
Пример #2
0
        private bool CheckLocalSymbol(ILocalSymbol localSymbol)
        {
            Location      location      = localSymbol.Locations[0];
            SyntaxNode    syntaxNode    = RolsynExtensions.GetSyntaxNodeFromLocation(solution, location);
            SemanticModel semanticModel = RolsynExtensions.GetSemanticModelFromLocation(solution, location);
            ISymbol       isymbol       = semanticModel.GetDeclaredSymbol(syntaxNode);
            bool          result        = false;
            IEnumerable <ReferencedSymbol> referenceSymbols = SymbolFinder.FindReferencesAsync(isymbol, solution).Result;

            RolsynExtensions.IterateReferenceSymbols(referenceSymbols, (ISymbol symbol, ReferenceLocation referenceLocation) =>
            {
                SyntaxNode referenceNode = RolsynExtensions.GetSyntaxNodeFromLocation(solution, referenceLocation.Location);
                SyntaxNode parentNode    = referenceNode.Parent;
                if (parentNode is AssignmentExpressionSyntax)
                {
                    AssignmentExpressionSyntax assignmentExpressSyntax = parentNode as AssignmentExpressionSyntax;
                    SyntaxNode rightNode = assignmentExpressSyntax.Right;
                    ISymbol rightSymbol  = RolsynExtensions.GetISymbolFromSyntaxNode(solution, rightNode);
                    if (rightSymbol is IFieldSymbol)
                    {
                        result = this.CheckFieldSymbol(rightSymbol as IFieldSymbol);
                        return;
                    }
                }
            });
            return(result);
        }
Пример #3
0
        private bool CheckParameterSymbol(IParameterSymbol parameterSymbol)
        {
            bool          result          = false;
            Location      location        = parameterSymbol.Locations[0];
            SyntaxNode    syntaxNode      = RolsynExtensions.GetSyntaxNodeFromLocation(solution, location);
            SemanticModel semanticModel   = RolsynExtensions.GetSemanticModelFromLocation(solution, location);
            ISymbol       workspaceSymbol = semanticModel.GetDeclaredSymbol(syntaxNode);

            ISymbol containerSymbol = workspaceSymbol.ContainingSymbol;
            IEnumerable <ReferencedSymbol> referenceSymbols = SymbolFinder.FindReferencesAsync(containerSymbol, solution).Result;

            RolsynExtensions.IterateReferenceSymbols(referenceSymbols, (ISymbol referenceSymbol, ReferenceLocation referenceLocation) =>
            {
                SyntaxNode referenceNode = RolsynExtensions.GetSyntaxNodeFromLocation(solution, referenceLocation.Location);
                InvocationExpressionSyntax invocationExpressionSyntax = referenceNode.Parent as InvocationExpressionSyntax;
                if (invocationExpressionSyntax != null)
                {
                    RolsynExtensions.IterateArgumentSyntax(invocationExpressionSyntax.ArgumentList, (ArgumentListSyntax argumentListSyntax, ArgumentSyntax argumentSyntax) =>
                    {
                        if (result)
                        {
                            return;
                        }
                        ISymbol isymbol = semanticModel.GetSymbolInfo(argumentSyntax.Expression).Symbol;
                        if (isymbol is IFieldSymbol)
                        {
                            result = CheckFieldSymbol(isymbol as IFieldSymbol);
                        }
                    });
                }
            });
            return(result);
        }
Пример #4
0
        public DoNotModifyReadonlyArrayAnalyzer(Solution solution) : base(solution)
        {
            foreach (Project project in solution.Projects)
            {
                foreach (var document in project.Documents)
                {
                    SemanticModel semanticModel = document.GetSemanticModelAsync().Result;
                    var           syntaxRoot    = document.GetSyntaxRootAsync().Result;
                    var           readonlyNodes = syntaxRoot.DescendantNodes().OfType <FieldDeclarationSyntax>();
                    foreach (var readonlyNode in readonlyNodes)
                    {
                        foreach (var variable in readonlyNode.Declaration.Variables)
                        {
                            var fieldSymbol = semanticModel.GetDeclaredSymbol(variable) as IFieldSymbol;
                            if (fieldSymbol.IsReadOnly && fieldSymbol.Type.TypeKind == TypeKind.Array)
                            {
                                var referencedSymbols = SymbolFinder.FindReferencesAsync(fieldSymbol, solution).Result;
                                if (referencedSymbols != null)
                                {
                                    foreach (ReferencedSymbol referencedSymbol in referencedSymbols)
                                    {
                                        foreach (ReferenceLocation location in referencedSymbol.Locations)
                                        {
                                            SyntaxNode syntaxNode = RolsynExtensions.GetSyntaxNodeFromLocation(solution, location.Location);

                                            if (syntaxNode is ElementAccessExpressionSyntax)
                                            {
                                                int b = 1;
                                            }
                                            int a = 1;
                                        }
                                    }
                                    ReadonlyArrayReferences.Add(referencedSymbols);
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
 public SyntaxNode GetSyntaxNodeFromLocation(Location location)
 {
     return(RolsynExtensions.GetSyntaxNodeFromLocation(this.solution, location));
 }