Example #1
0
        private async Task <GraphNode> AddLinkedNodeForTypeAsync(
            Project project, INamedTypeSymbol namedType, GraphBuilder graphBuilder,
            IEnumerable <SyntaxTree> syntaxTrees, CancellationToken cancellationToken)
        {
            // If this named type is contained in a parent type, then just link farther up
            if (namedType.ContainingType != null)
            {
                var parentTypeNode = await AddLinkedNodeForTypeAsync(
                    project, namedType.ContainingType, graphBuilder, syntaxTrees, cancellationToken).ConfigureAwait(false);

                var typeNode = await graphBuilder.AddNodeAsync(namedType, relatedNode : parentTypeNode, cancellationToken).ConfigureAwait(false);

                graphBuilder.AddLink(parentTypeNode, GraphCommonSchema.Contains, typeNode, cancellationToken);

                return(typeNode);
            }
            else
            {
                // From here, we can link back up to the containing project item
                var typeNode = await graphBuilder.AddNodeAsync(
                    namedType, contextProject : project, contextDocument : null, cancellationToken).ConfigureAwait(false);

                foreach (var tree in syntaxTrees)
                {
                    var document = project.Solution.GetDocument(tree);
                    Contract.ThrowIfNull(document);

                    var documentNode = graphBuilder.AddNodeForDocument(document, cancellationToken);
                    graphBuilder.AddLink(documentNode, GraphCommonSchema.Contains, typeNode, cancellationToken);
                }

                return(typeNode);
            }
        }
Example #2
0
        private static async Task AddImplementedSymbolsAsync(
            GraphBuilder graphBuilder, GraphNode node,
            ImmutableArray <ISymbol> implementedSymbols)
        {
            foreach (var interfaceType in implementedSymbols)
            {
                var interfaceTypeNode = await graphBuilder.AddNodeAsync(interfaceType, relatedNode : node).ConfigureAwait(false);

                graphBuilder.AddLink(node, CodeLinkCategories.Implements, interfaceTypeNode);
            }
        }
Example #3
0
        private async Task <GraphNode> AddLinkedNodeForMemberAsync(
            Project project, ISymbol symbol, GraphBuilder graphBuilder, CancellationToken cancellationToken)
        {
            var member = symbol;

            Contract.ThrowIfNull(member.ContainingType);

            var trees = member.DeclaringSyntaxReferences.Select(d => d.SyntaxTree);

            var parentTypeNode = await AddLinkedNodeForTypeAsync(
                project, member.ContainingType, graphBuilder, trees, cancellationToken).ConfigureAwait(false);

            var memberNode = await graphBuilder.AddNodeAsync(
                symbol, relatedNode : parentTypeNode, cancellationToken).ConfigureAwait(false);

            graphBuilder.AddLink(parentTypeNode, GraphCommonSchema.Contains, memberNode, cancellationToken);

            return(memberNode);
        }