Esempio n. 1
0
        public BraceCompletionResult GetBraceCompletion(BraceCompletionContext context)
        {
            Debug.Assert(context.HasCompletionForOpeningBrace(OpeningBrace));

            var closingPoint  = context.ClosingPoint;
            var braceTextEdit = new TextChange(TextSpan.FromBounds(closingPoint, closingPoint), ClosingBrace.ToString());

            // The caret location should be in between the braces.
            var originalOpeningLinePosition = context.Document.Text.Lines.GetLinePosition(context.OpeningPoint);
            var caretLocation = new LinePosition(originalOpeningLinePosition.Line, originalOpeningLinePosition.Character + 1);

            return(new BraceCompletionResult(ImmutableArray.Create(braceTextEdit), caretLocation));
        }
Esempio n. 2
0
        public Task <bool> HasBraceCompletionAsync(BraceCompletionContext context, Document document, CancellationToken cancellationToken)
        {
            if (!context.HasCompletionForOpeningBrace(OpeningBrace))
            {
                return(Task.FromResult(false));
            }

            var openingToken = context.GetOpeningToken();

            if (!NeedsSemantics)
            {
                return(Task.FromResult(IsValidOpenBraceTokenAtPosition(context.Document.Text, openingToken, context.OpeningPoint)));
            }

            // Pass along a document with frozen partial semantics.  Brace completion is a highly latency sensitive
            // operation.  We don't want to wait on things like source generators to figure things out.
            return(IsValidOpenBraceTokenAtPositionAsync(document.WithFrozenPartialSemantics(cancellationToken), openingToken, context.OpeningPoint, cancellationToken));
        }