【问题标题】:libclang getting the member declarationlibclang 获取成员声明
【发布时间】:2014-12-29 05:45:13
【问题描述】:
class aclass{
public:
    int num;
};

int main()
{
    aclass *ok;
    ok->num = 4;
    return 0;
}

现在当我做 clang_getCursorDefinition(cur_cursor);在 o 开头的光标右侧 ok->num = 4;它为 int num 提供光标;类里面。我希望它给我 aclass *ok; 的光标。 main里面的声明。调用 clang_getCursorSemanticParent(cur_cursor) 似乎是错误的,好像我将声明放在 main() 函数内部或外部,它仍然返回 main() 作为语义父级。

有没有一种方法可以有效地做到这一点,而无需迭代每个可能的光标?

编辑: Clang 将制表符计为 1 个字符,这是正确的。我正在测试的编辑器自动将选项卡计数为 4 号,所以 clang 预期为第 2 列,我的编辑器发送为第 5 列。现在 getCursorDefinition 正在按预期工作,并将我带到范围定义。

【问题讨论】:

    标签: c++ clang libclang


    【解决方案1】:

    当我做 clang_getCursorDefinition(cur_cursor);在o 开头的 光标上ok->num = 4;

    也许您对您的代码行为感到惊讶,因为(常见的)误解是每个源位置只有一个光标。

    这个位置实际上有很多游标,其中一个指向整个表达式,另一个指向成员引用ok->num,还有一个指向指针ok。 (例如,有关此问题的更详细解释,请参见此问题:C++ libclang: Retrieving cursor from CXSourceLocation returning wrong cursor?

    您可能应该尝试在所有位于同一位置的光标中找到正确的光标。执行此操作的方式取决于您最初获得光标的方式。

    【讨论】:

    • 是的。一定是这个,正在调查。另一个问题。有没有办法在将 line:column 设置为 n u m 之间的任何位置时获得 CXCursor_MemberRefExpr 类型的光标?原因是如果我将光标设置在 ok 之间,我想去范围内的类的声明。如果我将光标设置在 n u 之间,我想转到实际类中的声明成员。
    • 简而言之,我认为一个很好的启发式方法是选择具有最小范围的 CXCursor,同时仍然包含您感兴趣的位置。这就是我在@987654322 中实现的@,它似乎工作得很好。
    • 我相信您的第二个问题足够笼统,可能会引起其他人的兴趣……也许您应该考虑将其作为关于 SO 的正式问题。
    • 这是个好主意,但仍然停留在第一个问题上。我可以在 API 中找到的最接近的东西是 clang_getCursorExtent,它给了我一个 CXSourceRange。现在我可以得到对我来说似乎没用的 clang_getRangeStart 和 clang_getRangeEnd。因为它将返回不同位置的游标。我需要循环浏览当前位置的光标。为此我需要哪个 API 调用?
    • 好的,我想我需要通过 stackoverflow.com/questions/10692015/… 这个来标记 CXSourceRange。如果可行,稍后会更新问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多