Esempio n. 1
0
        private async Task UpdateEntitiesFromSourceAsync(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var workspace = await _roslynModelProvider.GetWorkspaceAsync();

            var projects     = workspace.CurrentSolution.Projects;
            var compilations = (await projects.SelectAsync(async i => await i.GetCompilationAsync(cancellationToken))).ToArray();

            foreach (var roslynModelNode in Model.GetRoslynNodes())
            {
                cancellationToken.ThrowIfCancellationRequested();

                var namedTypeSymbol    = roslynModelNode.RoslynSymbol;
                var newVersionOfSymbol = FindSymbolInCompilations(namedTypeSymbol, compilations, cancellationToken);

                if (newVersionOfSymbol == null)
                {
                    RemoveNode(roslynModelNode.Id);
                }
                else
                {
                    var updatedNode = roslynModelNode.UpdateRoslynSymbol(newVersionOfSymbol);
                    UpdateNode(updatedNode);
                }

                progress?.Report(1);
            }
        }
Esempio n. 2
0
 private async Task <IReadOnlyList <IDiagramNode> > ShowEntitiesAsync(IReadOnlyList <IRoslynModelNode> modelEntities,
                                                                      CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     return(await Task.Run(
                () => DiagramServices.ShowModelNodes(modelEntities, cancellationToken, progress).ToArray(),
                cancellationToken));
 }
Esempio n. 3
0
        public void ExtendModelWithRelatedEntities(IModelEntity modelEntity, EntityRelationType?entityRelationType = null,
                                                   CancellationToken cancellationToken = default(CancellationToken), IIncrementalProgress progress = null, bool recursive = false)
        {
            var roslynBasedModelEntity = modelEntity as RoslynBasedModelEntity;

            if (roslynBasedModelEntity == null)
            {
                return;
            }

            var symbolRelations = roslynBasedModelEntity
                                  .FindRelatedSymbols(_roslynModelProvider, entityRelationType)
                                  .Select(GetOriginalDefinition)
                                  .Where(i => !IsHidden(i.RelatedSymbol)).ToList();

            foreach (var symbolRelation in symbolRelations)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var relatedEntity = GetOrAddEntity(symbolRelation.RelatedSymbol, progress);
                AddRelationshipIfNotExists(symbolRelation);

                // TODO: loop detection?
                if (recursive)
                {
                    ExtendModelWithRelatedEntities(relatedEntity, entityRelationType, cancellationToken, progress, recursive: true);
                }
            }
        }
Esempio n. 4
0
        private async Task UpdateRelationshipsFromSourceAsync(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var allSymbolRelations = await Model.GetRoslynNodes().SelectManyAsync(
                async i =>
            {
                var relatedSymbolPairs = await i.FindRelatedSymbolsAsync(_roslynModelProvider);
                progress?.Report(1);
                return(relatedSymbolPairs);
            });

            var distinctSymbolRelations = allSymbolRelations.Distinct().ToArray();

            foreach (var relationship in Model.Relationships)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (distinctSymbolRelations.All(i => !i.Matches(relationship)))
                {
                    RemoveRelationship(relationship.Id);
                }

                progress?.Report(1);
            }
        }
Esempio n. 5
0
        private void UpdateRelationshipsFromSource(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var allSymbolRelations = _model.Entities.OfType <RoslynBasedModelEntity>()
                                     .SelectMany(i =>
            {
                progress?.Report(1);
                return(i.FindRelatedSymbols(_roslynModelProvider));
            })
                                     .Distinct().ToArray();

            foreach (var relationship in _model.Relationships.OfType <ModelRelationship>().ToArray())
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (allSymbolRelations.All(i => !i.Matches(relationship)))
                {
                    _model.RemoveRelationship(relationship);
                }

                progress?.Report(1);
            }
        }
Esempio n. 6
0
        private IRoslynBasedModelEntity GetOrAddEntity(INamedTypeSymbol namedTypeSymbol, IIncrementalProgress progress = null)
        {
            var modelEntity = _model.GetOrAddEntity(i => i.SymbolEquals(namedTypeSymbol), () => CreateModelEntity(namedTypeSymbol));

            progress?.Report(1);
            return(modelEntity);
        }
 private async Task <IReadOnlyList <IDiagramNode> > ExtendDiagramAsync(IRoslynModelNode modelNode,
                                                                       CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     return(await Task.Run(
                () => DiagramServices.ShowModelNodeWithHierarchy(modelNode, cancellationToken, progress).ToArray(),
                cancellationToken));
 }
 private void ExtendModelWithRelatedEntities(IRoslynModelNode modelEntity, CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     ModelService.ExtendModelWithRelatedNodes(modelEntity, DirectedRelationshipTypes.BaseType, cancellationToken, progress, recursive: true);
     ModelService.ExtendModelWithRelatedNodes(modelEntity, DirectedRelationshipTypes.Subtype, cancellationToken, progress, recursive: true);
 }
Esempio n. 9
0
        public IEnumerable <IDiagramNode> ShowModelNodeWithHierarchy(IRoslynModelNode modelNode,
                                                                     CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            var model = ModelService.Model;

            var baseTypes = model.GetRelatedNodes(modelNode.Id, DirectedRelationshipTypes.BaseType, recursive: true);
            var subtypes = model.GetRelatedNodes(modelNode.Id, DirectedRelationshipTypes.Subtype, recursive: true);
            var modelNodes = new[] { modelNode }.Union(baseTypes).Union(subtypes);

            return(ShowModelNodes(modelNodes, cancellationToken, progress));
        }
 private async Task ExtendModelWithRelatedEntitiesAsync(IRoslynModelNode modelEntity,
                                                        CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     await Task.WhenAll(
         ModelService.ExtendModelWithRelatedNodesAsync(modelEntity, DirectedRelationshipTypes.BaseType, cancellationToken, progress, recursive: true),
         ModelService.ExtendModelWithRelatedNodesAsync(modelEntity, DirectedRelationshipTypes.Subtype, cancellationToken, progress, recursive: true)
         );
 }
Esempio n. 11
0
        private async Task UpdateRelationshipsFromSourceAsync(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var allSymbolRelations = await LatestModel.Nodes.SelectManyAsync(
                async i =>
            {
                var relatedSymbolPairs = await _relatedSymbolProvider.GetRelatedSymbolsAsync(GetSymbol(i));
                progress?.Report(1);
                return(relatedSymbolPairs);
            });

            var distinctSymbolRelations = allSymbolRelations.Distinct().ToArray();

            foreach (var relationship in LatestModel.Relationships)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (distinctSymbolRelations.All(i => !IsSymbolPairMatchingRelationship(i, relationship)))
                {
                    _modelService.RemoveRelationship(relationship.Id);
                }

                progress?.Report(1);
            }
        }
Esempio n. 12
0
        private async Task UpdateEntitiesFromSourceAsync(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var workspace = await _roslynWorkspaceProvider.GetWorkspaceAsync();

            var projects     = workspace.CurrentSolution.Projects;
            var compilations = (await projects.SelectAsync(async i => await i.GetCompilationAsync(cancellationToken))).ToArray();

            foreach (var modelNode in LatestModel.Nodes)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var symbol             = GetSymbol(modelNode);
                var newVersionOfSymbol = FindSymbolInCompilations(symbol, compilations, cancellationToken);

                if (newVersionOfSymbol == null)
                {
                    _modelService.RemoveNode(modelNode.Id);
                }
                else
                {
                    if (!ReferenceEquals(symbol, newVersionOfSymbol))
                    {
                        var updatedNode = modelNode.WithPayload(newVersionOfSymbol);
                        _modelService.UpdateNode(updatedNode);
                    }
                }

                progress?.Report(1);
            }
        }
Esempio n. 13
0
        public async Task UpdateFromSourceAsync(IEnumerable <ModelNodeId> visibleModelNodeIds,
                                                CancellationToken cancellationToken = default(CancellationToken), IIncrementalProgress progress = null)
        {
            await UpdateEntitiesFromSourceAsync(cancellationToken, progress);
            await UpdateRelationshipsFromSourceAsync(cancellationToken, progress);

            foreach (var modelNodeId in visibleModelNodeIds)
            {
                if (Model.TryGetNode(modelNodeId, out var modelNode))
                {
                    await ExtendModelWithRelatedNodesAsync(modelNode, null, cancellationToken, progress, recursive : false);
                }
            }
        }
Esempio n. 14
0
        private void UpdateRelationshipsFromSource(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var allSymbolRelations = CurrentRoslynModel.RoslynNodes
                                     .SelectMany(i =>
            {
                progress?.Report(1);
                return(i.FindRelatedSymbols(_roslynModelProvider));
            })
                                     .Distinct().ToArray();

            foreach (var relationship in CurrentRoslynModel.Relationships)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (allSymbolRelations.All(i => !i.Matches(relationship)))
                {
                    RemoveRelationship(relationship.Id);
                }

                progress?.Report(1);
            }
        }
Esempio n. 15
0
 public void UpdateFromSource(CancellationToken cancellationToken = default(CancellationToken), IIncrementalProgress progress = null)
 {
     UpdateEntitiesFromSource(cancellationToken, progress);
     UpdateRelationshipsFromSource(cancellationToken, progress);
 }
Esempio n. 16
0
        private void ExtendModelWithRelatedNodesRecursive(IRoslynModelNode roslynModelNode, DirectedModelRelationshipType?directedModelRelationshipType,
                                                          CancellationToken cancellationToken, IIncrementalProgress progress, bool recursive, HashSet <ModelNodeId> alreadyDiscoveredNodes)
        {
            var relatedSymbolPairs = roslynModelNode
                                     .FindRelatedSymbols(_roslynModelProvider, directedModelRelationshipType)
                                     .Select(GetOriginalDefinition)
                                     .Where(i => !IsHidden(i.RelatedSymbol)).ToList();

            foreach (var relatedSymbolPair in relatedSymbolPairs)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var relatedSymbol = relatedSymbolPair.RelatedSymbol;
                var relatedNode   = GetOrAddNode(relatedSymbol, progress);
                AddRelationshipIfNotExists(relatedSymbolPair);

                if (!recursive)
                {
                    continue;
                }

                // Avoid infinite loop by stopping recursion when a node is already added.
                if (alreadyDiscoveredNodes.Contains(relatedNode.Id))
                {
                    continue;
                }

                alreadyDiscoveredNodes.Add(relatedNode.Id);
                ExtendModelWithRelatedNodesRecursive(relatedNode, directedModelRelationshipType,
                                                     cancellationToken, progress, true, alreadyDiscoveredNodes);
            }
        }
 private async Task ExtendModelWithRelatedEntitiesAsync(IRoslynModelNode modelEntity,
                                                        CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     await Task.Run(() => ExtendModelWithRelatedEntities(modelEntity, cancellationToken, progress), cancellationToken);
 }