|
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
Imports Microsoft.CodeAnalysis.Formatting.Rules
Imports Microsoft.CodeAnalysis.Text
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Friend Class BaseFormattingRule
Inherits CompatAbstractFormattingRule
Public Sub New()
End Sub
Protected Shared Sub AddIndentBlockOperation(operations As List(Of IndentBlockOperation), startToken As SyntaxToken, endToken As SyntaxToken, Optional [option] As IndentBlockOption = IndentBlockOption.RelativePosition)
If startToken.Kind = SyntaxKind.None OrElse endToken.Kind = SyntaxKind.None Then
Return
End If
Dim span = GetIndentBlockSpan(startToken, endToken)
operations.Add(FormattingOperations.CreateIndentBlockOperation(startToken, endToken, span, indentationDelta:=1, [option]:=[option]))
End Sub
Protected Shared Sub AddIndentBlockOperation(operations As List(Of IndentBlockOperation),
baseToken As SyntaxToken,
startToken As SyntaxToken,
endToken As SyntaxToken,
Optional textSpan As TextSpan = Nothing,
Optional [option] As IndentBlockOption = IndentBlockOption.RelativePosition)
Dim span = If(textSpan = Nothing, GetIndentBlockSpan(startToken, endToken), textSpan)
operations.Add(FormattingOperations.CreateRelativeIndentBlockOperation(baseToken, startToken, endToken, span, indentationDelta:=1, [option]:=[option]))
End Sub
Protected Shared Sub SetAlignmentBlockOperation(operations As List(Of IndentBlockOperation), baseToken As SyntaxToken, startToken As SyntaxToken, endToken As SyntaxToken, Optional [option] As IndentBlockOption = IndentBlockOption.RelativePosition)
SetAlignmentBlockOperation(operations, baseToken, startToken, endToken, GetAlignmentSpan(startToken, endToken), [option])
End Sub
Protected Shared Sub SetAlignmentBlockOperation(operations As List(Of IndentBlockOperation), baseToken As SyntaxToken, startToken As SyntaxToken, endToken As SyntaxToken, span As TextSpan, Optional [option] As IndentBlockOption = IndentBlockOption.RelativePosition)
operations.Add(FormattingOperations.CreateRelativeIndentBlockOperation(baseToken, startToken, endToken, span, indentationDelta:=0, [option]:=[option]))
End Sub
Protected Shared Sub AddAbsolutePositionIndentBlockOperation(operations As List(Of IndentBlockOperation), startToken As SyntaxToken, endToken As SyntaxToken, indentation As Integer, Optional [option] As IndentBlockOption = IndentBlockOption.AbsolutePosition)
AddAbsolutePositionIndentBlockOperation(operations, startToken, endToken, indentation, GetIndentBlockSpan(startToken, endToken), [option])
End Sub
Protected Shared Sub AddAbsolutePositionIndentBlockOperation(operations As List(Of IndentBlockOperation), startToken As SyntaxToken, endToken As SyntaxToken, indentation As Integer, span As TextSpan, Optional [option] As IndentBlockOption = IndentBlockOption.AbsolutePosition)
operations.Add(FormattingOperations.CreateIndentBlockOperation(startToken, endToken, span, indentation, [option]))
End Sub
Private Shared Function GetAlignmentSpan(startToken As SyntaxToken, endToken As SyntaxToken) As TextSpan
Dim previousToken = startToken.GetPreviousToken(includeZeroWidth:=True)
Return TextSpan.FromBounds(previousToken.Span.End, endToken.FullSpan.End)
End Function
Private Shared Function GetIndentBlockSpan(startToken As SyntaxToken, endToken As SyntaxToken) As TextSpan
' special case for colon trivia
Dim spanStart = startToken.GetPreviousToken(includeZeroWidth:=True).Span.End
Dim nextToken = endToken.GetNextToken(includeZeroWidth:=True)
For Each trivia In nextToken.LeadingTrivia.Reverse()
If trivia.Kind = SyntaxKind.EndOfLineTrivia Then
Exit For
ElseIf trivia.Kind = SyntaxKind.ColonTrivia Then
Return TextSpan.FromBounds(spanStart, trivia.FullSpan.Start)
End If
Next
Return TextSpan.FromBounds(spanStart, nextToken.SpanStart)
End Function
#Disable Warning IDE0060 ' Remove unused parameter
Protected Shared Sub AddSuppressWrappingIfOnSingleLineOperation(operations As List(Of SuppressOperation), startToken As SyntaxToken, endToken As SyntaxToken)
' VB doesn't need to use this operation
Throw ExceptionUtilities.Unreachable
End Sub
Protected Shared Sub AddSuppressAllOperationIfOnMultipleLine(operations As List(Of SuppressOperation), startToken As SyntaxToken, endToken As SyntaxToken)
' VB doesn't need to use this operation
Throw ExceptionUtilities.Unreachable
End Sub
#Enable Warning IDE0060 ' Remove unused parameter
Protected Shared Sub AddAnchorIndentationOperation(operations As List(Of AnchorIndentationOperation), startToken As SyntaxToken, endToken As SyntaxToken)
If startToken.Kind = SyntaxKind.None OrElse endToken.Kind = SyntaxKind.None Then
Return
End If
operations.Add(FormattingOperations.CreateAnchorIndentationOperation(startToken, endToken))
End Sub
Protected Shared Sub AddAlignIndentationOfTokensToBaseTokenOperation(operations As List(Of AlignTokensOperation), containingNode As SyntaxNode, baseToken As SyntaxToken, tokens As IEnumerable(Of SyntaxToken))
If containingNode Is Nothing OrElse tokens Is Nothing Then
Return
End If
operations.Add(FormattingOperations.CreateAlignTokensOperation(baseToken, tokens, AlignTokensOption.AlignIndentationOfTokensToBaseToken))
End Sub
Protected Shared Function CreateAdjustNewLinesOperation(line As Integer, [option] As AdjustNewLinesOption) As AdjustNewLinesOperation
Return FormattingOperations.CreateAdjustNewLinesOperation(line, [option])
End Function
Protected Shared Function CreateAdjustSpacesOperation(space As Integer, [option] As AdjustSpacesOption) As AdjustSpacesOperation
Return FormattingOperations.CreateAdjustSpacesOperation(space, [option])
End Function
End Class
End Namespace
|