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); } }
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); } }
private IRoslynBasedModelEntity GetOrAddEntity(INamedTypeSymbol namedTypeSymbol, IIncrementalProgress progress = null) { var modelEntity = _model.GetOrAddEntity(i => i.SymbolEquals(namedTypeSymbol), () => CreateModelEntity(namedTypeSymbol)); progress?.Report(1); return(modelEntity); }
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); } }
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); } }
public void UpdateFromSource(CancellationToken cancellationToken, IIncrementalProgress progress) { foreach (var diagramNode in Nodes) { _modelServices.ExtendModelWithRelatedEntities(diagramNode.ModelEntity, cancellationToken: cancellationToken); progress?.Report(1); } }
public void AddConnectors( IEnumerable <ModelRelationshipId> modelRelationshipIds, CancellationToken cancellationToken = default, IIncrementalProgress progress = null) { foreach (var modelRelationshipId in modelRelationshipIds) { cancellationToken.ThrowIfCancellationRequested(); AddConnector(modelRelationshipId); progress?.Report(1); } }
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); } }
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); } }
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); }
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); } }
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); } } }
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); } }
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); }