[英]Get CodeElement from cursor position in c++ header file in Visual Studio using EnvDTE
需求:
使用自动化模型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的起点,因此我在那一行得到了异常
例如,假设在头文件中,函数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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.