public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node) { var identifierText = (node.Expression as IdentifierNameSyntax)?.Identifier.Text; if (identifierText != nameof(Type) || identifierText != nameof(TypeCode)) { var symbol = SymbolHelper.GetSymbol(node.Expression, SemanticModel); if (symbol != null && _newObjectsAndLocks.Keys.Contains(symbol)) { var objectLocks = _newObjectsAndLocks[symbol]; if (!objectLocks.All(x => CurrentLock.Contains(x))) { if (!PotentialIssuesFound.Contains(symbol)) { if (GloablOptions.Verbose) { Console.WriteLine($"For node {node}"); Console.WriteLine($"With parent {node.Parent}"); Console.WriteLine($"In lock(s) {String.Join(", ", objectLocks)}"); Console.WriteLine(); } PotentialIssuesFound.Add(symbol); } } } } base.VisitMemberAccessExpression(node); }
public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) { if (InMethod && CurrentLock.Count > 0) { ISymbol symbol = null; if (node.Parent is AssignmentExpressionSyntax assignmentExpressionSyntax) { symbol = SymbolHelper.GetSymbol(assignmentExpressionSyntax.Left, SemanticModel); } else if (node.Parent is ThrowStatementSyntax || node.Parent is YieldStatementSyntax || node.Parent is ArgumentSyntax || node.Parent is ReturnStatementSyntax) { // do nothing } else if (node.Parent.Parent is VariableDeclaratorSyntax variableDeclaratorSyntax) { symbol = SemanticModel.GetDeclaredSymbol(variableDeclaratorSyntax); } if (symbol != null) { var blockSyntax = node.Parent.Ancestors().OfType <BlockSyntax>().First(); var analyzeBlockWalker = new AnalyzeBlockWalker(SemanticModel, symbol); analyzeBlockWalker.Visit(blockSyntax); var nonVolatileFieldsAndProperties = analyzeBlockWalker.NonVolatileFieldsAndProperties.ToList(); if (nonVolatileFieldsAndProperties.Any()) { var locks = CurrentLock.ToList(); foreach (var nonVolatileFieldsAndProperty in nonVolatileFieldsAndProperties) { if (!NewObjectsAndLocks.ContainsKey(nonVolatileFieldsAndProperty)) { if (GloablOptions.Verbose) { Console.WriteLine($"For node {node}"); Console.WriteLine($"With parent {node.Parent}"); Console.WriteLine($"In lock(s) {String.Join(", ", locks)}"); Console.WriteLine(); } NewObjectsAndLocks.Add(nonVolatileFieldsAndProperty, locks); } } } } } base.VisitObjectCreationExpression(node); }