public async Task ExtractsORMModelTree_When_MethodHasADbAccessingMethodCallStatement()
        {
            //Arrange
            var solGen   = new RoslynComplexSolutionGenerator();
            var solution = solGen.GetRoslynSolution();

            SyntaxNode rootNodeCustomerRepository
                = await solGen.GetRootNodeForCustomerRepositoryClassDocument();

            IEnumerable <MethodDeclarationSyntax> methodDeclarations = rootNodeCustomerRepository.DescendantNodes().OfType <MethodDeclarationSyntax>();

            SemanticModel model = await solGen.GetSemanticModelForCustomerRepositoryClass();

            await ExtractEntityDeclarations(solution);

            var dbQueryExtractor = new LINQToSQLDatabaseQueryExtractor(model, dbEntityDeclarations);

            dbQueryExtractor.Visit(rootNodeCustomerRepository);
            var databaseQueries = dbQueryExtractor.DatabaseQueries;

            target = new RoslynORMModelTreeExtractor(databaseQueries);
            //Act
            ORMModelTree result = target.Extract(methodDeclarations.First());

            //Assert
            Assert.IsTrue(result.RootNode.Model is MethodDeclaration);
            Assert.IsTrue((result.RootNode as MethodDeclaration).MethodName == "GetCustomer");

            Assert.IsTrue(result.RootNode.ChildNodes[0] is DatabaseAccessingMethodCallStatement <LINQToSQL>);
        }
示例#2
0
        public ORMModelTreeGenerator()
        {
            var rootMethodDeclaration = new MethodDeclaration("Main", null);
            var rootNode = new ORMModelNode(rootMethodDeclaration);

            Tree = new ORMModelTree(rootNode);
        }
示例#3
0
        private void Visit(MethodDeclarationBase model)
        {
            if (this.ORMModelTree.RootNode != null)
            {
                throw new ArgumentException("There can only be one MethodDeclaration in an ORMModelTree.");
            }
            var rootNode = new ORMModelNode(model);

            this.ORMModelTree = new ORMModelTree(rootNode);

            SetLastVisitedNode(rootNode);
        }
        public ORMModelTree Extract(MethodDeclarationSyntax methodDeclarationSyntaxNode)
        {
            var methodDeclaration = new MethodDeclaration(methodDeclarationSyntaxNode.Identifier.Text, methodDeclarationSyntaxNode.GetCompilationInfo());

            this._ORMModelTree = new ORMModelTree(new ORMModelNode(methodDeclaration));

            var extractor = new LINQToSQLDatabaseAccessingMethodCallExtractor(null, null, _databaseQueries.ToList(), null, null, null);

            extractor.Visit(methodDeclarationSyntaxNode);

            foreach (var dbAccessingMethodCall in extractor.DatabaseAccessingMethodCalls)
            {
                var ORMModelNode = new ORMModelNode(dbAccessingMethodCall);
                _ORMModelTree.RootNode.ChildNodes.Add(ORMModelNode);
            }

            return(_ORMModelTree);
        }
        private async Task GenerateORMModelTreeForEachDatabaseAccessingMethodAsync(Solution solution)
        {
            await Task.Run(() =>
            {
                foreach (var databaseAccessingMethodCallSyntaxNode in DatabaseAccessingMethodCalls.Values)
                {
                    SyntaxNode parentMethodDeclaration = databaseAccessingMethodCallSyntaxNode.Parent;
                    while (!(parentMethodDeclaration is MethodDeclarationSyntax))
                    {
                        parentMethodDeclaration = parentMethodDeclaration.Parent;
                    }

                    var modelTreeExtractor = new RoslynORMModelTreeExtractor(this.DatabaseQueries);
                    ORMModelTree tree      = modelTreeExtractor.Extract((MethodDeclarationSyntax)parentMethodDeclaration);
                    ORMModelTrees.Add(tree);
                }
            }
                           );
        }
示例#6
0
 public ExecutionCodePathGenerator()
 {
     ORMModelTree = new ORMModelTree();
 }