我很确定我错过了一些明显的东西,但即使在阅读官方文档后我也不清楚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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个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)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它运作得很好.
但是,它足以为方法添加注释 ReadFromUsb()
,就像这样
/// <summary>
/// Reads a data from Usb
/// </summary>
/// <returns></returns>
public bool ReadFromUsb()
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
并ChildNodes()
调用{1}标记的行,因为CLASS(???)返回0.
为什么在成员函数中添加注释,重置父CLASS子句语法节点的集合?
我错过了什么?
Kev*_*lch 10
在聊天讨论之后,我们确定问题是正在构建的解析代码:
string[]lines = System.IO.File.ReadAllLines(filename);
string tocompile = string.Join(string.Empty, lines);
Run Code Online (Sandbox Code Playgroud)
这将所有代码放在一行上.因此,一切都//
成为评论.解决方案只是Environment.NewLine
用作连接字符,或者使用ReadAllText
而不是ReadAllLines
.