TypeLoc.h revision 68006af18fb880cd8547ce797152111b810aa0ba
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 142b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 143b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 144b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 145b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 146b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 147b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { return getLocalDataSize(); } 148b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 149b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 150b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypedefLoc *TL) { return true; } 151b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 152b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 153b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for pointers. 154b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass PointerLoc : public DeclaratorLoc { 155b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 156b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation StarLoc; 157b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 158b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 159b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 160b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getStarLoc() const { 161b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->StarLoc; 162b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 163b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setStarLoc(SourceLocation Loc) { 164b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->StarLoc = Loc; 165b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 166b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 167b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 168b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 169b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<PointerType>(Ty)->getPointeeType(), Next); 170b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 171b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 172b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this PointerLoc. 173b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 174b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 175b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 176b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 177b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 178b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getStarLoc(), getStarLoc()); 179b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 180b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 181b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 182b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 183b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 184b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 185b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 186b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 187b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 188b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 189b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 190b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 191b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const PointerLoc *TL) { return true; } 192b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 193b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 194b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for block pointers. 195b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass BlockPointerLoc : public DeclaratorLoc { 196b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 197b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation CaretLoc; 198b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 199b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 200b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 201b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getCaretLoc() const { 202b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->CaretLoc; 203b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 204b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setCaretLoc(SourceLocation Loc) { 205b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->CaretLoc = Loc; 206b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 207b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 208b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 209b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 210b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<BlockPointerType>(Ty)->getPointeeType(), Next); 211b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 212b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 213b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this BlockPointerLoc. 214b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 215b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 216b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 217b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 218b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 219b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getCaretLoc(), getCaretLoc()); 220b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 221b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 222b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 223b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 224b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 225b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 226b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 227b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 228b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 229b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 230b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 231b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 232b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const BlockPointerLoc *TL) { return true; } 233b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 234b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 235b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for member pointers. 236b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass MemberPointerLoc : public DeclaratorLoc { 237b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 238b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation StarLoc; 239b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 240b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 241b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 242b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getStarLoc() const { 243b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->StarLoc; 244b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 245b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setStarLoc(SourceLocation Loc) { 246b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->StarLoc = Loc; 247b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 248b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 249b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 250b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 251b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<MemberPointerType>(Ty)->getPointeeType(), Next); 252b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 253b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 254b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this MemberPointerLoc. 255b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 256b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 257b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 258b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 259b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 260b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getStarLoc(), getStarLoc()); 261b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 262b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 263b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 264b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 265b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 266b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 267b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 268b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 269b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 270b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 271b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 272b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 273b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const MemberPointerLoc *TL) { return true; } 274b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 275b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 276b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for references. 277b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ReferenceLoc : public DeclaratorLoc { 278b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 279b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation AmpLoc; 280b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 281b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 282b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 283b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getAmpLoc() const { 284b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->AmpLoc; 285b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 286b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setAmpLoc(SourceLocation Loc) { 287b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->AmpLoc = Loc; 288b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 289b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 290b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getPointeeLoc() const { 291b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 292b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<ReferenceType>(Ty)->getPointeeType(), Next); 293b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 294b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 295b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this ReferenceLoc. 296b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 297b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getPointeeLoc().getTypeSpecLoc(); 298b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 299b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 300b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 301b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getAmpLoc(), getAmpLoc()); 302b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 303b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 304b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 305b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 306b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 307b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 308b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 309b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 310b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getPointeeLoc().getFullDataSize(); 311b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 312b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 313b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 314b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const ReferenceLoc *TL) { return true; } 315b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 316b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 317b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for functions. 318b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass FunctionLoc : public DeclaratorLoc { 319b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 320b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation LParenLoc, RParenLoc; 321b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 322b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis // ParmVarDecls* are stored after Info, one for each argument. 323b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ParmVarDecl **getParmArray() const { 324b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return reinterpret_cast<ParmVarDecl**>(static_cast<Info*>(Data) + 1); 325b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 326b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 327b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 328b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getLParenLoc() const { 329b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->LParenLoc; 330b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 331b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setLParenLoc(SourceLocation Loc) { 332b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->LParenLoc = Loc; 333b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 334b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 335b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getRParenLoc() const { 336b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->RParenLoc; 337b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 338b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setRParenLoc(SourceLocation Loc) { 339b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->RParenLoc = Loc; 340b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 341b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 342b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getNumArgs() const { 343b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis if (isa<FunctionNoProtoType>(Ty)) 344b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return 0; 345b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return cast<FunctionProtoType>(Ty)->getNumArgs(); 346b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 347b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ParmVarDecl *getArg(unsigned i) const { return getParmArray()[i]; } 348b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setArg(unsigned i, ParmVarDecl *VD) { getParmArray()[i] = VD; } 349b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 350b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getArgLoc(unsigned i) const; 351b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 352b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getResultLoc() const { 353b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 354b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<FunctionType>(Ty)->getResultType(), Next); 355b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 356b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 357b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this FunctionLoc. 358b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 359b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getResultLoc().getTypeSpecLoc(); 360b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 361b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 362b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getLParenLoc(), getRParenLoc()); 363b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 364b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 365b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 366b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 367b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { 368b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return sizeof(Info) + getNumArgs() * sizeof(ParmVarDecl*); 369b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 370b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 371b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 372b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 373b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getResultLoc().getFullDataSize(); 374b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 375b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 376b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 377b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const FunctionLoc *TL) { return true; } 378b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 379b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 380b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for arrays. 381b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ArrayLoc : public DeclaratorLoc { 382b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis struct Info { 383b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation LBracketLoc, RBracketLoc; 384b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis Expr *Size; 385b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 386b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 387b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getLBracketLoc() const { 388b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->LBracketLoc; 389b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 390b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setLBracketLoc(SourceLocation Loc) { 391b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->LBracketLoc = Loc; 392b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 393b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 394b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceLocation getRBracketLoc() const { 395b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->RBracketLoc; 396b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 397b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setRBracketLoc(SourceLocation Loc) { 398b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->RBracketLoc = Loc; 399b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 400b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 401b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis Expr *getSizeExpr() const { 402b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<Info*>(Data)->Size; 403b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 404b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void setSizeExpr(Expr *Size) { 405b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static_cast<Info*>(Data)->Size = Size; 406b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 407b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 408b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc getElementLoc() const { 409b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis void *Next = static_cast<char*>(Data) + getLocalDataSize(); 410b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis return TypeLoc(cast<ArrayType>(Ty)->getElementType(), Next); 411b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 412b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 413b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Find the TypeSpecLoc that is part of this ArrayLoc. 414b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeSpecLoc getTypeSpecLoc() const { 415b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getElementLoc().getTypeSpecLoc(); 416b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 417b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis SourceRange getSourceRange() const { 418b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return SourceRange(getLBracketLoc(), getRBracketLoc()); 419b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 420b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 421b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block that is 422b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// specific to this type. 423b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getLocalDataSize() const { return sizeof(Info); } 424b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 425b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis /// \brief Returns the size of the type source info data block. 426b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis unsigned getFullDataSize() const { 427b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return getLocalDataSize() + getElementLoc().getFullDataSize(); 428b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 429b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 430b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const TypeLoc *TL); 431b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis static bool classof(const ArrayLoc *TL) { return true; } 432b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 433b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 434b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define DISPATCH(CLASS) \ 435b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc)) 436b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 437b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void> 438b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeLocVisitor { 439b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> { 440b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis ImplClass *Impl; 441b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeLoc TyLoc; 442b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 443b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis public: 444b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { } 445b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS) 446b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) \ 447b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy Visit##TYPE(TYPE *) { \ 448b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \ 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 450b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 451b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis }; 452b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 453b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic: 454b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy Visit(TypeLoc TyLoc) { 455b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc); 456b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return TD.Visit(TyLoc.getSourceType().getTypePtr()); 457b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis } 458b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 459b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) { \ 460b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis DISPATCH(PARENT); \ 461b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 462b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 463b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 464b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 465b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}; 466b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 467b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#undef DISPATCH 468b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 469b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 470b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 471b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#endif 472