本文整理汇总了C++中TypeLoc::getTypePtr方法的典型用法代码示例。如果您正苦于以下问题:C++ TypeLoc::getTypePtr方法的具体用法?C++ TypeLoc::getTypePtr怎么用?C++ TypeLoc::getTypePtr使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TypeLoc
的用法示例。
在下文中一共展示了TypeLoc::getTypePtr方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getVarDeclTypeLocEnd
SourceLocation RewriteUtils::getVarDeclTypeLocEnd(const VarDecl *VD)
{
TypeLoc VarTypeLoc = VD->getTypeSourceInfo()->getTypeLoc();
const IdentifierInfo *Id = VD->getType().getBaseTypeIdentifier();
// handle a special case shown as below:
// x;
// *y[];
// (*z)[];
// void foo(void) {...}
// where x implicitly has type of int, whereas y has type of int *
if (!Id) {
SourceLocation EndLoc = VD->getLocation();
const char *Buf = SrcManager->getCharacterData(EndLoc);
int Offset = -1;
SourceLocation NewEndLoc = EndLoc.getLocWithOffset(Offset);
if (!NewEndLoc.isValid())
return EndLoc;
Buf--;
while (isspace(*Buf) || (*Buf == '*') || (*Buf == '(')) {
Offset--;
NewEndLoc = EndLoc.getLocWithOffset(Offset);
if (!NewEndLoc.isValid())
return EndLoc.getLocWithOffset(Offset+1);
Buf--;
}
return EndLoc.getLocWithOffset(Offset+1);
}
TypeLoc NextTL = VarTypeLoc.getNextTypeLoc();
while (!NextTL.isNull()) {
VarTypeLoc = NextTL;
NextTL = NextTL.getNextTypeLoc();
}
SourceRange TypeLocRange = VarTypeLoc.getSourceRange();
SourceLocation EndLoc = getEndLocationFromBegin(TypeLocRange);
TransAssert(EndLoc.isValid() && "Invalid EndLoc!");
const Type *Ty = VarTypeLoc.getTypePtr();
// I am not sure why, but for a declaration like below:
// unsigned int a; (or long long a;)
// TypeLoc.getBeginLoc() returns the position of 'u'
// TypeLoc.getEndLoc() also returns the position of 'u'
// The size of TypeLoc.getSourceRange() is 8, which is the
// length of "unsigned"
// Then we are getting trouble, because now EndLoc is right
// after 'd', but we need it points to the location after "int".
// skipPossibleTypeRange corrects the above deviation
// Or am I doing something horrible here?
EndLoc = skipPossibleTypeRange(Ty, EndLoc, VD->getLocation());
return EndLoc;
}
示例2: Extend
void NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
SourceLocation TemplateKWLoc,
TypeLoc TL,
SourceLocation ColonColonLoc) {
Representation = NestedNameSpecifier::Create(Context, Representation,
TemplateKWLoc.isValid(),
TL.getTypePtr());
// Push source-location info into the buffer.
SavePointer(TL.getOpaqueData(), Buffer, BufferSize, BufferCapacity);
SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
}
示例3: processTypeLoc
void TypeRenameTransform::processTypeLoc(TypeLoc TL, bool forceRewriteMacro)
{
if (TL.isNull()) {
return;
}
auto BL = TL.getBeginLoc();
// ignore system headers
if (shouldIgnore(BL)) {
return;
}
// is a result from macro expansion? sorry...
if (BL.isMacroID() && !forceRewriteMacro) {
llvm::errs() << "Cannot rename type from macro expansion at: " << loc(BL) << "\n";
return;
}
// TODO: Take care of spelling loc finesses
// BL = sema->getSourceManager().getSpellingLoc(BL);
pushIndent();
auto QT = TL.getType();
// llvm::errs() << indent()
// << "TypeLoc"
// << ", typeLocClass: " << typeLocClassName(TL.getTypeLocClass())
// << "\n" << indent() << "qualType as str: " << QT.getAsString()
// << "\n" << indent() << "beginLoc: " << loc(TL.getBeginLoc())
// << "\n";
switch(TL.getTypeLocClass()) {
case TypeLoc::FunctionProto:
{
if (auto FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
for (unsigned I = 0, E = FTL->getNumArgs(); I != E; ++I) {
processParmVarDecl(FTL->getArg(I));
}
}
break;
}
// an elaborated type loc captures the "prefix" of a type
// for example, the elaborated type loc of "A::B::C" is A::B
// we need to know if A::B and A are types we are renaming
// (so that we can handle nested classes, in-class typedefs, etc.)
case TypeLoc::Elaborated:
{
if (auto ETL = dyn_cast<ElaboratedTypeLoc>(&TL)) {
processQualifierLoc(ETL->getQualifierLoc(), forceRewriteMacro);
}
break;
}
case TypeLoc::ObjCObject:
{
if (auto OT = dyn_cast<ObjCObjectTypeLoc>(&TL)) {
for (unsigned I = 0, E = OT->getNumProtocols(); I != E; ++I) {
if (auto P = OT->getProtocol(I)) {
std::string newName;
if (nameMatches(P, newName, true)) {
renameLocation(OT->getProtocolLoc(I), newName);
}
}
}
}
break;
}
case TypeLoc::InjectedClassName:
{
if (auto TSTL = dyn_cast<InjectedClassNameTypeLoc>(&TL)) {
auto CD = TSTL->getDecl();
std::string newName;
if (nameMatches(CD, newName, true)) {
renameLocation(BL, newName);
}
}
break;
}
case TypeLoc::TemplateSpecialization:
{
if (auto TSTL = dyn_cast<TemplateSpecializationTypeLoc>(&TL)) {
// See if it's the template name that needs renaming
auto T = TL.getTypePtr();
if (auto TT = dyn_cast<TemplateSpecializationType>(T)) {
auto TN = TT->getTemplateName();
auto TD = TN.getAsTemplateDecl();
auto TTD = TD->getTemplatedDecl();
std::string newName;
if (nameMatches(TTD, newName, true)) {
renameLocation(TSTL->getTemplateNameLoc(), newName);
}
}
// iterate through the args
//.........这里部分代码省略.........