private static IdentifierNameSyntax PadMemberAccess( SimpleLambdaExpressionSyntax node, IdentifierNameSyntax memberAccess) { // We want to make the new span var originalSpan = node.GetLocation().GetMappedLineSpan(); // Start by collecting all the trivia 'inside' the expression - we need to tack that on the end, but // if it ends with a newline, don't include that. var innerTrivia = SyntaxFactory.TriviaList(node.DescendantTrivia(descendIntoChildren: n => true)); if (innerTrivia.Count > 0 && innerTrivia[innerTrivia.Count - 1].IsKind(SyntaxKind.EndOfLineTrivia)) { innerTrivia = innerTrivia.RemoveAt(innerTrivia.Count - 1); } memberAccess = memberAccess.WithTrailingTrivia(innerTrivia); // If everything is all on one line, then make sure the spans are the same, to compensate // for the expression potentially being longer than the variable name. var lineSpan = originalSpan.EndLinePosition.Line - originalSpan.StartLinePosition.Line; if (lineSpan == 0) { var padding = node.Span.Length - memberAccess.FullSpan.Length; var trailingTrivia = SyntaxFactory.TriviaList(memberAccess.GetTrailingTrivia()) .Add(SyntaxFactory.Whitespace(new string(' ', padding))) .AddRange(node.GetTrailingTrivia()); return memberAccess .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(trailingTrivia); } else { // If everything isn't on the same line, we need to pad out the last line. var padding = originalSpan.EndLinePosition.Character - originalSpan.StartLinePosition.Character; var trailingTrivia = SyntaxFactory.TriviaList(memberAccess.GetTrailingTrivia()) .Add(SyntaxFactory.Whitespace(new string(' ', padding))) .AddRange(node.GetTrailingTrivia()); return memberAccess .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(trailingTrivia); } }
private static void PrepareClassCacheEntry(IdentifierNameSyntax newClassModifier, ClassDeclarationSyntax classDeclaration, IdentifierNameSyntax newInterfaceModifier) { if (!ClassCache.ContainsKey(newClassModifier.Identifier.Text)) { var baseList = classDeclaration.BaseList ?? SyntaxFactory.BaseList(); ClassCache.Add(newClassModifier.Identifier.Text, SyntaxFactory.ClassDeclaration( SyntaxFactory.List(new[] { GetCompilerGeneratedAttribute() .WithTrailingTrivia( NewLineCharacter, TabCharacter) }), SyntaxFactory.TokenList(), newClassModifier.Identifier .WithTrailingTrivia(WhitespaceCharacter) .WithLeadingTrivia(WhitespaceCharacter), null, baseList.AddTypes( SyntaxFactory.SimpleBaseType( newInterfaceModifier .WithLeadingTrivia(WhitespaceCharacter) .WithTrailingTrivia(WhitespaceCharacter))), SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(), SyntaxFactory.List<MemberDeclarationSyntax>()) .WithLeadingTrivia(TabCharacter) .WithTrailingTrivia(NewLineCharacter)); } }