示例#1
0
            public bool TryGetSmartTokenIndentation(out IndentationResult indentationResult)
            {
                if (_service.ShouldUseTokenIndenter(this, out var token))
                {
                    // var root = document.GetSyntaxRootSynchronously(cancellationToken);
                    var sourceText = Tree.GetText(CancellationToken);

                    var formatter = _service.CreateSmartTokenFormatter(this);
                    var changes   = formatter.FormatTokenAsync(Document.Project.Solution.Workspace, token, CancellationToken)
                                    .WaitAndGetResult(CancellationToken);

                    var updatedSourceText = sourceText.WithChanges(changes);
                    if (LineToBeIndented.LineNumber < updatedSourceText.Lines.Count)
                    {
                        var updatedLine = updatedSourceText.Lines[LineToBeIndented.LineNumber];
                        var offset      = updatedLine.GetFirstNonWhitespaceOffset();
                        if (offset != null)
                        {
                            indentationResult = new IndentationResult(
                                basePosition: LineToBeIndented.Start,
                                offset: offset.Value);
                            return(true);
                        }
                    }
                }

                indentationResult = default;
                return(false);
            }
            public bool TryGetSmartTokenIndentation(out IndentationResult indentationResult)
            {
                if (_service.ShouldUseTokenIndenter(this, out var token))
                {
                    // var root = document.GetSyntaxRootSynchronously(cancellationToken);
                    var sourceText = Tree.GetText(CancellationToken);

                    var formatter = _service.CreateSmartTokenFormatter(this);
                    var changes   = formatter
                                    .FormatTokenAsync(
                        Document.Project.Solution.Workspace,
                        token,
                        CancellationToken
                        )
                                    .WaitAndGetResult(CancellationToken);

                    var updatedSourceText = sourceText.WithChanges(changes);
                    if (LineToBeIndented.LineNumber < updatedSourceText.Lines.Count)
                    {
                        var updatedLine         = updatedSourceText.Lines[LineToBeIndented.LineNumber];
                        var nonWhitespaceOffset = updatedLine.GetFirstNonWhitespaceOffset();
                        if (nonWhitespaceOffset != null)
                        {
                            // 'nonWhitespaceOffset' is simply an int indicating how many
                            // *characters* of indentation to include.  For example, an indentation
                            // string of \t\t\t would just count for nonWhitespaceOffset of '3' (one
                            // for each tab char).
                            //
                            // However, what we want is the true columnar offset for the line.
                            // That's what our caller (normally the editor) needs to determine where
                            // to actually put the caret and what whitespace needs to proceed it.
                            //
                            // This can be computed with GetColumnFromLineOffset which again looks
                            // at the contents of the line, but this time evaluates how \t characters
                            // should translate to column chars.
                            var offset = updatedLine.GetColumnFromLineOffset(
                                nonWhitespaceOffset.Value,
                                _tabSize
                                );
                            indentationResult = new IndentationResult(
                                basePosition: LineToBeIndented.Start,
                                offset: offset
                                );
                            return(true);
                        }
                    }
                }

                indentationResult = default;
                return(false);
            }