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); }
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); }
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); }
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); } } } } } } }
public SyntaxNode GetSyntaxNodeFromLocation(Location location) { return(RolsynExtensions.GetSyntaxNodeFromLocation(this.solution, location)); }