如何在C#源生成器生成的成员之间插入空行?
解决C#源生成器语法树生成时成员间无空行的问题
- 核心问题在于不要仅给单个成员加尾随trivia,而是要在成员之间明确插入空行对应的语法 trivia,以下是两种可靠的实现方式:
方式1:给非首成员添加前置空行trivia
这种方式更直观,确保每个后续成员前都有一个空行,避免末尾多余空行:
// 假设jsonProperties是你从JSON读取的键值对集合 var memberList = new List<MemberDeclarationSyntax>(); foreach (var (index, prop) in jsonProperties.Select((p, i) => (i, p))) { // 构建公共字符串常量字段 var field = SyntaxFactory.FieldDeclaration( SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword))) .WithVariables(SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(prop.Key) .WithInitializer(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(prop.Value)) )) )) ) .WithModifiers(SyntaxFactory.TokenList( SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.ConstKeyword) )); // 除第一个成员外,添加空行前置trivia if (index > 0) { var emptyLine = SyntaxFactory.SyntaxTriviaList( SyntaxFactory.NewLineTrivia(), SyntaxFactory.NewLineTrivia() ); field = field.WithLeadingTrivia(emptyLine); } memberList.Add(field); } // 构建最终的静态类 var staticClass = SyntaxFactory.ClassDeclaration("YourStaticClassName") .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.StaticKeyword))) .WithMembers(SyntaxFactory.List(memberList)) .NormalizeWhitespace(); // 规范化空白,确保自定义trivia生效
方式2:给非尾成员添加尾随空行trivia
如果习惯在成员后加空白,可给除最后一个外的所有成员添加尾随空行:
var members = jsonProperties.Select((prop, index) => { var field = SyntaxFactory.FieldDeclaration( SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword))) .WithVariables(SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(prop.Key) .WithInitializer(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(prop.Value)) )) )) ) .WithModifiers(SyntaxFactory.TokenList( SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.ConstKeyword) )); // 非最后一个成员添加空行尾随trivia if (index != jsonProperties.Count - 1) { field = field.WithTrailingTrivia( SyntaxFactory.SyntaxTriviaList( SyntaxFactory.NewLineTrivia(), SyntaxFactory.NewLineTrivia() ) ); } return field; }).ToList(); var staticClass = SyntaxFactory.ClassDeclaration("YourStaticClassName") .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.StaticKeyword))) .WithMembers(SyntaxFactory.List(members)) .NormalizeWhitespace();
- 注意:如果之前调用
NormalizeWhitespace()无效,检查是否是在添加自定义trivia之后调用的——必须先设置trivia,再执行规范化,否则默认空白会覆盖自定义设置。
内容的提问来源于stack exchange,提问作者Axemasta
相关产品推荐
相关产品推荐

