private async Task UpdateRelationshipsFromSourceAsync(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

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

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

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

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

                progress?.Report(1);
            }
        }
Пример #2
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);
            }
        }
        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 roslynTypeNode in CurrentRoslynModel.RoslynNodes)
            {
                cancellationToken.ThrowIfCancellationRequested();

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

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

                progress?.Report(1);
            }
        }
Пример #4
0
        private IRoslynBasedModelEntity GetOrAddEntity(INamedTypeSymbol namedTypeSymbol, IIncrementalProgress progress = null)
        {
            var modelEntity = _model.GetOrAddEntity(i => i.SymbolEquals(namedTypeSymbol), () => CreateModelEntity(namedTypeSymbol));

            progress?.Report(1);
            return(modelEntity);
        }
Пример #5
0
        private void UpdateEntitiesFromSource(CancellationToken cancellationToken, IIncrementalProgress progress)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var workspace    = _roslynModelProvider.GetWorkspace();
            var compilations = workspace.CurrentSolution.Projects.Select(i => i.GetCompilationAsync(cancellationToken))
                               .Select(i => i.Result).ToArray();

            foreach (var roslynBasedModelEntity in _model.Entities.OfType <RoslynBasedModelEntity>().ToArray())
            {
                cancellationToken.ThrowIfCancellationRequested();

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

                if (newVersionOfSymbol == null)
                {
                    _model.RemoveEntity(roslynBasedModelEntity);
                }
                else
                {
                    _model.UpdateEntity(roslynBasedModelEntity, newVersionOfSymbol);
                }

                progress?.Report(1);
            }
        }
Пример #6
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);
            }
        }
Пример #7
0
 public void UpdateFromSource(CancellationToken cancellationToken, IIncrementalProgress progress)
 {
     foreach (var diagramNode in Nodes)
     {
         _modelServices.ExtendModelWithRelatedEntities(diagramNode.ModelEntity, cancellationToken: cancellationToken);
         progress?.Report(1);
     }
 }
Пример #8
0
        public void AddConnectors(
            IEnumerable <ModelRelationshipId> modelRelationshipIds,
            CancellationToken cancellationToken = default,
            IIncrementalProgress progress       = null)
        {
            foreach (var modelRelationshipId in modelRelationshipIds)
            {
                cancellationToken.ThrowIfCancellationRequested();

                AddConnector(modelRelationshipId);

                progress?.Report(1);
            }
        }
Пример #9
0
        public void AddNodes(
            IEnumerable <ModelNodeId> modelNodeIds,
            CancellationToken cancellationToken = default,
            IIncrementalProgress progress       = null)
        {
            foreach (var modelNodeId in modelNodeIds)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var parentNodeId = GetParentDiagramNodeId(modelNodeId);
                AddNode(modelNodeId, parentNodeId);

                progress?.Report(1);
            }
        }
Пример #10
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);
            }
        }
Пример #11
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);
            }
        }
        private IRoslynModelNode GetOrAddNode(ISymbol symbol, IIncrementalProgress progress = null)
        {
            progress?.Report(1);

            var node = CurrentRoslynModel.GetNodeBySymbol(symbol);

            if (node != null)
            {
                return(node);
            }

            var newNode = RoslynModelItemFactory.CreateModelNode(symbol);

            AddNode(newNode);
            return(newNode);
        }
Пример #13
0
        private async Task ExtendModelWithRelatedNodesRecursiveAsync(
            [NotNull] IModelNode node,
            DirectedModelRelationshipType?directedModelRelationshipType,
            CancellationToken cancellationToken,
            IIncrementalProgress progress,
            bool recursive,
            [NotNull] ISet <ModelNodeId> alreadyDiscoveredNodes)
        {
            var relatedSymbolPairs = await _relatedSymbolProvider.GetRelatedSymbolsAsync((ISymbol)node.Payload, directedModelRelationshipType);

            var presentableRelatedSymbolPairs = relatedSymbolPairs
                                                .Select(GetOriginalDefinition)
                                                .Where(i => CanAddSymbol(i.RelatedSymbol))
                                                .ToList();

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

                var relatedSymbol = relatedSymbolPair.RelatedSymbol;
                var relatedNode   = GetOrAddNode(relatedSymbol);
                GetOrAddRelationship(relatedSymbolPair);

                progress?.Report(1);

                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);

                await ExtendModelWithRelatedNodesRecursiveAsync(
                    relatedNode,
                    directedModelRelationshipType,
                    cancellationToken,
                    progress,
                    recursive : true,
                    alreadyDiscoveredNodes);
            }
        }
Пример #14
0
        private static void DrawContentTiles(Visual visual, Rect bounds, DrawingContext drawingContext, int tileWidth, int tileHeight,
                                             CancellationToken cancellationToken, IIncrementalProgress progress, IProgress <int> maxProgress)
        {
            var contentWidth  = bounds.Width;
            var contentHeight = bounds.Height;

            var horizontalTileCount = (int)Math.Ceiling(contentWidth / tileWidth);
            var verticalTileCount   = (int)Math.Ceiling(contentHeight / tileHeight);

            maxProgress?.Report(horizontalTileCount * verticalTileCount);

            for (var i = 0; i < verticalTileCount; i++)
            {
                for (var j = 0; j < horizontalTileCount; j++)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    var targetX = j * tileWidth;
                    var targetY = i * tileHeight;
                    var sourceX = bounds.Left + targetX;
                    var sourceY = bounds.Top + targetY;

                    var width = (j + 1) * tileWidth > contentWidth
                        ? contentWidth - j * tileWidth
                        : tileWidth;
                    var height = (i + 1) * tileHeight > contentHeight
                        ? contentHeight - i * tileHeight
                        : tileHeight;

                    var contentBrush = new VisualBrush(visual)
                    {
                        Stretch       = Stretch.None,
                        AlignmentX    = AlignmentX.Left,
                        AlignmentY    = AlignmentY.Top,
                        Viewbox       = new Rect(sourceX, sourceY, width, height),
                        ViewboxUnits  = BrushMappingMode.Absolute,
                        Viewport      = new Rect(targetX, targetY, width, height),
                        ViewportUnits = BrushMappingMode.Absolute
                    };
                    drawingContext.DrawRectangle(contentBrush, null, new Rect(targetX, targetY, width, height));

                    progress?.Report(1);
                }
            }
        }
Пример #15
0
        public virtual void HideModelItems(IEnumerable <IModelItem> modelItems,
                                           CancellationToken cancellationToken = default(CancellationToken),
                                           IIncrementalProgress progress       = null)
        {
            foreach (var modelItem in modelItems)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (modelItem is IModelEntity)
                {
                    RemoveDiagramNode((IModelEntity)modelItem);
                }

                if (modelItem is IModelRelationship)
                {
                    RemoveDiagramConnector((IModelRelationship)modelItem);
                }

                progress?.Report(1);
            }
        }
Пример #16
0
        public virtual IReadOnlyList <IDiagramShape> ShowModelItems(IEnumerable <IModelItem> modelItems,
                                                                    CancellationToken cancellationToken = default(CancellationToken),
                                                                    IIncrementalProgress progress       = null)
        {
            var diagramShapes = new List <IDiagramShape>();

            foreach (var modelItem in modelItems)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }

                if (modelItem is IModelEntity)
                {
                    var diagramNode = GetOrAddDiagramNode((IModelEntity)modelItem);
                    if (diagramNode != null)
                    {
                        diagramShapes.Add(diagramNode);
                    }
                }

                if (modelItem is IModelRelationship)
                {
                    var diagramConnector = GetOrAddDiagramConnector((IModelRelationship)modelItem);
                    if (diagramConnector != null)
                    {
                        diagramShapes.Add(diagramConnector);
                    }
                }

                progress?.Report(1);
            }

            return(diagramShapes);
        }