如何检查 Clang ASTvisitor 中的变量声明是否是数组

2023-12-30

我试图确定 ASTvisitor 中的变量声明是否是一个数组,如果是一个数组,我想确定该数组的维数。您可以在下面找到我的代码。

bool VisitVarDecl(VarDecl *var)
    {
        if (astContext->getSourceManager().isInMainFile(var->getLocStart())) //checks if the node is in the main = input file.
        {
            FullSourceLoc FullLocation = astContext->getFullLoc(var->getLocStart());
            if((var->hasLocalStorage() || var->isStaticLocal ()))
            {
                if (!var->isDefinedOutsideFunctionOrMethod())
                {
                    if(avoid == 0)
                    {
                        numVariables++;
                        string varName = var->getQualifiedNameAsString();
                        string varType = var->getType().getAsString();
                        const Type *type = var->getType().getTypePtr();
                        if(type->isConstantArrayType())
                        {
                            const ArrayType *Array = type->castAsArrayTypeUnsafe();
                            cout << "Is array of type: "  << Array->getElementType().getAsString() << endl;
                        }
                        REPORT << "[" << FullLocation.getSpellingLineNumber() << "," << FullLocation.getSpellingColumnNumber() << "]Variable Declaration: " << varName << " of type " << varType << "\n";
                        APIs << varType << ";";
                    }
                    else
                    {
                        avoid--;
                        REPORT << "Avoid is: " << avoid << endl;
                    }
                }
            }
        }
        return true;
    }

我不知道我是否正确地进行了从 VarDecl 到 ArrayType 的“转换”。如果您有更好、更安全、更不马虎的方法,请虚心接受任何意见。 此外,我现在的主要问题是如何获取数组的维数,甚至是单元格的大小。

谢谢你们。


尝试这个:

bool VisitVarDecl(VarDecl *D){  
    if (auto t =  dyn_cast_or_null<ConstantArrayType>(D->getType().getTypePtr())) {  
        t->getSize().dump(); // We got the array size as an APInt here  
    }  
    return true;  
}  

最后,这是“一个更好、更安全、更不马虎的方法”:
the-isa-cast-和-dyn-cast-模板 http://llvm.org/docs/ProgrammersManual.html#the-isa-cast-and-dyn-cast-templates

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Clang ASTvisitor 中的变量声明是否是数组 的相关文章

随机推荐