private void ApplyIndentationToGivenPosition( TokenData previousToken, TokenData currentToken, TriviaData triviaInfo, int baseSpaceOrIndentation, Dictionary <SyntaxToken, int> previousChangesMap, CancellationToken cancellationToken) { // add or replace existing value. this could happen if a token get moved multiple times // due to one being involved in multiple alignment operations previousChangesMap[currentToken.Token] = triviaInfo.Spaces; if (previousToken.IndexInStream < 0 || triviaInfo.Spaces == baseSpaceOrIndentation) { return; } // before make any change, check whether spacing is allowed var spanBetweenTokens = TextSpan.FromBounds(previousToken.Token.Span.End, currentToken.Token.SpanStart); if (_context.IsSpacingSuppressed(spanBetweenTokens)) { return; } // okay, update indentation _tokenStream.ApplyChange( previousToken.IndexInStream, triviaInfo.WithIndentation(baseSpaceOrIndentation, _context, _formattingRules, cancellationToken)); }
private static void ApplySpaceAndWrappingOperationsBody( FormattingContext context, TokenStream tokenStream, TokenPairWithOperations operation, OperationApplier applier, CancellationToken cancellationToken) { var token1 = operation.Token1; var token2 = operation.Token2; // check whether one of tokens is missing (which means syntax error exist around two tokens) // in error case, we leave code as user wrote if (token1.IsMissing || token2.IsMissing) { return; } var triviaInfo = tokenStream.GetTriviaData(operation.PairIndex); var spanBetweenTokens = TextSpan.FromBounds(token1.Span.End, token2.SpanStart); if (operation.LineOperation != null) { if (!context.IsWrappingSuppressed(spanBetweenTokens)) { // TODO : need to revisit later for the case where line and space operations // are conflicting each other by forcing new lines and removing new lines. // // if wrapping operation applied, no need to run any other operation if (applier.Apply(operation.LineOperation, operation.PairIndex, cancellationToken)) { return; } } } if (operation.SpaceOperation != null) { if (!context.IsSpacingSuppressed(spanBetweenTokens)) { applier.Apply(operation.SpaceOperation, operation.PairIndex); } } }
private bool ShouldFormat(FormattingContext context) { var commonToken1 = this.Token1; var commonToken2 = this.Token2; var formatSpanEnd = commonToken2.Kind() == SyntaxKind.None ? commonToken1.Span.End : commonToken2.Span.Start; var span = TextSpan.FromBounds(commonToken1.Span.End, formatSpanEnd); if (context.IsSpacingSuppressed(span)) { return false; } var triviaList = new TriviaList(commonToken1.TrailingTrivia, commonToken2.LeadingTrivia); Contract.ThrowIfFalse(triviaList.Count > 0); // okay, now, check whether we need or are able to format noisy tokens if (ContainsSkippedTokensOrText(triviaList)) { return false; } if (!this.SecondTokenIsFirstTokenOnLine) { return CodeShapeAnalyzer.ShouldFormatSingleLine(triviaList); } Debug.Assert(this.SecondTokenIsFirstTokenOnLine); if (this.OptionSet.GetOption(FormattingOptions.UseTabs, LanguageNames.CSharp)) { return true; } var firstTriviaInTree = this.Token1.Kind() == SyntaxKind.None; return CodeShapeAnalyzer.ShouldFormatMultiLine(context, firstTriviaInTree, triviaList); }