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("}"); }
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()); }
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); }