private IEnumerable <SyntaxTrivia> TriviaResolver( TriviaLocation location, PreviousNextTokenPair tokenPair, Dictionary <SyntaxToken, LeadingTrailingTriviaPair> triviaMap, MethodDeclarationSyntax method) { // Resolve trivia at the edge of the selection. simple case is easy to deal with, but complex cases where // elastic trivia and user trivia are mixed (hybrid case) and we want to preserve some part of user coding style // but not others can be dealt with here. // method has no statement in them. so basically two trivia list now pointing to same thing. "{" and "}" if (method.Body != null) { if (tokenPair.PreviousToken == method.Body.OpenBraceToken && tokenPair.NextToken == method.Body.CloseBraceToken) { return((location == TriviaLocation.AfterBeginningOfSpan) ? SpecializedCollections.SingletonEnumerable(SyntaxFactory.ElasticMarker) : SpecializedCollections.EmptyEnumerable <SyntaxTrivia>()); } } else { if (tokenPair.PreviousToken == method.ExpressionBody.ArrowToken && tokenPair.NextToken.GetPreviousToken() == method.EosToken) { return((location == TriviaLocation.AfterBeginningOfSpan) ? SpecializedCollections.SingletonEnumerable(SyntaxFactory.ElasticMarker) : SpecializedCollections.EmptyEnumerable <SyntaxTrivia>()); } } var previousTriviaPair = triviaMap.ContainsKey(tokenPair.PreviousToken) ? triviaMap[tokenPair.PreviousToken] : default; var nextTriviaPair = triviaMap.ContainsKey(tokenPair.NextToken) ? triviaMap[tokenPair.NextToken] : default; var trailingTrivia = previousTriviaPair.TrailingTrivia ?? SpecializedCollections.EmptyEnumerable <SyntaxTrivia>(); var leadingTrivia = nextTriviaPair.LeadingTrivia ?? SpecializedCollections.EmptyEnumerable <SyntaxTrivia>(); var list = trailingTrivia.Concat(leadingTrivia); switch (location) { case TriviaLocation.BeforeBeginningOfSpan: return(FilterBeforeBeginningOfSpan(tokenPair, list)); case TriviaLocation.AfterEndOfSpan: return(FilterTriviaList(list.Concat(tokenPair.NextToken.LeadingTrivia))); case TriviaLocation.AfterBeginningOfSpan: return(FilterTriviaList(AppendTrailingTrivia(tokenPair).Concat(list).Concat(tokenPair.NextToken.LeadingTrivia))); case TriviaLocation.BeforeEndOfSpan: return(FilterTriviaList(tokenPair.PreviousToken.TrailingTrivia.Concat(list).Concat(tokenPair.NextToken.LeadingTrivia))); } return(Contract.FailWithReturn <IEnumerable <SyntaxTrivia> >("Shouldn't reach here")); }
private IEnumerable <SyntaxTrivia> AppendTrailingTrivia(PreviousNextTokenPair tokenPair) { if (tokenPair.PreviousToken.RawKind == (int)SyntaxKind.OpenBraceToken || tokenPair.PreviousToken.RawKind == (int)SyntaxKind.SemicolonToken) { return(tokenPair.PreviousToken.TrailingTrivia); } return(SpecializedCollections.EmptyEnumerable <SyntaxTrivia>()); }
private IEnumerable <SyntaxTrivia> FilterBeforeBeginningOfSpan(PreviousNextTokenPair tokenPair, IEnumerable <SyntaxTrivia> list) { var allList = FilterTriviaList(tokenPair.PreviousToken.TrailingTrivia.Concat(list).Concat(AppendLeadingTrivia(tokenPair))); if (tokenPair.PreviousToken.RawKind == (int)SyntaxKind.OpenBraceToken) { return(RemoveBlankLines(allList)); } return(allList); }