C# Roslyn:连续卷影复制&;更改文档时对其进行语法转换
我正在编写一个脚本编辑器,它需要根据我定义的一些规则将用户的输入(类似于脚本语法)转换为有效的C。例如,如果用户输入C# Roslyn:连续卷影复制&;更改文档时对其进行语法转换,c#,syntax,roslyn,C#,Syntax,Roslyn,我正在编写一个脚本编辑器,它需要根据我定义的一些规则将用户的输入(类似于脚本语法)转换为有效的C。例如,如果用户输入 using System; public string hello() { return "Hi!" // whoops, semicolon here is missing! } 我需要把它转换成 using System; public class ContainerClass { public string hello() { return "
using System;
public string hello()
{
return "Hi!" // whoops, semicolon here is missing!
}
我需要把它转换成
using System;
public class ContainerClass
{
public string hello()
{
return "Hi!" // whoops, semicolon here is missing!
}
}
我的转换将插入新节点(如类声明),并可能在现有节点周围移动,但它永远不会修改或删除现有节点。(我知道SourceCodeKind=Script做了一些类似的事情,但出于各种原因,我不能使用它)
考虑到以下因素,现在我需要想出一种实现这种转换的方法:
我的想法如下。我不太确定它们是否有效,而且我认为它们很难实现,所以我希望有更简单的方法来诚实 对于#1,我唯一的想法是在原始文档的源代码更改后获取原始文档的文本更改(Document.getTextChangesSync);然后设法找出哪些节点受此影响(可能会获取新旧文档中与编辑区域相交的节点,然后计算哪些节点已被删除、添加或修改),然后在转换后的文档中应用这些更改。但这似乎非常复杂 对于#2,到目前为止,我唯一的想法是启用对原始文档节点的跟踪。然后,我将在转换后的文档中找到位置指向的任何节点,并在原始文档中找到该节点(然后找到该节点的位置)。
但问题是,例如,上面的代码会产生一个诊断错误,指向“Hi!”之后的位置,位置跨度的长度为0,因为缺少分号。因此,该位置实际上根本不指向节点。也许我可以在这种情况下找到相邻的节点 您的用户将使用Visual Studio吗?如果是这样,您可能想签出。不幸的是,这是一个小型自定义编辑器。不过谢谢你的提示,我会通读一遍——也许有一些技巧我可以使用