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