Узнайте, находится ли курсор внутри метода, класса или блока пространства имен - PullRequest
0 голосов
/ 31 декабря 2011

Я хотел бы создать надстройку Visual Studio, которая могла бы определять, находится ли каретка в данный момент в методе, классе или блоке пространства имен, т. Е. Если каретка перемещается, надстройка должна иметь возможность записать статус текущей каретки. внутри такой-то элемент.

Если это можно распространить на любой блок C #, заключенный в фигурные скобки, например, свойства, это было бы отлично.

Хотя я проверил похожие вопросы, пожалуйста, дайте мне знать, если это повторный вопрос, чтобы я мог пометить его соответствующим образом. Если другие вопросы, связанные с VS Addin, явно полезны, пожалуйста, дайте мне знать об этом.

По сути, я хотел бы знать, какие методы мы можем использовать и как это можно сделать.

РЕДАКТИРОВАТЬ: я думаю, короткий ответ, чтобы начать это:

  • Получить Visual Studio 2010 SDK SP1
  • Возможно использовать шаблон проекта "Расширяемость" "Редактор текста для редактирования" или какой-либо другой такой шаблон.

1 Ответ

0 голосов
/ 12 января 2012

На самом деле, я думаю, что первое, что вам нужно сделать, это оценить, сколько методов или свойств в вашем классе и какова их позиция.После того, как вы получите эту информацию.Следующий шаг, который вам нужно сделать, это определить текущую позицию курсора.Затем вы можете сравнить с этими методами информацию, которую вы получили.До сих пор вы можете узнать, какой метод используется в вашем курсоре. Это примерное решение, которое я нахожу.

Давайте поговорим о некоторых технических деталях:

1.Как получитьпозиции методов и свойств?

Вы можете использовать NRefacotry или CSParser , чтобы сделать это (я использую NRefactory, чтобы закончить свое требование)

2.Как получить позицию курсора?

В IVsTextView есть метод с именем «GetCaretPos».Вы можете получить ActiveTextView через TextManager.Тогда вы можете использовать метод «GetCaretPos».Вот некоторые коды, которые могут вам помочь.

    public static IVsTextManager TextManager
    {
        get
        {
            if (textManager == null)
            {
                Object obj = Package.GetGlobalService(typeof(SVsTextManager));
                if (obj == null)
                {
                    throw new ArgumentException("get textmanager failed in VSTextView");
                }
                textManager = obj as IVsTextManager;
            }
            return textManager;
        }
    }


    public static IVsTextView ActiveTextView
    {
        get
        {
            IVsTextView activeView = null;
            if (TextManager != null)
            {
                TextManager.GetActiveView(1, activeTextBuffer, out activeView);
            }
            return activeView;
        }
    }
...