bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed) { wasUsed = false; foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType <ExpressionSyntax>()) { var info = model.GetSymbolInfo(usage).Symbol; if (info == symbol) { wasUsed = true; } if (!usage.IsWrittenTo()) { continue; } if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression))) { if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic) { continue; } } if (info == symbol) { return(true); } } return(false); }
bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed) { wasUsed = false; foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType <ExpressionSyntax>()) { var info = model.GetSymbolInfo(usage).Symbol; if (info == symbol) { wasUsed = true; } if (!usage.IsWrittenTo()) { // Special case: If variable is of a value type, check if one of its members is altered. var memberAccExpr = usage.Parent as MemberAccessExpressionSyntax; if (symbol.GetReturnType().IsReferenceType || (memberAccExpr == null) || (info != symbol) || (memberAccExpr.Name == usage) || !memberAccExpr.IsWrittenTo()) { continue; } } if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression))) { if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic) { continue; } } if (info == symbol) { return(true); } } return(false); }
public static MemberDeclarationSyntax getPrevious(SyntaxNode current) { SyntaxNode parent = current.Parent; MemberDeclarationSyntax previous = null; foreach (MemberDeclarationSyntax node in parent.ChildNodes().OfType <MemberDeclarationSyntax>()) { if (node.Equals(current)) { if (previous == null) { return(parent.Parent != null ? (MemberDeclarationSyntax)parent : null); } if (isContainer(previous)) { return(previous.DescendantNodesAndSelf().OfType <MemberDeclarationSyntax>().LastOrDefault()); } return(previous); } previous = node; } // this should never happen. By definition the node will be found within its own parent's children return(null); }
bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed) { wasUsed = false; foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType<ExpressionSyntax>()) { var info = model.GetSymbolInfo(usage).Symbol; if (info == symbol) wasUsed = true; if (!usage.IsWrittenTo()) continue; if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression))) { if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic) continue; } if (info == symbol) return true; } return false; }
bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed) { wasUsed = false; foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType<ExpressionSyntax>()) { var info = model.GetSymbolInfo(usage).Symbol; if (info == symbol) wasUsed = true; if (!usage.IsWrittenTo()) { // Special case: If variable is of a value type, check if one of its members is altered. var memberAccExpr = usage.Parent as MemberAccessExpressionSyntax; if (symbol.GetReturnType().IsReferenceType || (memberAccExpr == null) || (info != symbol) || (memberAccExpr.Name == usage) || !memberAccExpr.IsWrittenTo()) continue; } if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression))) { if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic) continue; } if (info == symbol) return true; } return false; }