如何使用Roslyn用字符串替换C#关键字?
我想使用Roslyn加载C#源代码并将其写入另一个文件,用替换词替换关键字。样本:如何使用Roslyn用字符串替换C#关键字?,c#,code-generation,abstract-syntax-tree,roslyn,C#,Code Generation,Abstract Syntax Tree,Roslyn,我想使用Roslyn加载C#源代码并将其写入另一个文件,用替换词替换关键字。样本: for (int i=0; i<10; i++){} 用于(int i=0;i您需要考虑创建一个SyntaxWalker,它遍历整个树并将其复制到输出文件,但作为关键字标记的元素除外。我不知道这会有多好,但您可以用另一个ForKeyword标记替换每个ForKeyword标记,但这次您可以使用CSharpSyntaxRewriter: class KeywordRewriter : CSharpSynta
for (int i=0; i<10; i++){}
用于(int i=0;i您需要考虑创建一个SyntaxWalker
,它遍历整个树并将其复制到输出文件,但作为关键字标记的元素除外。我不知道这会有多好,但您可以用另一个ForKeyword
标记替换每个ForKeyword
标记,但这次您可以使用CSharpSyntaxRewriter
:
class KeywordRewriter : CSharpSyntaxRewriter
{
public override SyntaxToken VisitToken(SyntaxToken token)
{
if (token.Kind() == SyntaxKind.ForKeyword)
{
return SyntaxFactory.Token(
token.LeadingTrivia, SyntaxKind.ForKeyword, "foobar", "foobar",
token.TrailingTrivia);
}
return token;
}
}
使用此重写器,您可以编写如下代码:
string code = "for (int i=0; i<10; i++){}";
var statement = SyntaxFactory.ParseStatement(code);
var rewrittenStatement = new KeywordRewriter().Visit(statement);
Console.WriteLine(rewrittenStatement);
string code=“for(inti=0;i仅用于记录-下面的代码也起作用,但接受的答案要优雅得多
foreach (var t in tree.GetCompilationUnitRoot().DescendantTokens())
{
if (t.HasLeadingTrivia)
{
file.Write(t.LeadingTrivia);
}
file.Write(t.IsKind(SyntaxKind.ForKeyword)? "foobar" : t.ToString());
if (t.HasTrailingTrivia)
{
file.Write(t.TrailingTrivia);
}
}
你们为什么要这样做?你们尝试过什么?原因:将用C#subset编写的程序翻译成具有不同语法的任意语言。我知道如何修改树,我不知道如何控制令牌表示输出。
foobar (int i=0; i<10; i++){}
foreach (var t in tree.GetCompilationUnitRoot().DescendantTokens())
{
if (t.HasLeadingTrivia)
{
file.Write(t.LeadingTrivia);
}
file.Write(t.IsKind(SyntaxKind.ForKeyword)? "foobar" : t.ToString());
if (t.HasTrailingTrivia)
{
file.Write(t.TrailingTrivia);
}
}