写了一个修改TextControl的resharper插件?

时间:2008-11-13 05:00:53

标签: .net plugins resharper

Resharper声称要吃它自己的狗食,特别是,他们声称Resharper的许多功能都写在R#(OpenAPI)上。我正在编写一个简单的插件来修复当前选择文档的注释。运行此插件时,它会抛出异常,如下所示:

只能在命令范围内修改文档

我已经研究过这个错误,找不到任何可以帮助的东西,所以我希望可能,你已经写了一个插件来完成这个。如果没有,我希望这个片段足以帮助其他人开始自己的插件。

using System;
using System.IO;
using System.Windows.Forms;
using JetBrains.ActionManagement;
using JetBrains.DocumentModel;
using JetBrains.IDE;
using JetBrains.TextControl;
using JetBrains.Util;

namespace TinkerToys.Actions
{
    [ActionHandler("TinkerToys.RewriteComment")]
    public class RewriteCommentAction : IActionHandler
    {
        #region Implementation of IActionHandler

        /// <summary>
        ///             Updates action visual presentation. If presentation.Enabled is set to false, Execute
        ///             will not be called.
        /// </summary>
        /// <param name="context">DataContext</param>
        /// <param name="presentation">presentation to update</param>
        /// <param name="nextUpdate">delegate to call</param>
        public bool Update(IDataContext context, ActionPresentation presentation, DelegateUpdate nextUpdate)
        {
            ITextControl textControl = context.GetData(DataConstants.TEXT_CONTROL);
            return textControl != null;
        }

        /// <summary>
        ///             Executes action. Called after Update, that set ActionPresentation.Enabled to true.
        /// </summary>
        /// <param name="context">DataContext</param>
        /// <param name="nextExecute">delegate to call</param>
        public void Execute(IDataContext context, DelegateExecute nextExecute)
        {
            ITextControl textControl = context.GetData(DataConstants.TEXT_CONTROL);
            if (textControl != null) {
                TextRange textSelectRange;

                ISelectionModel textSelectionModel = textControl.SelectionModel;
                if ((textSelectionModel != null) && textSelectionModel.HasSelection()) {
                    textSelectRange = textSelectionModel.Range;
                } else {
                    textSelectRange = new TextRange(0, textControl.Document.GetTextLength());
                }

                IDocument textDocument = textControl.Document;
                String textSelection = textDocument.GetText(textSelectRange);
                if (textSelection != null) {
                    StringReader sReader = new StringReader(textSelection);
                    StringWriter sWriter = new StringWriter();
                    Converter.Convert(sReader, sWriter);
                    textSelection = sWriter.ToString();

                    textDocument.ReplaceText(textSelectRange, textSelection);
                }
            }
        }

        #endregion
    }
}

那么它想要的命令范围是什么呢?在发布之前我还有一些额外的日志记录,所以我绝对确定范围和文本都是有效的。此外,这个错误似乎表明我错过了一些我以前无法找到的范围。


是的,我想我可以用一个宏来完成同样的任务。回想起来,我写了一个简单的vs加载项来做同样的事情。我之所以/正在研究R#,是因为除了原始文本之外,它还具有语言特定的元素解析功能。但对于这个问题,我认为宏或标准加载项也可以正常工作。

1 个答案:

答案 0 :(得分:0)

如果我理解,你想进行选择,将它发送给一个函数并用函数返回值替换选择...

使用Visual Studio宏来完成这项工作怎么样?这是你会考虑的事情吗?