如何更改EnvDTE.Document的文本?

时间:2017-11-06 09:24:59

标签: c# json visual-studio-extensions envdte roslyn-code-analysis

我使用以下代码将新的json文本分配给文档:

    public virtual async Task SetDocumentText(FileInfo fileInfo, string contents)
    {
        if (fileInfo == null)
            throw new ArgumentNullException(nameof(fileInfo));
        var projectItem = FindDTEProjectItem(fileInfo.FullName);
        if (null == projectItem?.Document)
            await Task.Run(() => fileInfo.WriteAllText(contents));
        else
        {
            var textSelection = (TextSelection)projectItem.Document.Selection;
            textSelection.SelectAll();
            textSelection.Text = contents;
            projectItem.Document.Save();
        }
    }

但我目前的解决方案有三个问题:

  1. json文本已损坏。
  2. 分配新文本非常慢。
  3. 选择了文档中的所有文字。
  4. 有没有更好的方法将新文本分配给EnvDTE.Document?

    这是损坏的文本:

    enter image description here

    但这就是我指定的内容:

      ...
      ...
      },
      "client": {
        "title": "Mr"
      }
    }
    

    我指定的json文本是有效且格式良好的,即使它不是,我也不会期待json文本的这种严重腐败。

    如果我将文本直接写入文件,那么Visual Studio会询问用户是否要重新加载,我也试图避免使用该弹出窗口。

    任何帮助将不胜感激。我没有成功使用roslyn和TextDocument,因为我无法加载AdditionalDocument。 roslyn Project Documents集合中只包含代码文件。

1 个答案:

答案 0 :(得分:3)

您可以使用textSelection.Text = contents;代替textSelection.Insert(contents);。它更快,并阻止Visual Studio更改原始内容。