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);
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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));
        }