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