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

时间:2016-07-15 05:29:18

标签: c++ parsing visual-studio-2013 header-files envdte

要求:

使用Automation Model EnvDTE从C ++源代码中的当前光标位置和Visual Studio中的Header文件获取CodeElement(函数/类等)。

问题:

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

实施例: 这是代码段

 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的起点,因此我在该行获得了异常

e.g。假设在头文件函数中,fun()在第20行声明并在源文件中的第901行定义。如果我点击了第20行,那么在迭代期间,我得到函数fun()的行号901,这显然不是头文件的范围。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

自己想出来

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

因此,我在CodeElement上使用了函数 get_StartPointOf ,而不是使用属性。此功能首先采用两个参数'元素的一部分'和第二个元素来自哪里' (声明或定义)。因此,将第二个参数作为声明给出将在其头文件中给出元素声明的起始位置。

e.g。

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