[cfe-dev] using clang - getting type for C variable declaration
David Blaikie
dblaikie at gmail.com
Sun Nov 11 18:27:12 PST 2012
On Fri, Nov 9, 2012 at 8:47 PM, Rajendra <rks at cse.iitb.ac.in> wrote:
> Hi,
>
> Actually, my question is more about getting type as string from Expr or
> QualType.
>
> Say I have,
>
> QualType declQT = valueDecl->getType();
> or
> QualType lhsQT = lhs->getType(); // lhs is on Expr* type
>
> Now, I want to call QualType.getAsString(PrintingPolicy &Policy) and I need
> compiler instance or AST context to get printing policy, how to get compiler
> instance or AST context here?
> //compilerInstance_ptr?
>
> clang::ASTContext &context = compilerInstance_ptr->getASTContext();
> std::cerr << "\ttype: " <<
> declQT.getAsString(context.getPrintingPolicy()) << "\n";
>
> Using Decl, I could do this like decl->getASTContext(); - but same I cannot
> do here!
Off-hand, the simplest way I could find to do this was to look at how
QualType's dump() member is implemented:
It simply create a PrintingPolicy directly with a default LangOptions
( http://clang.llvm.org/doxygen/classclang_1_1QualType.html#a83734a19d59252c9527473a32cb44a12
). This may suffice for your needs. Otherwise I assume there's some
way to get the current ASTContext in your visitor, or perhaps track it
separately.
>
> I am overriding method bool VisitBinAssign(BinaryOperator *E);
>
> Rajendra
>
>
> On 09-11-2012 09:48 PM, David Blaikie wrote:
>>
>> On Fri, Nov 9, 2012 at 2:12 AM, Rajendra <rks at cse.iitb.ac.in> wrote:
>>>
>>> Hi,
>>>
>>> 1) I need to get type as string from Expr object. Any pointers?
>>
>>
>> Presumably Expr::getType():
>>
>>
>> http://clang.llvm.org/doxygen/classclang_1_1Expr.html#a3dd8850a4ad8a5b5f595dd9e9446187b
>>
>>>
>>> Expr* lhs = E->getLHS();
>>>
>>> if (strcmp(lhs->getStmtClassName(), "DeclRefExpr") == 0)
>>> {
>>> // get name and type for Expr *lhs from DeclRefExpr
>>> const DeclRefExpr *declRefExpr = dyn_cast<DeclRefExpr>(lhs);
>>
>>
>> The usual way we write these last two lines is:
>>
>> if (const DeclRefExpr *declRefExpr = dyn_cast<DeclRefExpr(lhs))
>>
>> no string comparison required
>> no double-check (the string check and then the check in the dyn_cast)
>>
>> For more details on LLVM's casting machinery:
>> http://llvm.org/docs/ProgrammersManual.html#isa
>>
>>>
>>> const ValueDecl *valueDecl = declRefExpr->getDecl();
>>>
>>> if (valueDecl)
>>
>>
>> Just a stylistic point related to my first (in case you're planning to
>> be a Clang/LLVM contributor): we usually collapse the variable
>> declaration into the condition.
>>
>>> {
>>> std::cerr << "\tLHS identifier = " << valueDecl->getNameAsString()
>>> <<
>>> "\n"; // this gives x
>>>
>>> QualType declQT = valueDecl->getType();
>>> std::cerr << "\tqual type: ";
>>> declQT.dump(); // this prints : int identifier
>>>
>>> // now call QualType.getAsString(PrintingPolicy &Policy)
>>> // ---> how to get compiler instance and AST context? <---- //
>>> clang::ASTContext &context = compilerInstance_ptr->getASTContext();
>>> std::cerr << "\ttype: " <<
>>> declQT.getAsString(context.getPrintingPolicy()) << "\n";
>>> }
>>> }
>>>
>>> 2) Here is how I got things right for Decl :) this will be helpful for
>>> others as well.
>>>
>>>
>>> clang::DeclGroupRef::iterator it;
>>>
>>> for (it = declGroupRef.begin(); it != declGroupRef.end(); it++)
>>> {
>>> clang::Decl* decl = *it;
>>>
>>> const NamedDecl *namedDecl = dyn_cast<NamedDecl>(decl);
>>>
>>> if (namedDecl)
>>> {
>>> std::cerr << "\tidentifier name = "
>>> << namedDecl->getNameAsString() << "\n";
>>> }
>>>
>>> const ValueDecl *valueDecl = dyn_cast<ValueDecl>(decl);
>>>
>>> if (valueDecl)
>>> {
>>> QualType declQT = valueDecl->getType();
>>>
>>> // now call QualType.getAsString(PrintingPolicy &Policy)
>>> clang::ASTContext &context = decl->getASTContext();
>>> std::cerr << "\ttype = " <<
>>> declQT.getAsString(context.getPrintingPolicy()) << "\n";
>>>
>>> }
>>> }
>>>
>>>
>>> Rajendra
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
More information about the cfe-dev
mailing list