protected override Task <ISymbol> GenerateMemberAsync(ISymbol newOverriddenMember, INamedTypeSymbol newContainingType, Document newDocument, CompletionItem completionItem, CancellationToken cancellationToken) { // Figure out what to insert, and do it. Throw if we've somehow managed to get this far and can't. var syntaxFactory = newDocument.GetLanguageService <SyntaxGenerator>(); var itemModifiers = MemberInsertionCompletionItem.GetModifiers(completionItem); var modifiers = itemModifiers.WithIsUnsafe(itemModifiers.IsUnsafe | newOverriddenMember.IsUnsafe()); return(syntaxFactory.OverrideAsync( newOverriddenMember, newContainingType, newDocument, modifiers, cancellationToken)); }
protected override async Task <ISymbol> GenerateMemberAsync(ISymbol member, INamedTypeSymbol containingType, Document document, CompletionItem item, CancellationToken cancellationToken) { var syntaxFactory = document.GetLanguageService <SyntaxGenerator>(); var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); var method = (IMethodSymbol)member; return(CodeGenerationSymbolFactory.CreateMethodSymbol( attributes: ImmutableArray <AttributeData> .Empty, accessibility: Accessibility.NotApplicable, modifiers: MemberInsertionCompletionItem.GetModifiers(item), returnType: semanticModel.Compilation.GetSpecialType(SpecialType.System_Void), refKind: method.RefKind, explicitInterfaceImplementations: default,
private CompletionItem CreateItem( ISymbol symbol, ISymbolDisplayService symbolDisplayService, SemanticModel semanticModel, SyntaxToken startToken, DeclarationModifiers modifiers) { var position = startToken.SpanStart; var displayString = symbolDisplayService.ToMinimalDisplayString(semanticModel, position, symbol, _overrideNameFormat); return(MemberInsertionCompletionItem.Create( displayString, displayTextSuffix: "", modifiers, _startLineNumber, symbol, startToken, position, rules: _provider.GetRules())); }
private async Task <Document> DetermineNewDocumentAsync(Document document, CompletionItem completionItem, CancellationToken cancellationToken) { var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); // The span we're going to replace var line = text.Lines[MemberInsertionCompletionItem.GetLine(completionItem)]; // Annotate the line we care about so we can find it after adding usings var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var token = GetToken(completionItem, tree, cancellationToken); var annotatedRoot = tree.GetRoot(cancellationToken).ReplaceToken(token, token.WithAdditionalAnnotations(_otherAnnotation)); document = document.WithSyntaxRoot(annotatedRoot); var memberContainingDocument = await GenerateMemberAndUsingsAsync(document, completionItem, line, cancellationToken).ConfigureAwait(false); if (memberContainingDocument == null) { // Generating the new document failed because we somehow couldn't resolve // the underlying symbol's SymbolKey. At this point, we won't be able to // make any changes, so just return the document we started with. return(document); } var insertionRoot = await PrepareTreeForMemberInsertionAsync(memberContainingDocument, cancellationToken).ConfigureAwait(false); var insertionText = await GenerateInsertionTextAsync(memberContainingDocument, cancellationToken).ConfigureAwait(false); var destinationSpan = ComputeDestinationSpan(insertionRoot, insertionText); var finalText = insertionRoot.GetText(text.Encoding) .Replace(destinationSpan, insertionText.Trim()); document = document.WithText(finalText); var newRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var declaration = GetSyntax(newRoot.FindToken(destinationSpan.End)); document = document.WithSyntaxRoot(newRoot.ReplaceNode(declaration, declaration.WithAdditionalAnnotations(_annotation))); return(await Formatter.FormatAsync(document, _annotation, cancellationToken : cancellationToken).ConfigureAwait(false)); }
protected override Task <CompletionDescription> GetDescriptionWorkerAsync(Document document, CompletionItem item, CancellationToken cancellationToken) => MemberInsertionCompletionItem.GetDescriptionAsync(item, document, cancellationToken);