使用 EnvDTE 从 Visual Studio 中 c++ 头文件中的光标位置获取 CodeElement

Get CodeElement from cursor position in c++ header file in Visual Studio using EnvDTE

本文关键字:光标 位置 CodeElement 获取 文件 c++ EnvDTE Visual Studio 使用      更新时间:2023-10-16

要求:

使用自动化模型 EnvDTE 从 Visual Studio 中C++源和头文件中的当前光标位置获取代码元素(函数/类等)。

问题:

当光标位于头文件中并且我从该头文件中迭代代码元素以获取它们的位置时,我在其源文件中获得相应的元素位置。因此,我收到"值不在指定范围内"异常。

例:这是代码片段

 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 为我提供了源文件中该代码元素的起点,因此我在该行出现异常

例如,假设在头文件中函数 fun() 在第 20 行声明,并在源文件的第 901 行定义。如果我单击第 20 行,那么在迭代过程中我会得到函数 fun() 的行号 901,这显然不是头文件的范围。

注意:我尝试在FileCodeModel和VCFileCodeModel中使用CodeElementFromPoint方法,但它不可靠。

有人遇到过这样的问题吗?请帮忙。或者请向我建议正确的方法来满足我的要求。

提前谢谢。

自己

想通了

默认情况下,"objCodeElement.StartPoint"中的属性 StartPoint 给出了元素定义的位置。

因此,我没有使用属性,而是在 CodeElement 上使用函数get_StartPointOf。此函数采用两个参数,第一个是"元素的一部分",第二个是"元素来自何处"(声明或定义)。因此,将第二个参数作为声明给出将给出元素声明在其头文件中的起始位置。

例如

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