Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn:连续卷影复制&;更改文档时对其进行语法转换_C#_Syntax_Roslyn - Fatal编程技术网

C# Roslyn:连续卷影复制&;更改文档时对其进行语法转换

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 "

我正在编写一个脚本编辑器,它需要根据我定义的一些规则将用户的输入(类似于脚本语法)转换为有效的C。例如,如果用户输入

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做了一些类似的事情,但出于各种原因,我不能使用它)

考虑到以下因素,现在我需要想出一种实现这种转换的方法:

  • 由于每次用户更改原始文档(即只键入一个字母)时,我都需要运行转换,因此从性能角度来看,我无法每次都重新解析整个文档。例如,如果用户在“;”之后插入缺少的分号,理想情况下,我只需将相同(或克隆的)节点插入到已转换的文档中,而不是重新解析所有内容。我想这排除了标准的修改方式,比如DocumentEditor

  • 我需要有一种方法将转换后的文档中的位置重新映射到原始文档中的位置。因为我永远不会删除节点,所以我认为理论上这应该是可能的(但是怎么可能呢?)。 这是必要的,例如,因为我最终会得到指向转换文档中位置的诊断消息(和智能感知信息等),并且需要获取原始文档的位置,以便将它们实际显示给用户

  • 任何人都可以用一种或多或少直接的方式来做这件事吗?对于这样的用例,是否有一些Roslyn助手类


    我的想法如下。我不太确定它们是否有效,而且我认为它们很难实现,所以我希望有更简单的方法来诚实

    对于#1,我唯一的想法是在原始文档的源代码更改后获取原始文档的文本更改(Document.getTextChangesSync);然后设法找出哪些节点受此影响(可能会获取新旧文档中与编辑区域相交的节点,然后计算哪些节点已被删除、添加或修改),然后在转换后的文档中应用这些更改。但这似乎非常复杂

    对于#2,到目前为止,我唯一的想法是启用对原始文档节点的跟踪。然后,我将在转换后的文档中找到位置指向的任何节点,并在原始文档中找到该节点(然后找到该节点的位置)。
    但问题是,例如,上面的代码会产生一个诊断错误,指向“Hi!”之后的位置,位置跨度的长度为0,因为缺少分号。因此,该位置实际上根本不指向节点。也许我可以在这种情况下找到相邻的节点

    您的用户将使用Visual Studio吗?如果是这样,您可能想签出。不幸的是,这是一个小型自定义编辑器。不过谢谢你的提示,我会通读一遍——也许有一些技巧我可以使用