如何找出一个变量是否在clang AST的特定源位置的作用域中
How to find out if a variable is in the scope of a specific source location in clang AST?
我正在使用clang编写一个自动修复程序。有时,程序需要通过错误部分范围内的变量来生成一些代码。首先,它收集方法(包含有问题的部分)中的所有变量,然后检查哪些属于有问题的部分的范围。我怎样才能发现一个变量是否属于某个源位置的范围?例如,我有一个这样的代码:
int a = 12;
{
int b = 77;
}
if (i > 0 //FAULTY SECTION)
{
//do something
}
现在程序需要生成一些代码并将上面的代码更改为如下所示:
int a = 12;
{
int b = 77;
}
if (i > 0 && a > 0)
{
//do something
}
很明显,b不属于错误部分的范围,我的程序不应该尝试像下面这样的东西,因为语法上是错误的:
if (i > 0 && b > 0)
{
//do something
}
程序如何发现b不存在于错误段的作用域中而不尝试最后一段代码?
因此,您试图以编程方式找出两个变量是否共享相同的作用域。你有你的范围操作符{和}。因此,在解析源代码时,您可以创建一个树来跟踪变量的作用域,例如:
tree scopes // variable
list current_branch // variable pointing to current branch
current_branch = scopes.addRoot() // root or main scope
start parsing {
if scope start operator met:
current_branch = current_branch.addNewBranch() // branch down
if variable met:
current_branch.addVariable(theVariable) // variables in the same scope will be added to the same branch
if scope end operator met:
current_branch = current_branch.parent // go up a branch
}
然后,你将拥有一个变量作用域树,你可以通过在树中查找一个变量并检查另一个变量是否在同一分支中来检查它们是否共享相同的作用域。
不要忘记,如果变量foo
在另一个变量bar
所在的父分支中,那么foo
将仍然在bar
的作用域中。
的例子:
int foo;
{
int bar; // foo still in scope
}
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 如何找出一个变量是否在clang AST的特定源位置的作用域中