Esempio n. 1
0
        public override async Task <TextChange?> GetTextChangeAsync(Document document, CompletionItem selectedItem, char?ch, CancellationToken cancellationToken)
        {
            string insertionText;

            if (ch == null)
            {
                insertionText = SymbolCompletionItem.GetInsertionText(selectedItem);
            }
            else
            {
                var position = SymbolCompletionItem.GetContextPosition(selectedItem);
                var context  = await this.CreateContext(document, position, cancellationToken).ConfigureAwait(false);

                var symbols = await SymbolCompletionItem.GetSymbolsAsync(selectedItem, document, cancellationToken).ConfigureAwait(false);

                if (symbols.Length > 0)
                {
                    insertionText = GetInsertionText(symbols[0], context, ch.Value);
                }
                else
                {
                    insertionText = selectedItem.DisplayText;
                }
            }

            return(new TextChange(selectedItem.Span, insertionText));
        }
        private async Task <Document> GenerateMemberAndUsingsAsync(
            Document document,
            CompletionItem completionItem,
            TextLine line,
            CancellationToken cancellationToken)
        {
            var codeGenService = document.GetLanguageService <ICodeGenerationService>();

            // Resolve member and type in our new, forked, solution
            var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            var containingType = semanticModel.GetEnclosingSymbol <INamedTypeSymbol>(line.Start, cancellationToken);
            var symbols        = await SymbolCompletionItem.GetSymbolsAsync(completionItem, document, cancellationToken).ConfigureAwait(false);

            var overriddenMember = symbols.FirstOrDefault();

            if (overriddenMember == null)
            {
                // Unfortunately, SymbolKey resolution failed. Bail.
                return(null);
            }

            // CodeGenerationOptions containing before and after
            var options = new CodeGenerationOptions(
                contextLocation: semanticModel.SyntaxTree.GetLocation(TextSpan.FromBounds(line.Start, line.Start)),
                options: await document.GetOptionsAsync(cancellationToken).ConfigureAwait(false));

            var generatedMember = await GenerateMemberAsync(overriddenMember, containingType, document, completionItem, cancellationToken).ConfigureAwait(false);

            generatedMember = _annotation.AddAnnotationToSymbol(generatedMember);

            Document memberContainingDocument = null;

            if (generatedMember.Kind == SymbolKind.Method)
            {
                memberContainingDocument = await codeGenService.AddMethodAsync(document.Project.Solution, containingType, (IMethodSymbol)generatedMember, options, cancellationToken).ConfigureAwait(false);
            }
            else if (generatedMember.Kind == SymbolKind.Property)
            {
                memberContainingDocument = await codeGenService.AddPropertyAsync(document.Project.Solution, containingType, (IPropertySymbol)generatedMember, options, cancellationToken).ConfigureAwait(false);
            }
            else if (generatedMember.Kind == SymbolKind.Event)
            {
                memberContainingDocument = await codeGenService.AddEventAsync(document.Project.Solution, containingType, (IEventSymbol)generatedMember, options, cancellationToken).ConfigureAwait(false);
            }

            return(memberContainingDocument);
        }
Esempio n. 3
0
 public static Task <ImmutableArray <ISymbol> > GetSymbolsAsync(CompletionItem item, Document document, CancellationToken cancellationToken)
 {
     return(SymbolCompletionItem.GetSymbolsAsync(item, document, cancellationToken));
 }