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); }
public static Task <ImmutableArray <ISymbol> > GetSymbolsAsync(CompletionItem item, Document document, CancellationToken cancellationToken) { return(SymbolCompletionItem.GetSymbolsAsync(item, document, cancellationToken)); }