TypeLoc.h revision 9036d5e369aae65e3baccdeed74c796e3d367b3d
1b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===--- TypeLoc.h - Type Source Info Wrapper -------------------*- C++ -*-===// 2b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// 3b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 4b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// 5b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 6b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 7b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// 8b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 9b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// 10b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// This file defines the TypeLoc interface and subclasses. 11b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// 12b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 13b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 14b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_TYPELOC_H 15b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define LLVM_CLANG_AST_TYPELOC_H 16b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 17b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/Type.h" 18b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeVisitor.h" 19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 20b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace clang { 21b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis class ParmVarDecl; 22b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis class TypeSpecLoc; 23b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis class DeclaratorInfo; 24b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 25b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper for a particular "section" of type source info. 26b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// 27b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// A client should use the TypeLoc subclasses through cast/dyn_cast in order to 28b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// get at the actual information. 29b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeLoc { 30b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisprotected: 31b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis QualType Ty; 32b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Data; 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 35b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc() : Data(0) { } 36b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis TypeLoc(QualType ty, void *opaqueData) : Ty(ty), Data(opaqueData) { } 37b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 38b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis bool isNull() const { return Ty.isNull(); } 3919a97e27a545959ee9b395a96140661148a6b5b0Argyrios Kyrtzidis operator bool() const { return !isNull(); } 40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 41b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of type source info data block for the given type. 42b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static unsigned getFullDataSizeForType(QualType Ty); 43b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 44b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Get the type for which this source info wrapper provides 45b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// information. 46b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis QualType getSourceType() const { return Ty; } 47b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 48b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis /// \brief Get the pointer where source information is stored. 49b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis void *getOpaqueData() const { return Data; } 50b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis 5168006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis SourceRange getSourceRange() const; 5268006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis 53b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this TypeLoc. 54b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const; 55b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 56b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this TypeLoc and return its 57b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// SourceRange. 58b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getTypeSpecRange() const; 59b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 60b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 61b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const; 62b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 63b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the 64b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// TypeLoc is a PointerLoc and next TypeLoc is for "int". 65b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getNextTypeLoc() const; 66b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 67b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis friend bool operator==(const TypeLoc &LHS, const TypeLoc &RHS) { 68b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return LHS.Ty == RHS.Ty && LHS.Data == RHS.Data; 69b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 70b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 71b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis friend bool operator!=(const TypeLoc &LHS, const TypeLoc &RHS) { 72b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return !(LHS == RHS); 73b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 74b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 75b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL) { return true; } 76b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 77b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 78b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper of type source info data for type-spec types. 79b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeSpecLoc : public TypeLoc { 80b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 81b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 82b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeSpecLoc *TL) { return true; } 83b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 84b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 85b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper of type source info data for types part of a declarator, 86b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// excluding type-spec types. 87b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass DeclaratorLoc : public TypeLoc { 88b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 89b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this DeclaratorLoc. 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TypeSpecLoc getTypeSpecLoc() const; 91b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 92b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 93b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const DeclaratorLoc *TL) { return true; } 94b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 95b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 96b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief The default wrapper for type-spec types that are not handled by 97b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// another specific wrapper. 98b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass DefaultTypeSpecLoc : public TypeSpecLoc { 99b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 100b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation StartLoc; 101b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 104b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getStartLoc() const { 105b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->StartLoc; 106b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 107b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setStartLoc(SourceLocation Loc) { 108b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->StartLoc = Loc; 109b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 110b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 111b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getStartLoc(), getStartLoc()); 112b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 113b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 114b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 115b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 116b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 117b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 118b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 119b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { return getLocalDataSize(); } 120b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 121b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 122b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const DefaultTypeSpecLoc *TL) { return true; } 123b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 124b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 125b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for typedefs. 126b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypedefLoc : public TypeSpecLoc { 127b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 128b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation NameLoc; 129b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 130b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 131b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 132b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getNameLoc() const { 133b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->NameLoc; 134b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 135b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setNameLoc(SourceLocation Loc) { 136b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->NameLoc = Loc; 137b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 138b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 139b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getNameLoc(), getNameLoc()); 140b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1429036d5e369aae65e3baccdeed74c796e3d367b3dArgyrios Kyrtzidis TypedefDecl *getTypedefDecl() const { 1439036d5e369aae65e3baccdeed74c796e3d367b3dArgyrios Kyrtzidis return cast<TypedefType>(Ty)->getDecl(); 1449036d5e369aae65e3baccdeed74c796e3d367b3dArgyrios Kyrtzidis } 1459036d5e369aae65e3baccdeed74c796e3d367b3dArgyrios Kyrtzidis 146b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 147b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 148b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 149b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 150b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 151b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { return getLocalDataSize(); } 152b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 153b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 154b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypedefLoc *TL) { return true; } 155b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 156b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 157f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis/// \brief Wrapper for source info for ObjC protocol lists. 158f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidisclass ObjCProtocolListLoc : public TypeSpecLoc { 159f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis struct Info { 160f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceLocation LAngleLoc, RAngleLoc; 161f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis }; 162f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis // SourceLocations are stored after Info, one for each Protocol. 163f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceLocation *getProtocolLocArray() const { 164f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return reinterpret_cast<SourceLocation*>(static_cast<Info*>(Data) + 1); 165f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 166f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 167f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidispublic: 168f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceLocation getLAngleLoc() const { 169f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return static_cast<Info*>(Data)->LAngleLoc; 170f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 171f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis void setLAngleLoc(SourceLocation Loc) { 172f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis static_cast<Info*>(Data)->LAngleLoc = Loc; 173f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 174f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 175f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceLocation getRAngleLoc() const { 176f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return static_cast<Info*>(Data)->RAngleLoc; 177f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 178f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis void setRAngleLoc(SourceLocation Loc) { 179f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis static_cast<Info*>(Data)->RAngleLoc = Loc; 180f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 181f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 182f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis unsigned getNumProtocols() const { 183f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return cast<ObjCProtocolListType>(Ty)->getNumProtocols(); 184f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 185f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 186f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceLocation getProtocolLoc(unsigned i) const { 187f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis assert(i < getNumProtocols() && "Index is out of bounds!"); 188f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return getProtocolLocArray()[i]; 189f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 190f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis void setProtocolLoc(unsigned i, SourceLocation Loc) { 191f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis assert(i < getNumProtocols() && "Index is out of bounds!"); 192f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis getProtocolLocArray()[i] = Loc; 193f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 194f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 195f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis ObjCProtocolDecl *getProtocol(unsigned i) const { 196f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis assert(i < getNumProtocols() && "Index is out of bounds!"); 197f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return *(cast<ObjCProtocolListType>(Ty)->qual_begin() + i); 198f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 199f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 200f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis TypeLoc getBaseTypeLoc() const { 201f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 202f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return TypeLoc(cast<ObjCProtocolListType>(Ty)->getBaseType(), Next); 203f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 204f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 205f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis SourceRange getSourceRange() const { 206f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return SourceRange(getLAngleLoc(), getRAngleLoc()); 207f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 208f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 209f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 210f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis /// specific to this type. 211f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis unsigned getLocalDataSize() const { 212f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return sizeof(Info) + getNumProtocols() * sizeof(SourceLocation); 213f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 214f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 215f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 216f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis unsigned getFullDataSize() const { 217f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis return getLocalDataSize() + getBaseTypeLoc().getFullDataSize(); 218f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis } 219f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 220f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 221f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis static bool classof(const ObjCProtocolListLoc *TL) { return true; } 222f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis}; 223f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis 224b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for pointers. 225b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass PointerLoc : public DeclaratorLoc { 226b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 227b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation StarLoc; 228b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 229b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 230b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 231b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getStarLoc() const { 232b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->StarLoc; 233b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 234b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setStarLoc(SourceLocation Loc) { 235b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->StarLoc = Loc; 236b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 237b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 238b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 239b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 240b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<PointerType>(Ty)->getPointeeType(), Next); 241b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 242b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 243b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this PointerLoc. 244b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 245b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 246b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 247b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 248b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 249b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getStarLoc(), getStarLoc()); 250b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 251b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 252b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 253b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 254b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 255b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 256b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 257b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 258b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 259b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 260b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 261b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 262b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const PointerLoc *TL) { return true; } 263b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 264b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 265b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for block pointers. 266b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass BlockPointerLoc : public DeclaratorLoc { 267b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 268b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation CaretLoc; 269b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 270b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 271b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 272b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getCaretLoc() const { 273b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->CaretLoc; 274b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 275b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setCaretLoc(SourceLocation Loc) { 276b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->CaretLoc = Loc; 277b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 278b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 279b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 280b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 281b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<BlockPointerType>(Ty)->getPointeeType(), Next); 282b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 283b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 284b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this BlockPointerLoc. 285b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 286b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 287b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 288b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 289b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 290b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getCaretLoc(), getCaretLoc()); 291b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 292b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 293b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 294b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 295b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 296b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 297b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 298b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 299b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 300b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 301b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 302b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 303b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const BlockPointerLoc *TL) { return true; } 304b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 305b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 306b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for member pointers. 307b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass MemberPointerLoc : public DeclaratorLoc { 308b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 309b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation StarLoc; 310b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 311b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 312b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 313b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getStarLoc() const { 314b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->StarLoc; 315b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 316b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setStarLoc(SourceLocation Loc) { 317b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->StarLoc = Loc; 318b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 319b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 320b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 321b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 322b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<MemberPointerType>(Ty)->getPointeeType(), Next); 323b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 324b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 325b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this MemberPointerLoc. 326b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 327b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 328b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 329b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 330b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 331b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getStarLoc(), getStarLoc()); 332b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 333b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 334b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 335b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 336b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 337b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 338b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 339b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 340b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 341b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 342b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 343b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 344b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const MemberPointerLoc *TL) { return true; } 345b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 346b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 347b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for references. 348b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ReferenceLoc : public DeclaratorLoc { 349b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 350b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation AmpLoc; 351b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 352b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 353b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 354b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getAmpLoc() const { 355b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->AmpLoc; 356b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 357b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setAmpLoc(SourceLocation Loc) { 358b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->AmpLoc = Loc; 359b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 360b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 361b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 362b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 363b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<ReferenceType>(Ty)->getPointeeType(), Next); 364b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 365b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 366b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this ReferenceLoc. 367b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 368b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 369b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 370b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 371b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 372b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getAmpLoc(), getAmpLoc()); 373b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 374b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 375b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 376b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 377b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 378b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 379b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 380b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 381b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 382b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 383b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 384b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 385b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const ReferenceLoc *TL) { return true; } 386b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 387b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 388b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for functions. 389b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass FunctionLoc : public DeclaratorLoc { 390b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 391b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation LParenLoc, RParenLoc; 392b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 393b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis // ParmVarDecls* are stored after Info, one for each argument. 394b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ParmVarDecl **getParmArray() const { 395b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return reinterpret_cast<ParmVarDecl**>(static_cast<Info*>(Data) + 1); 396b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 397b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 398b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 399b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getLParenLoc() const { 400b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->LParenLoc; 401b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 402b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setLParenLoc(SourceLocation Loc) { 403b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->LParenLoc = Loc; 404b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 405b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 406b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getRParenLoc() const { 407b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->RParenLoc; 408b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 409b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setRParenLoc(SourceLocation Loc) { 410b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->RParenLoc = Loc; 411b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 412b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 413b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getNumArgs() const { 414b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis if (isa<FunctionNoProtoType>(Ty)) 415b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return 0; 416b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return cast<FunctionProtoType>(Ty)->getNumArgs(); 417b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 418b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ParmVarDecl *getArg(unsigned i) const { return getParmArray()[i]; } 419b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setArg(unsigned i, ParmVarDecl *VD) { getParmArray()[i] = VD; } 420b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 421b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getArgLoc(unsigned i) const; 422b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 423b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getResultLoc() const { 424b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 425b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<FunctionType>(Ty)->getResultType(), Next); 426b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 427b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 428b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this FunctionLoc. 429b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 430b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getResultLoc().getTypeSpecLoc(); 431b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 432b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 433b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getLParenLoc(), getRParenLoc()); 434b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 435b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 436b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 437b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 438b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { 439b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return sizeof(Info) + getNumArgs() * sizeof(ParmVarDecl*); 440b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 441b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 442b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 443b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 444b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getResultLoc().getFullDataSize(); 445b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 446b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 447b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 448b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const FunctionLoc *TL) { return true; } 449b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 450b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 451b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for arrays. 452b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ArrayLoc : public DeclaratorLoc { 453b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 454b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation LBracketLoc, RBracketLoc; 455b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis Expr *Size; 456b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 457b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 458b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getLBracketLoc() const { 459b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->LBracketLoc; 460b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 461b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setLBracketLoc(SourceLocation Loc) { 462b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->LBracketLoc = Loc; 463b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 464b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 465b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getRBracketLoc() const { 466b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->RBracketLoc; 467b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 468b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setRBracketLoc(SourceLocation Loc) { 469b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->RBracketLoc = Loc; 470b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 471b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 472b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis Expr *getSizeExpr() const { 473b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->Size; 474b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 475b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setSizeExpr(Expr *Size) { 476b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->Size = Size; 477b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 478b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 479b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getElementLoc() const { 480b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 481b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<ArrayType>(Ty)->getElementType(), Next); 482b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 483b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 484b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this ArrayLoc. 485b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 486b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getElementLoc().getTypeSpecLoc(); 487b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 488b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 489b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getLBracketLoc(), getRBracketLoc()); 490b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 491b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 492b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 493b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 494b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 495b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 496b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 497b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 498b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getElementLoc().getFullDataSize(); 499b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 500b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 501b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 502b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const ArrayLoc *TL) { return true; } 503b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 504b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 505b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define DISPATCH(CLASS) \ 506b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc)) 507b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 508b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void> 509b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeLocVisitor { 510b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> { 511b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ImplClass *Impl; 512b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc TyLoc; 513b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 514b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis public: 515b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { } 516b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS) 517b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) \ 518b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy Visit##TYPE(TYPE *) { \ 519b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \ 5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 521b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 522b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 523b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 524b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 525b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy Visit(TypeLoc TyLoc) { 526b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc); 527b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return TD.Visit(TyLoc.getSourceType().getTypePtr()); 528b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 529b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 530b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) { \ 531b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis DISPATCH(PARENT); \ 532b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 533b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 534b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 535b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 536b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 537b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 538b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#undef DISPATCH 539b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 540b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 541b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 542b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#endif 543