2016-07-22 1 views
2

Я пытаюсь определить, является ли объявление переменной в 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. Если у вас есть лучший, более безопасный и менее неряшливый способ сделать это, пожалуйста, открыты для любых мнений. Кроме того, моя главная проблема заключается в том, как получить количество измерений массива и даже его размер в терминах ячеек.

Спасибо всем.

ответ

3

Попробуйте это:

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-and-dyn-cast-templates

+0

Как я уже видел getAsConstantArray работает точно так же. Однако, когда я пытаюсь скомпилировать с помощью dyn_cast_or_null, я получаю ошибку: 'нет подходящей функции для вызова to dyn_cast_or_null (clang :: QualType)' –

+0

Да, это ожидаемо, потому что нет никакого типа, производного от clang :: QualType, так что нет соответствующая функция для вашего вызова. Вы должны наложить объект clang :: Type или указатель. –