Example #1
0
        public static async Task <Document> RefactorAsync(
            Document document,
            ExpressionSyntax expression,
            IMethodSymbol methodSymbol,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);

            InvocationExpressionSyntax invocation = SimpleMemberInvocationExpression(expression.WithoutTrailingTrivia(), IdentifierName(methodSymbol.Name))
                                                    .WithTrailingTrivia(expression.GetTrailingTrivia());

            SyntaxNode newRoot = root.ReplaceNode(expression, invocation);

            SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            if (methodSymbol.IsExtensionMethod)
            {
                INamespaceSymbol namespaceSymbol = methodSymbol.ContainingNamespace;

                if (namespaceSymbol != null &&
                    !CSharpAnalysis.IsNamespaceInScope(expression, namespaceSymbol, semanticModel, cancellationToken) &&
                    newRoot.IsKind(SyntaxKind.CompilationUnit))
                {
                    newRoot = ((CompilationUnitSyntax)newRoot)
                              .AddUsings(UsingDirective(ParseName(namespaceSymbol.ToString())));
                }
            }

            return(document.WithSyntaxRoot(newRoot));
        }
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, IdentifierNameSyntax identifierName)
        {
            SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

            INamespaceSymbol namespaceSymbol = null;

            SyntaxNode node     = identifierName;
            SyntaxNode prevNode = null;

            while (node?.Parent?.IsKind(SyntaxKind.QualifiedName, SyntaxKind.AliasQualifiedName, SyntaxKind.SimpleMemberAccessExpression) == true)
            {
                ISymbol symbol = semanticModel.GetSymbol(node, context.CancellationToken);

                if (symbol?.IsNamespace() == true)
                {
                    namespaceSymbol = (INamespaceSymbol)symbol;
                    prevNode        = node;
                    node            = node.Parent;
                }
                else
                {
                    break;
                }
            }

            node = prevNode;

            if (node?.IsParentKind(SyntaxKind.QualifiedName, SyntaxKind.AliasQualifiedName, SyntaxKind.SimpleMemberAccessExpression) == true &&
                !node.IsDescendantOf(SyntaxKind.UsingDirective) &&
                !CSharpAnalysis.IsNamespaceInScope(node, namespaceSymbol, semanticModel, context.CancellationToken))
            {
                context.RegisterRefactoring(
                    $"using {namespaceSymbol};",
                    cancellationToken => RefactorAsync(context.Document, node, namespaceSymbol, cancellationToken));
            }
        }