private static IEnumerable<SymbolSpan> GetSymbolSpans(SemanticModel semanticModel, SyntaxNode node) { switch (node.Kind) { case SyntaxKind.VariableDeclarator: { var expression = (VariableDeclaratorSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Identifier.SourceRange, expression.Identifier.Span); break; } case SyntaxKind.ClassType: { var expression = (ClassTypeSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.StructType: { var expression = (StructTypeSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null && expression.Name != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.InterfaceType: { var expression = (InterfaceTypeSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.IdentifierName: { var expression = (IdentifierNameSyntax) node; var symbol = semanticModel.GetSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateReference(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.IdentifierDeclarationName: { var expression = (IdentifierDeclarationNameSyntax) node; var symbol = semanticModel.GetSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.FieldAccessExpression: { var expression = (FieldAccessExpressionSyntax) node; var symbol = semanticModel.GetSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateReference(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.MethodInvocationExpression: { var expression = (MethodInvocationExpressionSyntax) node; var symbol = semanticModel.GetSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateReference(symbol, expression.Name.SourceRange, expression.Name.Span); break; } case SyntaxKind.FunctionInvocationExpression: { var expression = (FunctionInvocationExpressionSyntax) node; var symbol = semanticModel.GetSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateReference(symbol, expression.Name.GetUnqualifiedName().Name.SourceRange, expression.Name.GetUnqualifiedName().Name.Span); break; } case SyntaxKind.FunctionDefinition: { var expression = (FunctionDefinitionSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.GetUnqualifiedName().Name.SourceRange, expression.Name.GetUnqualifiedName().Name.Span); break; } case SyntaxKind.FunctionDeclaration: { var expression = (FunctionDeclarationSyntax) node; var symbol = semanticModel.GetDeclaredSymbol(expression); if (symbol != null) yield return SymbolSpan.CreateDefinition(symbol, expression.Name.GetUnqualifiedName().Name.SourceRange, expression.Name.GetUnqualifiedName().Name.Span); break; } } }