Esempio n. 1
0
        private static async Task DoWithOptions(
            string contextcenter,
            IEnumerable <string> inputFolders,
            IEnumerable <RelationType> relationTypes)
        {
            IEnumerable <string> files = inputFolders.SelectMany(folder
                                                                 => Directory.EnumerateFiles(folder, "*.cs", SearchOption.AllDirectories));

            StringBuilder builder = new StringBuilder();

            foreach (string filename in files)
            {
                builder.Append(File.ReadAllText(filename));
            }
            string sourceCode = builder.ToString();


            SyntaxTree tree     = SyntaxFactory.ParseSyntaxTree(sourceCode);
            var        registry = new DeclarationRegistry(tree);

            var relationRegistry = new RelationRegistry(registry);

            List <Relation> overnextNeighbors =
                (await GetOvernextNeighbors(relationRegistry, relationTypes.ToList(), contextcenter)).
                Distinct().
                ToList();

            IEnumerable <Node> nodes = overnextNeighbors
                                       .SelectMany(relation => new Node[] {
                new Node {
                    Name = relation.From.Name, Kind = MapKind(relation.From)
                },
                new Node {
                    Name = relation.To.Name, Kind = MapKind(relation.To)
                }
            }).Distinct();

            Console.WriteLine("digraph d {");

            List <string> dotLines = nodes.Select(NodeToDotLine).ToList();

            dotLines.AddRange(
                overnextNeighbors.
                Select(RelationToDotLine).
                Distinct());

            foreach (string line in dotLines)
            {
                Console.WriteLine(line);
            }

            Console.WriteLine("}");
        }
Esempio n. 2
0
        private static async Task <List <Relation> > GetOvernextNeighbors(
            RelationRegistry relationRegistry,
            List <RelationType> relationTypes,
            string typeName)
        {
            List <Relation> nextNeighbors = GetNextNeighbors(relationRegistry, relationTypes, typeName);

            var tasks = new List <Task <List <Relation> > >();

            foreach (Relation neighbor in nextNeighbors)
            {
                tasks.Add(Task.Run(() => GetNextNeighbors(relationRegistry, relationTypes, neighbor.From.Name)));
                tasks.Add(Task.Run(() => GetNextNeighbors(relationRegistry, relationTypes, neighbor.To.Name)));
            }
            return((await Task.WhenAll(tasks)).SelectMany(t => t).Distinct().ToList());
        }
Esempio n. 3
0
        private static List <Relation> GetNextNeighbors(
            RelationRegistry registry,
            List <RelationType> relationTypes,
            string typeName)
        {
            List <Relation> context = new List <Relation>();

            foreach (var relationType in Enum.GetValues(typeof(RelationType)))
            {
                var rt = (RelationType)relationType;
                if (relationTypes.Contains(rt))
                {
                    context.AddRange(registry.GetRelations(typeName, rt).ToList());
                }
            }
            return(context);
        }