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)); }
public static ModelRelationship CreateRoslynRelationship(IRoslynModelNode sourceNode, IRoslynModelNode targetNode, ModelRelationshipStereotype stereotype) { var id = ModelRelationshipId.Create(); if (stereotype == ModelRelationshipStereotypes.Inheritance) { return(new InheritanceRelationship(id, sourceNode, targetNode)); } if (stereotype == ModelRelationshipStereotypes.Implementation) { return(new ImplementationRelationship(id, sourceNode, targetNode)); } throw new InvalidOperationException($"Unexpected relationship type {stereotype.Name}"); }
private async Task ExtendModelWithRelatedNodesRecursiveAsync( IRoslynModelNode roslynModelNode, DirectedModelRelationshipType?directedModelRelationshipType, CancellationToken cancellationToken, IIncrementalProgress progress, bool recursive, HashSet <ModelNodeId> alreadyDiscoveredNodes) { var relatedSymbolPairs = await roslynModelNode.FindRelatedSymbolsAsync(_roslynModelProvider, directedModelRelationshipType); var presentableRelatedSymbolPairs = relatedSymbolPairs .Select(GetOriginalDefinition) .Where(i => !IsHidden(i.RelatedSymbol)) .ToList(); foreach (var relatedSymbolPair in presentableRelatedSymbolPairs) { 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); await ExtendModelWithRelatedNodesRecursiveAsync( relatedNode, directedModelRelationshipType, cancellationToken, progress, true, alreadyDiscoveredNodes); } }
public IModelRelationship GetRelationship(IRoslynModelNode sourceNode, IRoslynModelNode targetNode, ModelRelationshipStereotype stereotype) => Relationships.FirstOrDefault(i => i.Source == sourceNode && i.Target == targetNode && i.Stereotype == stereotype);
public bool RelationshipExists(IRoslynModelNode sourceNode, IRoslynModelNode targetNode, ModelRelationshipStereotype stereotype) => GetRelationship(sourceNode, targetNode, stereotype) != null;
private async Task <IReadOnlyList <IDiagramNode> > ExtendModelAndDiagramAsync(IRoslynModelNode modelNode) { IReadOnlyList <IDiagramNode> diagramNodes = null; using (var progressDialog = await UiService.CreateProgressDialogAsync("Extending model with entities:")) { await progressDialog.ShowWithDelayAsync(); try { await ExtendModelWithRelatedEntitiesAsync(modelNode, progressDialog.CancellationToken, progressDialog.Progress); progressDialog.Reset("Adding diagram nodes:"); diagramNodes = await ExtendDiagramAsync(modelNode, progressDialog.CancellationToken, progressDialog.Progress); } catch (OperationCanceledException) { } } return(diagramNodes); }
public Task ShowSourceAsync(IRoslynModelNode modelNode) => _roslynModelProvider.ShowSourceAsync(modelNode.RoslynSymbol);
public Task <bool> HasSourceAsync(IRoslynModelNode modelNode) => _roslynModelProvider.HasSourceAsync(modelNode.RoslynSymbol);
public void ShowSource(IRoslynModelNode modelNode) => _roslynModelProvider.ShowSource(modelNode.RoslynSymbol);
public bool HasSource(IRoslynModelNode modelNode) => _roslynModelProvider.HasSource(modelNode.RoslynSymbol);
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); }
private async Task ExtendModelWithRelatedEntitiesAsync(IRoslynModelNode modelEntity, CancellationToken cancellationToken, IIncrementalProgress progress) { await Task.Run(() => ExtendModelWithRelatedEntities(modelEntity, cancellationToken, progress), cancellationToken); }