Требование:
Получите 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, но это не надежно.
Кто-нибудь сталкивался с такой проблемой? Пожалуйста помоги.
Или, пожалуйста, предложите мне правильный подход, чтобы удовлетворить мои требования.
Заранее спасибо.
Сам разобрался
Свойство StartPoint в «objCodeElement.StartPoint» по умолчанию задает позицию определения элемента.
Поэтому вместо использования свойства я использовал функцию get_StartPointOf на CodeElement. Эта функция принимает два параметра: первый «Часть элемента» и второй «элемент откуда» (объявление или определение). Таким образом, предоставление второго аргумента в качестве объявления даст начальную позицию объявления элемента в его заголовочном файле.
например
startPoint = objCodeElement.get_StartPointOf(vsCMPart.vsCMPartWholeWithAttributes, vsCMWhere.vsCMWhereDeclaration);
endPoint = objCodeElement.get_EndPointOf(vsCMPart.vsCMPartWholeWithAttributes, vsCMWhere.vsCMWhereDeclaration);
Других решений пока нет …