Написан плагин, который изменяет TextControl? - PullRequest
4 голосов
/ 13 ноября 2008

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
    }
}

Так что же это за область действия команды, которую он так сильно хочет? У меня было несколько дополнительных входов в систему до публикации, так что я абсолютно уверен, что диапазон и текст действительны. Кроме того, ошибка, похоже, указывает на то, что мне не хватает какой-то области, которую я пока не могу найти.


Да, наверное, я мог бы использовать макрос для выполнения той же задачи. Оглядываясь назад, я написал простую надстройку против той же вещи. Причина, по которой я смотрел / смотрю на R #, заключается в том, что он имеет синтаксический анализ элементов для конкретного языка, который он может предоставить в дополнение к необработанному тексту. Но для этой проблемы я думаю, что макро или стандартная надстройка также будет работать нормально.

1 Ответ

0 голосов
/ 13 ноября 2008

Если я понял, вы хотите принять выбор, отправить его в функцию и заменить выбор возвращаемым значением функции ...

А как насчет использования макроса Visual Studio для этой работы? Это то, что вы будете рассматривать?

...