Esempio n. 1
0
        public AnalysisResult <List <CSharpControllerModel> > Analyze(string path)
        {
            var models = new List <CSharpControllerModel>();

            _context.Init(path);

            var isDotNetCore = ProjectHelper.IsDotNetCoreProject(_context.Compilation);

            var documents = _context.Project.Documents
                            .Where(d => d.Name.Contains("Controller"))
                            .ToList();

            var syntaxTrees = documents
                              .Select(d => d.GetSyntaxTreeAsync().Result)
                              .ToList();

            foreach (var syntaxTree in syntaxTrees)
            {
                var root          = syntaxTree.GetRoot();
                var semanticModel = _context.Compilation.GetSemanticModel(syntaxTree);

                var classNodes = root.DescendantNodes().OfType <ClassDeclarationSyntax>().ToList();

                foreach (var classNode in classNodes)
                {
                    var classSymbol = semanticModel.GetDeclaredSymbol(classNode) as INamedTypeSymbol;

                    models.Add(AnalyzeController(classSymbol, isDotNetCore));
                }
            }

            return(new AnalysisResult <List <CSharpControllerModel> >()
            {
                Value = models,
                Success = true
            });
        }
Esempio n. 2
0
        public AnalysisResult <CSharpDataModels> Analyze(string path)
        {
            var models = new CSharpDataModels();

            _context.Init(path);

            var graph = BuildTypeDependencyGraph();

            var readable = graph.ToReadable();

            var types = graph.Vertices;

            foreach (var type in types)
            {
                if (type.IsExternal)
                {
                    continue;
                }

                var dependencies = graph.OutgoingEdges(type)
                                   .Select(e => e.Destination)
                                   .Where(d => d.TypeKind == TypeKind.Class || d.TypeKind == TypeKind.Enum)
                                   .ToList();

                var semanticModel = type.SemanticModel;

                if (semanticModel == null)
                {
                    if (type.NamedTypeSymbol != null)
                    {
                        if (type.TypeKind == TypeKind.Enum)
                        {
                            models.Enums.Add(AnalyzeEnumSymbol(type.NamedTypeSymbol));
                        }
                    }
                }
                else
                {
                    var syntaxTree = semanticModel.SyntaxTree;

                    if (type.TypeKind == TypeKind.Class)
                    {
                        //var classModel = new CSharpClassModel() { Name = type.Name };

                        //HandleInheritance(classModel, type.NamedTypeSymbol);

                        //HandleGenerics(classModel, type.NamedTypeSymbol);

                        //var internalDependencies = dependencies
                        //    .Where(d => !d.IsExternal)
                        //    .Select(d => d.NamedTypeSymbol)
                        //    .ToList();

                        //HandleDependencies(classModel, internalDependencies);

                        //var propertyNodes = syntaxTree.GetRoot().DescendantNodes().OfType<PropertyDeclarationSyntax>().ToList();

                        //foreach (var propertyNode in propertyNodes)
                        //{
                        //    var propertySymbol = semanticModel.GetDeclaredSymbol(propertyNode) as IPropertySymbol;

                        //    var property = new CSharpPropertyModel();

                        //    property.Name = propertySymbol.Name;
                        //    property.Type = _typeAnalyzer.AnalyzePropertyType(propertySymbol.Type);

                        //    classModel.Properties.Add(property);
                        //}

                        // models.Classes.Add(classModel);

                        models.Classes.Add(AnalyzeClassSymbol(type.NamedTypeSymbol));
                    }
                    else if (type.TypeKind == TypeKind.Enum)
                    {
                        models.Enums.Add(AnalyzeEnumSymbol(type.NamedTypeSymbol));
                    }
                }
            }

            return(new AnalysisResult <CSharpDataModels>()
            {
                Value = models,
                Success = true
            });
        }