示例#1
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));
        }
        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);
            }
        }
示例#4
0
 public IModelRelationship GetRelationship(IRoslynModelNode sourceNode, IRoslynModelNode targetNode, ModelRelationshipStereotype stereotype)
 => Relationships.FirstOrDefault(i => i.Source == sourceNode && i.Target == targetNode && i.Stereotype == stereotype);
示例#5
0
 public bool RelationshipExists(IRoslynModelNode sourceNode, IRoslynModelNode targetNode, ModelRelationshipStereotype stereotype)
 => GetRelationship(sourceNode, targetNode, stereotype) != null;
示例#6
0
        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);
示例#10
0
 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);
 }