public bool TryGetSmartTokenIndentation(out IndentationResult indentationResult) { if (ShouldUseTokenIndenter(out var token)) { // var root = document.GetSyntaxRootSynchronously(cancellationToken); var sourceText = Tree.GetText(CancellationToken); var formatter = CreateSmartTokenFormatter(); 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 changes = SmartTokenFormatter.FormatToken(token, CancellationToken); var updatedSourceText = Text.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); }
public static string GetIndentationString(this IndentationResult indentationResult, SourceText sourceText, bool useTabs, int tabSize) { var baseLine = sourceText.Lines.GetLineFromPosition(indentationResult.BasePosition); var baseOffsetInLine = indentationResult.BasePosition - baseLine.Start; var indent = baseOffsetInLine + indentationResult.Offset; var indentString = indent.CreateIndentationString(useTabs, tabSize); return(indentString); }