парсинг — получение CodeElement из позиции курсора в заголовочном файле c ++ в Visual Studio с использованием EnvDTE

Требование:

Получите CodeElement (функция / класс и т. Д.) Из текущей позиции курсора в исходных файлах C ++ и заголовочных файлах в Visual Studio с использованием модели автоматизации EnvDTE.

Проблема:

Когда курсор находится в заголовочном файле, и я перебираю элементы кода из этого заголовочного файла для получения их позиции, я получаю соответствующую позицию элементов в его исходном файле. Из-за чего я получаю исключение «Значение не попадает в указанный диапазон».

Пример:
Это фрагмент кода

 private CodeElement GetCodeElementAtTextPoint(vsCMElement eRequestedCodeElementKind, CodeElements codeElements, TextPoint objCursorTextPoint)
{
CodeElement objResultCodeElement = null;
CodeElements colCodeElementMembers;
CodeElement objMemberCodeElement;

if (codeElements != null)
{
foreach (CodeElement objCodeElement in codeElements)
{
if (objCodeElement.Kind == vsCMElement.vsCMElementFunction)
{
var infoLoc = objCodeElement as CodeType;
}

if (objCodeElement.StartPoint.GreaterThan(objCursorTextPoint))
{
}
else if (objCodeElement.EndPoint.LessThan(objCursorTextPoint))
{
}
else
..

В приведенном фрагменте кода objCodeElement.StartPoint дает мне начальную точку этого CodeElement в исходном файле, и, следовательно, я получаю исключение в этой строке

например Предположим, что в заголовочном файле функция fun () объявлена ​​в строке 20 и определена в строке 901 исходного файла. Если я нажал на строку 20, то во время итерации я получу номер строки 901 для функции fun (), которая явно не является диапазоном заголовочного файла.

ЗаметкаЯ пытался использовать метод CodeElementFromPoint в FileCodeModel и VCFileCodeModel, но это не надежно.

Кто-нибудь сталкивался с такой проблемой? Пожалуйста помоги.
Или, пожалуйста, предложите мне правильный подход, чтобы удовлетворить мои требования.

Заранее спасибо.

0

Решение

Сам разобрался

Свойство StartPoint в «objCodeElement.StartPoint» по умолчанию задает позицию определения элемента.

Поэтому вместо использования свойства я использовал функцию get_StartPointOf на CodeElement. Эта функция принимает два параметра: первый «Часть элемента» и второй «элемент откуда» (объявление или определение). Таким образом, предоставление второго аргумента в качестве объявления даст начальную позицию объявления элемента в его заголовочном файле.

например

startPoint = objCodeElement.get_StartPointOf(vsCMPart.vsCMPartWholeWithAttributes, vsCMWhere.vsCMWhereDeclaration);
endPoint = objCodeElement.get_EndPointOf(vsCMPart.vsCMPartWholeWithAttributes, vsCMWhere.vsCMWhereDeclaration);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector