Я пытаюсь определить, является ли объявление переменной в ASTvisitor массивом, и если это массив, я хочу определить количество измерений массива. Ниже вы можете найти мой код.Как проверить, является ли объявление переменной в Clang 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. Если у вас есть лучший, более безопасный и менее неряшливый способ сделать это, пожалуйста, открыты для любых мнений. Кроме того, моя главная проблема заключается в том, как получить количество измерений массива и даже его размер в терминах ячеек.
Спасибо всем.
Как я уже видел getAsConstantArray работает точно так же. Однако, когда я пытаюсь скомпилировать с помощью dyn_cast_or_null, я получаю ошибку: 'нет подходящей функции для вызова to dyn_cast_or_null (clang :: QualType)' –
Да, это ожидаемо, потому что нет никакого типа, производного от clang :: QualType, так что нет соответствующая функция для вашего вызова. Вы должны наложить объект clang :: Type или указатель. –