public override void VisitInvocationExpression(InvocationExpressionSyntax node) { IEnumerable <IdentifierNameSyntax> objectAndMethod = node.Expression.DescendantNodes() .OfType <IdentifierNameSyntax>() .TakeLast(2); if (objectAndMethod.Count() == 2) { // Assumption: for this analyser, assuming that variables are declared with a type (not var/base class/interface) IdentifierNameSyntax classIdentifier = objectAndMethod.First(); SyntaxNode declaration = IdentifierDeclarationFinder.Find(classIdentifier); string className = declaration != null ? declaration.ChildNodes().OfType <VariableDeclarationSyntax>().FirstOrDefault()?.Type.ToString() // no declaration was found, assume static method : classIdentifier.Identifier.Text; MethodCalls.Add(new MethodCallHolder(className, node)); } else { string className = node.Ancestors() .OfType <ClassDeclarationSyntax>() .FirstOrDefault()? .Identifier .Text; MethodCalls.Add(new MethodCallHolder(className, node)); } base.VisitInvocationExpression(node); }
public void FindsMethodDeclarationInClass() { string code = @" using System; public class TestClass { public void TestMethod() { var testInt2 = GetTestInt(); } private int GetTestInt() { return 0; } } "; CompilationUnitSyntax root = CSharpSyntaxTree.ParseText(code).GetCompilationUnitRoot(); IdentifierNameSyntax variableNode = root.DescendantNodes() .OfType <IdentifierNameSyntax>() .Where(n => n.Identifier.Text == "GetTestInt") .First(); SyntaxNode declaration = IdentifierDeclarationFinder.Find(variableNode); Assert.NotNull(declaration); Assert.StartsWith("private int GetTestInt()", declaration.ToString()); }
public void FindsDeclarationInMethodParameter() { string code = @" using System; public class TestClass { public void testMethod(int testInt) { var testInt2 = testInt; } } "; CompilationUnitSyntax root = CSharpSyntaxTree.ParseText(code).GetCompilationUnitRoot(); IdentifierNameSyntax variableNode = root.DescendantNodes() .OfType <IdentifierNameSyntax>() .Where(n => n.Identifier.Text == "testInt") .Last(); SyntaxNode declaration = IdentifierDeclarationFinder.Find(variableNode); Assert.NotNull(declaration); Assert.Equal("int testInt", declaration.ToString()); }
public static Type GetNodeDataType(SyntaxNode node) { IdentifierNameSyntax castedNode = (IdentifierNameSyntax)node; SyntaxNode declarationNode = IdentifierDeclarationFinder.Find(castedNode); // IdentifierDeclarationFinder will throw exception if it can't find the declaration, // so don't need to check and throw here return(TypeResolver.GetNodeDataType(declarationNode)); }