gpt4 book ai didi

c# - Roslyn 质疑 SyntaxTree 的构建

转载 作者:行者123 更新时间:2023-11-30 13:20:20 25 4
gpt4 key购买 nike

免责声明

我很确定我遗漏了一些明显的东西,但即使阅读了官方文档,我也不清楚 Roslyn 如何创建语法树。

例子

考虑以下简单代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace aopsample
{

class UsbReadWriter
{

public bool ReadFromUsb()
{
return true;
}

public virtual bool WriteToUsb()
{
return true;
}
}
}

我得到了这段代码的 SyntaxTree 并做了类似这样的东西,非常粗糙和简单,但我只需要理解。

  string[]lines =  System.IO.File.ReadAllLines(filename);      
string tocompile = string.Join(string.Empty, lines);

SyntaxNode root = tree.GetRoot(new CancellationToken());
foreach (SyntaxNode sn in root.ChildNodes())
{
if (sn.Kind == SyntaxKind.NamespaceDeclaration)
{
//I get a namespace, so it's Child node just will be class
foreach (SyntaxNode sname in sn.ChildNodes())
{
if (sname.Kind == SyntaxKind.ClassDeclaration)
{
//I get class, so it's Children will be methods of the class
foreach (SyntaxNode sclass in sname.ChildNodes()) // **{1}**
{
if (sclass.Kind == SyntaxKind.MethodDeclaration)
{

}
}
}
}

而且效果很好。

麻烦

但是,向 ReadFromUsb() 方法添加注释就足够了,就像这样

/// <summary>
/// Reads a data from Usb
/// </summary>
/// <returns></returns>
public bool ReadFromUsb()
{
return true;
}

ChildNodes() 调用 {1} 标记行,对于 CLASS (???) 返回 0。

问题

为什么要在成员函数中添加注释,重置父 CLASS 子句语法节点的集合?

我错过了什么?

最佳答案

经过聊天讨论,我们确定问题出在要解析的代码是用以下代码构建的:

string[]lines = System.IO.File.ReadAllLines(filename); 
string tocompile = string.Join(string.Empty, lines);

这会将所有代码放在一行中。因此 // 之后的所有内容都变成了注释。解决办法就是使用 Environment.NewLine 作为连接字符,或者使用 ReadAllText 而不是 ReadAllLines

关于c# - Roslyn 质疑 SyntaxTree 的构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com