private void AddChangeSignatureIndentOperation(List <IndentBlockOperation> list, SyntaxNode node) { if (node.Parent != null) { var baseToken = node.Parent.GetFirstToken(); var startToken = node.GetFirstToken(); var endToken = node.GetLastToken(); var span = CommonFormattingHelpers.GetSpanIncludingTrailingAndLeadingTriviaOfAdjacentTokens(startToken, endToken); span = TextSpan.FromBounds(Math.Max(baseToken.Span.End, span.Start), span.End); list.Add(FormattingOperations.CreateRelativeIndentBlockOperation(baseToken, startToken, endToken, span, indentationDelta: 1, option: IndentBlockOption.RelativeToFirstTokenOnBaseTokenLine)); } }
private void AddSwitchIndentationOperation(List <IndentBlockOperation> list, SyntaxNode node, OptionSet optionSet) { var section = node as SwitchSectionSyntax; if (section == null || !optionSet.GetOption(CSharpFormattingOptions.IndentSwitchCaseSection)) { return; } // can this ever happen? if (section.Labels.Count == 0 && section.Statements.Count == 0) { return; } // see whether we are the last statement var switchStatement = node.Parent as SwitchStatementSyntax; var lastSection = switchStatement.Sections.Last() == node; if (section.Statements.Count == 0) { // even if there is no statement under section, we still want indent operation var lastTokenOfLabel = section.Labels.Last().GetLastToken(includeZeroWidth: true); var nextToken = lastTokenOfLabel.GetNextToken(includeZeroWidth: true); AddIndentBlockOperation(list, lastTokenOfLabel, lastTokenOfLabel, lastSection ? TextSpan.FromBounds(lastTokenOfLabel.FullSpan.End, nextToken.SpanStart) : TextSpan.FromBounds(lastTokenOfLabel.FullSpan.End, lastTokenOfLabel.FullSpan.End)); return; } var startToken = section.Statements.First().GetFirstToken(includeZeroWidth: true); var endToken = section.Statements.Last().GetLastToken(includeZeroWidth: true); // see whether we are the last statement var span = CommonFormattingHelpers.GetSpanIncludingTrailingAndLeadingTriviaOfAdjacentTokens(startToken, endToken); span = lastSection ? span : TextSpan.FromBounds(span.Start, endToken.FullSpan.End); AddIndentBlockOperation(list, startToken, endToken, span); }
protected void RemoveIndentBlockOperation( List <IndentBlockOperation> list, SyntaxToken startToken, SyntaxToken endToken) { if (startToken.CSharpKind() == SyntaxKind.None || endToken.CSharpKind() == SyntaxKind.None) { return; } var span = CommonFormattingHelpers.GetSpanIncludingTrailingAndLeadingTriviaOfAdjacentTokens(startToken, endToken); for (int i = 0; i < list.Count; i++) { if (list[i] != null && list[i].TextSpan == span) { list[i] = null; return; } } }
private void AddSwitchIndentationOperation(List <IndentBlockOperation> list, SyntaxNode node, OptionSet optionSet) { var section = node as SwitchSectionSyntax; if (section == null) { return; } // can this ever happen? if (section.Labels.Count == 0 && section.Statements.Count == 0) { return; } var indentSwitchCase = optionSet.GetOption(CSharpFormattingOptions.IndentSwitchCaseSection); var indentSwitchCaseWhenBlock = optionSet.GetOption(CSharpFormattingOptions.IndentSwitchCaseSectionWhenBlock); if (!indentSwitchCase && !indentSwitchCaseWhenBlock) { // Never indent return; } var alwaysIndent = indentSwitchCase && indentSwitchCaseWhenBlock; if (!alwaysIndent) { // Only one of these values can be true at this point. Debug.Assert(indentSwitchCase != indentSwitchCaseWhenBlock); var firstStatementIsBlock = section.Statements.Count > 0 && section.Statements[0].IsKind(SyntaxKind.Block); if (indentSwitchCaseWhenBlock != firstStatementIsBlock) { return; } } // see whether we are the last statement var switchStatement = node.Parent as SwitchStatementSyntax; var lastSection = switchStatement.Sections.Last() == node; if (section.Statements.Count == 0) { // even if there is no statement under section, we still want indent operation var lastTokenOfLabel = section.Labels.Last().GetLastToken(includeZeroWidth: true); var nextToken = lastTokenOfLabel.GetNextToken(includeZeroWidth: true); AddIndentBlockOperation(list, lastTokenOfLabel, lastTokenOfLabel, lastSection ? TextSpan.FromBounds(lastTokenOfLabel.FullSpan.End, nextToken.SpanStart) : TextSpan.FromBounds(lastTokenOfLabel.FullSpan.End, lastTokenOfLabel.FullSpan.End)); return; } var startToken = section.Statements.First().GetFirstToken(includeZeroWidth: true); var endToken = section.Statements.Last().GetLastToken(includeZeroWidth: true); // see whether we are the last statement var span = CommonFormattingHelpers.GetSpanIncludingTrailingAndLeadingTriviaOfAdjacentTokens(startToken, endToken); span = lastSection ? span : TextSpan.FromBounds(span.Start, endToken.FullSpan.End); AddIndentBlockOperation(list, startToken, endToken, span); }
/// <summary> /// create indent block region around the start and end token with the given indentation delta added to the column of the base token /// </summary> public static IndentBlockOperation CreateRelativeIndentBlockOperation(SyntaxToken baseToken, SyntaxToken startToken, SyntaxToken endToken, int indentationDelta, IndentBlockOption option) { var span = CommonFormattingHelpers.GetSpanIncludingTrailingAndLeadingTriviaOfAdjacentTokens(startToken, endToken); return(CreateRelativeIndentBlockOperation(baseToken, startToken, endToken, span, indentationDelta, option)); }