// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Host; namespace dnSpy.Roslyn.Internal.SmartIndent { /// /// An indentation result represents where the indent should be placed. It conveys this through /// a pair of values. A position in the existing document where the indent should be relative, /// and the number of columns after that the indent should be placed at. /// /// This pairing provides flexibility to the implementor to compute the indentation results in /// a variety of ways. For example, one implementation may wish to express indentation of a /// newline as being four columns past the start of the first token on a previous line. Another /// may wish to simply express the indentation as an absolute amount from the start of the /// current line. With this tuple, both forms can be expressed, and the implementor does not /// have to convert from one to the other. /// internal struct IndentationResult { /// /// The base position in the document that the indent should be relative to. This position /// can occur on any line (including the current line, or a previous line). /// public int BasePosition { get; } /// /// The number of columns the indent should be at relative to the BasePosition's column. /// public int Offset { get; } public IndentationResult(int basePosition, int offset) : this() { this.BasePosition = basePosition; this.Offset = offset; } } internal interface IIndentationService : ILanguageService { Task GetDesiredIndentation(Document document, int lineNumber, CancellationToken cancellationToken); } internal interface ISynchronousIndentationService : ILanguageService { IndentationResult? GetDesiredIndentation(Document document, int lineNumber, CancellationToken cancellationToken); } }