TypePrinter.cpp revision 4fb86f8c4585e53c21c847ad3de9e3b2de123cd9
1//===--- TypePrinter.cpp - Pretty-Print Clang Types -----------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This contains code to print types from Clang's type system.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Decl.h"
15#include "clang/AST/DeclObjC.h"
16#include "clang/AST/DeclTemplate.h"
17#include "clang/AST/Expr.h"
18#include "clang/AST/Type.h"
19#include "clang/AST/PrettyPrinter.h"
20#include "clang/Basic/LangOptions.h"
21#include "clang/Basic/SourceManager.h"
22#include "llvm/ADT/StringExtras.h"
23#include "llvm/Support/raw_ostream.h"
24using namespace clang;
25
26namespace {
27  class TypePrinter {
28    PrintingPolicy Policy;
29
30  public:
31    explicit TypePrinter(const PrintingPolicy &Policy) : Policy(Policy) { }
32
33    void print(const Type *ty, Qualifiers qs, std::string &buffer);
34    void print(QualType T, std::string &S);
35    void AppendScope(DeclContext *DC, std::string &S);
36    void printTag(TagDecl *T, std::string &S);
37#define ABSTRACT_TYPE(CLASS, PARENT)
38#define TYPE(CLASS, PARENT) \
39    void print##CLASS(const CLASS##Type *T, std::string &S);
40#include "clang/AST/TypeNodes.def"
41  };
42}
43
44static void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
45  if (TypeQuals & Qualifiers::Const) {
46    if (!S.empty()) S += ' ';
47    S += "const";
48  }
49  if (TypeQuals & Qualifiers::Volatile) {
50    if (!S.empty()) S += ' ';
51    S += "volatile";
52  }
53  if (TypeQuals & Qualifiers::Restrict) {
54    if (!S.empty()) S += ' ';
55    S += "restrict";
56  }
57}
58
59void TypePrinter::print(QualType t, std::string &buffer) {
60  SplitQualType split = t.split();
61  print(split.first, split.second, buffer);
62}
63
64void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
65  if (!T) {
66    buffer += "NULL TYPE";
67    return;
68  }
69
70  if (Policy.SuppressSpecifiers && T->isSpecifierType())
71    return;
72
73  // Print qualifiers as appropriate.
74
75  // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
76  // so that we get "const int" instead of "int const", but we can't do this if
77  // the type is complex.  For example if the type is "int*", we *must* print
78  // "int * const", printing "const int *" is different.  Only do this when the
79  // type expands to a simple string.
80  bool CanPrefixQualifiers = false;
81
82  Type::TypeClass TC = T->getTypeClass();
83  if (const AutoType *AT = dyn_cast<AutoType>(T))
84    TC = AT->desugar()->getTypeClass();
85  if (const SubstTemplateTypeParmType *Subst
86                                      = dyn_cast<SubstTemplateTypeParmType>(T))
87    TC = Subst->getReplacementType()->getTypeClass();
88
89  switch (TC) {
90    case Type::Builtin:
91    case Type::Complex:
92    case Type::UnresolvedUsing:
93    case Type::Typedef:
94    case Type::TypeOfExpr:
95    case Type::TypeOf:
96    case Type::Decltype:
97    case Type::Record:
98    case Type::Enum:
99    case Type::Elaborated:
100    case Type::TemplateTypeParm:
101    case Type::SubstTemplateTypeParmPack:
102    case Type::TemplateSpecialization:
103    case Type::InjectedClassName:
104    case Type::DependentName:
105    case Type::DependentTemplateSpecialization:
106    case Type::ObjCObject:
107    case Type::ObjCInterface:
108      CanPrefixQualifiers = true;
109      break;
110
111    case Type::ObjCObjectPointer:
112      CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
113        T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
114      break;
115
116    case Type::Pointer:
117    case Type::BlockPointer:
118    case Type::LValueReference:
119    case Type::RValueReference:
120    case Type::MemberPointer:
121    case Type::ConstantArray:
122    case Type::IncompleteArray:
123    case Type::VariableArray:
124    case Type::DependentSizedArray:
125    case Type::DependentSizedExtVector:
126    case Type::Vector:
127    case Type::ExtVector:
128    case Type::FunctionProto:
129    case Type::FunctionNoProto:
130    case Type::Paren:
131    case Type::Attributed:
132    case Type::PackExpansion:
133    case Type::SubstTemplateTypeParm:
134    case Type::Auto:
135      CanPrefixQualifiers = false;
136      break;
137  }
138
139  if (!CanPrefixQualifiers && !Quals.empty()) {
140    std::string qualsBuffer;
141    Quals.getAsStringInternal(qualsBuffer, Policy);
142
143    if (!buffer.empty()) {
144      qualsBuffer += ' ';
145      qualsBuffer += buffer;
146    }
147    std::swap(buffer, qualsBuffer);
148  }
149
150  switch (T->getTypeClass()) {
151#define ABSTRACT_TYPE(CLASS, PARENT)
152#define TYPE(CLASS, PARENT) case Type::CLASS: \
153    print##CLASS(cast<CLASS##Type>(T), buffer); \
154    break;
155#include "clang/AST/TypeNodes.def"
156  }
157
158  // If we're adding the qualifiers as a prefix, do it now.
159  if (CanPrefixQualifiers && !Quals.empty()) {
160    std::string qualsBuffer;
161    Quals.getAsStringInternal(qualsBuffer, Policy);
162
163    if (!buffer.empty()) {
164      qualsBuffer += ' ';
165      qualsBuffer += buffer;
166    }
167    std::swap(buffer, qualsBuffer);
168  }
169}
170
171void TypePrinter::printBuiltin(const BuiltinType *T, std::string &S) {
172  if (S.empty()) {
173    S = T->getName(Policy.LangOpts);
174  } else {
175    // Prefix the basic type, e.g. 'int X'.
176    S = ' ' + S;
177    S = T->getName(Policy.LangOpts) + S;
178  }
179}
180
181void TypePrinter::printComplex(const ComplexType *T, std::string &S) {
182  print(T->getElementType(), S);
183  S = "_Complex " + S;
184}
185
186void TypePrinter::printPointer(const PointerType *T, std::string &S) {
187  S = '*' + S;
188
189  // Handle things like 'int (*A)[4];' correctly.
190  // FIXME: this should include vectors, but vectors use attributes I guess.
191  if (isa<ArrayType>(T->getPointeeType()))
192    S = '(' + S + ')';
193
194  print(T->getPointeeType(), S);
195}
196
197void TypePrinter::printBlockPointer(const BlockPointerType *T, std::string &S) {
198  S = '^' + S;
199  print(T->getPointeeType(), S);
200}
201
202void TypePrinter::printLValueReference(const LValueReferenceType *T,
203                                       std::string &S) {
204  S = '&' + S;
205
206  // Handle things like 'int (&A)[4];' correctly.
207  // FIXME: this should include vectors, but vectors use attributes I guess.
208  if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
209    S = '(' + S + ')';
210
211  print(T->getPointeeTypeAsWritten(), S);
212}
213
214void TypePrinter::printRValueReference(const RValueReferenceType *T,
215                                       std::string &S) {
216  S = "&&" + S;
217
218  // Handle things like 'int (&&A)[4];' correctly.
219  // FIXME: this should include vectors, but vectors use attributes I guess.
220  if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
221    S = '(' + S + ')';
222
223  print(T->getPointeeTypeAsWritten(), S);
224}
225
226void TypePrinter::printMemberPointer(const MemberPointerType *T,
227                                     std::string &S) {
228  std::string C;
229  print(QualType(T->getClass(), 0), C);
230  C += "::*";
231  S = C + S;
232
233  // Handle things like 'int (Cls::*A)[4];' correctly.
234  // FIXME: this should include vectors, but vectors use attributes I guess.
235  if (isa<ArrayType>(T->getPointeeType()))
236    S = '(' + S + ')';
237
238  print(T->getPointeeType(), S);
239}
240
241void TypePrinter::printConstantArray(const ConstantArrayType *T,
242                                     std::string &S) {
243  S += '[';
244  S += llvm::utostr(T->getSize().getZExtValue());
245  S += ']';
246
247  print(T->getElementType(), S);
248}
249
250void TypePrinter::printIncompleteArray(const IncompleteArrayType *T,
251                                       std::string &S) {
252  S += "[]";
253  print(T->getElementType(), S);
254}
255
256void TypePrinter::printVariableArray(const VariableArrayType *T,
257                                     std::string &S) {
258  S += '[';
259
260  if (T->getIndexTypeQualifiers().hasQualifiers()) {
261    AppendTypeQualList(S, T->getIndexTypeCVRQualifiers());
262    S += ' ';
263  }
264
265  if (T->getSizeModifier() == VariableArrayType::Static)
266    S += "static";
267  else if (T->getSizeModifier() == VariableArrayType::Star)
268    S += '*';
269
270  if (T->getSizeExpr()) {
271    std::string SStr;
272    llvm::raw_string_ostream s(SStr);
273    T->getSizeExpr()->printPretty(s, 0, Policy);
274    S += s.str();
275  }
276  S += ']';
277
278  print(T->getElementType(), S);
279}
280
281void TypePrinter::printDependentSizedArray(const DependentSizedArrayType *T,
282                                           std::string &S) {
283  S += '[';
284
285  if (T->getSizeExpr()) {
286    std::string SStr;
287    llvm::raw_string_ostream s(SStr);
288    T->getSizeExpr()->printPretty(s, 0, Policy);
289    S += s.str();
290  }
291  S += ']';
292
293  print(T->getElementType(), S);
294}
295
296void TypePrinter::printDependentSizedExtVector(
297                                          const DependentSizedExtVectorType *T,
298                                               std::string &S) {
299  print(T->getElementType(), S);
300
301  S += " __attribute__((ext_vector_type(";
302  if (T->getSizeExpr()) {
303    std::string SStr;
304    llvm::raw_string_ostream s(SStr);
305    T->getSizeExpr()->printPretty(s, 0, Policy);
306    S += s.str();
307  }
308  S += ")))";
309}
310
311void TypePrinter::printVector(const VectorType *T, std::string &S) {
312  switch (T->getVectorKind()) {
313  case VectorType::AltiVecPixel:
314    S = "__vector __pixel " + S;
315    break;
316  case VectorType::AltiVecBool:
317    print(T->getElementType(), S);
318    S = "__vector __bool " + S;
319    break;
320  case VectorType::AltiVecVector:
321    print(T->getElementType(), S);
322    S = "__vector " + S;
323    break;
324  case VectorType::NeonVector:
325    print(T->getElementType(), S);
326    S = ("__attribute__((neon_vector_type(" +
327         llvm::utostr_32(T->getNumElements()) + "))) " + S);
328    break;
329  case VectorType::NeonPolyVector:
330    print(T->getElementType(), S);
331    S = ("__attribute__((neon_polyvector_type(" +
332         llvm::utostr_32(T->getNumElements()) + "))) " + S);
333    break;
334  case VectorType::GenericVector: {
335    // FIXME: We prefer to print the size directly here, but have no way
336    // to get the size of the type.
337    print(T->getElementType(), S);
338    std::string V = "__attribute__((__vector_size__(";
339    V += llvm::utostr_32(T->getNumElements()); // convert back to bytes.
340    std::string ET;
341    print(T->getElementType(), ET);
342    V += " * sizeof(" + ET + ")))) ";
343    S = V + S;
344    break;
345  }
346  }
347}
348
349void TypePrinter::printExtVector(const ExtVectorType *T, std::string &S) {
350  S += " __attribute__((ext_vector_type(";
351  S += llvm::utostr_32(T->getNumElements());
352  S += ")))";
353  print(T->getElementType(), S);
354}
355
356void TypePrinter::printFunctionProto(const FunctionProtoType *T,
357                                     std::string &S) {
358  // If needed for precedence reasons, wrap the inner part in grouping parens.
359  if (!S.empty())
360    S = "(" + S + ")";
361
362  S += "(";
363  std::string Tmp;
364  PrintingPolicy ParamPolicy(Policy);
365  ParamPolicy.SuppressSpecifiers = false;
366  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
367    if (i) S += ", ";
368    print(T->getArgType(i), Tmp);
369    S += Tmp;
370    Tmp.clear();
371  }
372
373  if (T->isVariadic()) {
374    if (T->getNumArgs())
375      S += ", ";
376    S += "...";
377  } else if (T->getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
378    // Do not emit int() if we have a proto, emit 'int(void)'.
379    S += "void";
380  }
381
382  S += ")";
383
384  FunctionType::ExtInfo Info = T->getExtInfo();
385  switch(Info.getCC()) {
386  case CC_Default:
387  default: break;
388  case CC_C:
389    S += " __attribute__((cdecl))";
390    break;
391  case CC_X86StdCall:
392    S += " __attribute__((stdcall))";
393    break;
394  case CC_X86FastCall:
395    S += " __attribute__((fastcall))";
396    break;
397  case CC_X86ThisCall:
398    S += " __attribute__((thiscall))";
399    break;
400  case CC_X86Pascal:
401    S += " __attribute__((pascal))";
402    break;
403  case CC_AAPCS:
404    S += " __attribute__((pcs(\"aapcs\")))";
405    break;
406  case CC_AAPCS_VFP:
407    S += " __attribute__((pcs(\"aapcs-vfp\")))";
408    break;
409  }
410  if (Info.getNoReturn())
411    S += " __attribute__((noreturn))";
412  if (Info.getRegParm())
413    S += " __attribute__((regparm (" +
414        llvm::utostr_32(Info.getRegParm()) + ")))";
415
416  AppendTypeQualList(S, T->getTypeQuals());
417
418  switch (T->getRefQualifier()) {
419  case RQ_None:
420    break;
421
422  case RQ_LValue:
423    S += " &";
424    break;
425
426  case RQ_RValue:
427    S += " &&";
428    break;
429  }
430
431  if (T->hasDynamicExceptionSpec()) {
432    S += " throw(";
433    if (T->getExceptionSpecType() == EST_MSAny)
434      S += "...";
435    else
436      for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I) {
437        if (I)
438          S += ", ";
439
440        std::string ExceptionType;
441        print(T->getExceptionType(I), ExceptionType);
442        S += ExceptionType;
443      }
444    S += ")";
445  } else if (isNoexceptExceptionSpec(T->getExceptionSpecType())) {
446    S += " noexcept";
447    if (T->getExceptionSpecType() == EST_ComputedNoexcept) {
448      S += "(";
449      llvm::raw_string_ostream EOut(S);
450      T->getNoexceptExpr()->printPretty(EOut, 0, Policy);
451      EOut.flush();
452      S += EOut.str();
453      S += ")";
454    }
455  }
456
457  print(T->getResultType(), S);
458}
459
460void TypePrinter::printFunctionNoProto(const FunctionNoProtoType *T,
461                                       std::string &S) {
462  // If needed for precedence reasons, wrap the inner part in grouping parens.
463  if (!S.empty())
464    S = "(" + S + ")";
465
466  S += "()";
467  if (T->getNoReturnAttr())
468    S += " __attribute__((noreturn))";
469  print(T->getResultType(), S);
470}
471
472static void printTypeSpec(const NamedDecl *D, std::string &S) {
473  IdentifierInfo *II = D->getIdentifier();
474  if (S.empty())
475    S = II->getName().str();
476  else
477    S = II->getName().str() + ' ' + S;
478}
479
480void TypePrinter::printUnresolvedUsing(const UnresolvedUsingType *T,
481                                       std::string &S) {
482  printTypeSpec(T->getDecl(), S);
483}
484
485void TypePrinter::printTypedef(const TypedefType *T, std::string &S) {
486  printTypeSpec(T->getDecl(), S);
487}
488
489void TypePrinter::printTypeOfExpr(const TypeOfExprType *T, std::string &S) {
490  if (!S.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
491    S = ' ' + S;
492  std::string Str;
493  llvm::raw_string_ostream s(Str);
494  T->getUnderlyingExpr()->printPretty(s, 0, Policy);
495  S = "typeof " + s.str() + S;
496}
497
498void TypePrinter::printTypeOf(const TypeOfType *T, std::string &S) {
499  if (!S.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
500    S = ' ' + S;
501  std::string Tmp;
502  print(T->getUnderlyingType(), Tmp);
503  S = "typeof(" + Tmp + ")" + S;
504}
505
506void TypePrinter::printDecltype(const DecltypeType *T, std::string &S) {
507  if (!S.empty())    // Prefix the basic type, e.g. 'decltype(t) X'.
508    S = ' ' + S;
509  std::string Str;
510  llvm::raw_string_ostream s(Str);
511  T->getUnderlyingExpr()->printPretty(s, 0, Policy);
512  S = "decltype(" + s.str() + ")" + S;
513}
514
515void TypePrinter::printAuto(const AutoType *T, std::string &S) {
516  // If the type has been deduced, do not print 'auto'.
517  if (T->isDeduced()) {
518    print(T->getDeducedType(), S);
519  } else {
520    if (!S.empty())    // Prefix the basic type, e.g. 'auto X'.
521      S = ' ' + S;
522    S = "auto" + S;
523  }
524}
525
526/// Appends the given scope to the end of a string.
527void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
528  if (DC->isTranslationUnit()) return;
529  AppendScope(DC->getParent(), Buffer);
530
531  unsigned OldSize = Buffer.size();
532
533  if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
534    if (NS->getIdentifier())
535      Buffer += NS->getNameAsString();
536    else
537      Buffer += "<anonymous>";
538  } else if (ClassTemplateSpecializationDecl *Spec
539               = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
540    const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
541    std::string TemplateArgsStr
542      = TemplateSpecializationType::PrintTemplateArgumentList(
543                                            TemplateArgs.data(),
544                                            TemplateArgs.size(),
545                                            Policy);
546    Buffer += Spec->getIdentifier()->getName();
547    Buffer += TemplateArgsStr;
548  } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
549    if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
550      Buffer += Typedef->getIdentifier()->getName();
551    else if (Tag->getIdentifier())
552      Buffer += Tag->getIdentifier()->getName();
553  }
554
555  if (Buffer.size() != OldSize)
556    Buffer += "::";
557}
558
559void TypePrinter::printTag(TagDecl *D, std::string &InnerString) {
560  if (Policy.SuppressTag)
561    return;
562
563  std::string Buffer;
564  bool HasKindDecoration = false;
565
566  // bool SuppressTagKeyword
567  //   = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
568
569  // We don't print tags unless this is an elaborated type.
570  // In C, we just assume every RecordType is an elaborated type.
571  if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
572        D->getTypedefNameForAnonDecl())) {
573    HasKindDecoration = true;
574    Buffer += D->getKindName();
575    Buffer += ' ';
576  }
577
578  // Compute the full nested-name-specifier for this type.
579  // In C, this will always be empty except when the type
580  // being printed is anonymous within other Record.
581  if (!Policy.SuppressScope)
582    AppendScope(D->getDeclContext(), Buffer);
583
584  if (const IdentifierInfo *II = D->getIdentifier())
585    Buffer += II->getNameStart();
586  else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
587    assert(Typedef->getIdentifier() && "Typedef without identifier?");
588    Buffer += Typedef->getIdentifier()->getNameStart();
589  } else {
590    // Make an unambiguous representation for anonymous types, e.g.
591    //   <anonymous enum at /usr/include/string.h:120:9>
592    llvm::raw_string_ostream OS(Buffer);
593    OS << "<anonymous";
594
595    if (Policy.AnonymousTagLocations) {
596      // Suppress the redundant tag keyword if we just printed one.
597      // We don't have to worry about ElaboratedTypes here because you can't
598      // refer to an anonymous type with one.
599      if (!HasKindDecoration)
600        OS << " " << D->getKindName();
601
602      PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
603          D->getLocation());
604      if (PLoc.isValid()) {
605        OS << " at " << PLoc.getFilename()
606           << ':' << PLoc.getLine()
607           << ':' << PLoc.getColumn();
608      }
609    }
610
611    OS << '>';
612  }
613
614  // If this is a class template specialization, print the template
615  // arguments.
616  if (ClassTemplateSpecializationDecl *Spec
617        = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
618    const TemplateArgument *Args;
619    unsigned NumArgs;
620    if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
621      const TemplateSpecializationType *TST =
622        cast<TemplateSpecializationType>(TAW->getType());
623      Args = TST->getArgs();
624      NumArgs = TST->getNumArgs();
625    } else {
626      const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
627      Args = TemplateArgs.data();
628      NumArgs = TemplateArgs.size();
629    }
630    Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
631                                                                    NumArgs,
632                                                                    Policy);
633  }
634
635  if (!InnerString.empty()) {
636    Buffer += ' ';
637    Buffer += InnerString;
638  }
639
640  std::swap(Buffer, InnerString);
641}
642
643void TypePrinter::printRecord(const RecordType *T, std::string &S) {
644  printTag(T->getDecl(), S);
645}
646
647void TypePrinter::printEnum(const EnumType *T, std::string &S) {
648  printTag(T->getDecl(), S);
649}
650
651void TypePrinter::printTemplateTypeParm(const TemplateTypeParmType *T,
652                                        std::string &S) {
653  if (!S.empty())    // Prefix the basic type, e.g. 'parmname X'.
654    S = ' ' + S;
655
656  if (IdentifierInfo *Id = T->getDecl() ? T->getDecl()->getIdentifier() : 0)
657    S = Id->getName().str() + S;
658  else
659    S = "type-parameter-" + llvm::utostr_32(T->getDepth()) + '-' +
660        llvm::utostr_32(T->getIndex()) + S;
661}
662
663void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T,
664                                             std::string &S) {
665  print(T->getReplacementType(), S);
666}
667
668void TypePrinter::printSubstTemplateTypeParmPack(
669                                        const SubstTemplateTypeParmPackType *T,
670                                             std::string &S) {
671  printTemplateTypeParm(T->getReplacedParameter(), S);
672}
673
674void TypePrinter::printTemplateSpecialization(
675                                            const TemplateSpecializationType *T,
676                                              std::string &S) {
677  std::string SpecString;
678
679  {
680    llvm::raw_string_ostream OS(SpecString);
681    T->getTemplateName().print(OS, Policy);
682  }
683
684  SpecString += TemplateSpecializationType::PrintTemplateArgumentList(
685                                                                  T->getArgs(),
686                                                                T->getNumArgs(),
687                                                                      Policy);
688  if (S.empty())
689    S.swap(SpecString);
690  else
691    S = SpecString + ' ' + S;
692}
693
694void TypePrinter::printInjectedClassName(const InjectedClassNameType *T,
695                                         std::string &S) {
696  printTemplateSpecialization(T->getInjectedTST(), S);
697}
698
699void TypePrinter::printElaborated(const ElaboratedType *T, std::string &S) {
700  std::string MyString;
701
702  {
703    llvm::raw_string_ostream OS(MyString);
704    OS << TypeWithKeyword::getKeywordName(T->getKeyword());
705    if (T->getKeyword() != ETK_None)
706      OS << " ";
707    NestedNameSpecifier* Qualifier = T->getQualifier();
708    if (Qualifier)
709      Qualifier->print(OS, Policy);
710  }
711
712  std::string TypeStr;
713  PrintingPolicy InnerPolicy(Policy);
714  InnerPolicy.SuppressTagKeyword = true;
715  InnerPolicy.SuppressScope = true;
716  TypePrinter(InnerPolicy).print(T->getNamedType(), TypeStr);
717
718  MyString += TypeStr;
719  if (S.empty())
720    S.swap(MyString);
721  else
722    S = MyString + ' ' + S;
723}
724
725void TypePrinter::printParen(const ParenType *T, std::string &S) {
726  if (!S.empty() && !isa<FunctionType>(T->getInnerType()))
727    S = '(' + S + ')';
728  print(T->getInnerType(), S);
729}
730
731void TypePrinter::printDependentName(const DependentNameType *T, std::string &S) {
732  std::string MyString;
733
734  {
735    llvm::raw_string_ostream OS(MyString);
736    OS << TypeWithKeyword::getKeywordName(T->getKeyword());
737    if (T->getKeyword() != ETK_None)
738      OS << " ";
739
740    T->getQualifier()->print(OS, Policy);
741
742    OS << T->getIdentifier()->getName();
743  }
744
745  if (S.empty())
746    S.swap(MyString);
747  else
748    S = MyString + ' ' + S;
749}
750
751void TypePrinter::printDependentTemplateSpecialization(
752        const DependentTemplateSpecializationType *T, std::string &S) {
753  std::string MyString;
754  {
755    llvm::raw_string_ostream OS(MyString);
756
757    OS << TypeWithKeyword::getKeywordName(T->getKeyword());
758    if (T->getKeyword() != ETK_None)
759      OS << " ";
760
761    if (T->getQualifier())
762      T->getQualifier()->print(OS, Policy);
763    OS << T->getIdentifier()->getName();
764    OS << TemplateSpecializationType::PrintTemplateArgumentList(
765                                                            T->getArgs(),
766                                                            T->getNumArgs(),
767                                                            Policy);
768  }
769
770  if (S.empty())
771    S.swap(MyString);
772  else
773    S = MyString + ' ' + S;
774}
775
776void TypePrinter::printPackExpansion(const PackExpansionType *T,
777                                     std::string &S) {
778  print(T->getPattern(), S);
779  S += "...";
780}
781
782void TypePrinter::printAttributed(const AttributedType *T,
783                                  std::string &S) {
784  // Prefer the macro forms of the GC qualifiers.
785  if (T->getAttrKind() == AttributedType::attr_objc_gc)
786    return print(T->getEquivalentType(), S);
787
788  print(T->getModifiedType(), S);
789
790  // TODO: not all attributes are GCC-style attributes.
791  S += " __attribute__((";
792  switch (T->getAttrKind()) {
793  case AttributedType::attr_address_space:
794    S += "address_space(";
795    S += T->getEquivalentType().getAddressSpace();
796    S += ")";
797    break;
798
799  case AttributedType::attr_vector_size: {
800    S += "__vector_size__(";
801    if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
802      S += vector->getNumElements();
803      S += " * sizeof(";
804
805      std::string tmp;
806      print(vector->getElementType(), tmp);
807      S += tmp;
808      S += ")";
809    }
810    S += ")";
811    break;
812  }
813
814  case AttributedType::attr_neon_vector_type:
815  case AttributedType::attr_neon_polyvector_type: {
816    if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
817      S += "neon_vector_type(";
818    else
819      S += "neon_polyvector_type(";
820    const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
821    S += llvm::utostr_32(vector->getNumElements());
822    S += ")";
823    break;
824  }
825
826  case AttributedType::attr_regparm: {
827    S += "regparm(";
828    QualType t = T->getEquivalentType();
829    while (!t->isFunctionType())
830      t = t->getPointeeType();
831    S += t->getAs<FunctionType>()->getRegParmType();
832    S += ")";
833    break;
834  }
835
836  case AttributedType::attr_objc_gc: {
837    S += "objc_gc(";
838
839    QualType tmp = T->getEquivalentType();
840    while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
841      QualType next = tmp->getPointeeType();
842      if (next == tmp) break;
843      tmp = next;
844    }
845
846    if (tmp.isObjCGCWeak())
847      S += "weak";
848    else
849      S += "strong";
850    S += ")";
851    break;
852  }
853
854  case AttributedType::attr_noreturn: S += "noreturn"; break;
855  case AttributedType::attr_cdecl: S += "cdecl"; break;
856  case AttributedType::attr_fastcall: S += "fastcall"; break;
857  case AttributedType::attr_stdcall: S += "stdcall"; break;
858  case AttributedType::attr_thiscall: S += "thiscall"; break;
859  case AttributedType::attr_pascal: S += "pascal"; break;
860  case AttributedType::attr_pcs: {
861   S += "pcs(";
862   QualType t = T->getEquivalentType();
863   while (!t->isFunctionType())
864     t = t->getPointeeType();
865   S += (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
866         "\"aapcs\"" : "\"aapcs-vfp\"");
867   S += ")";
868   break;
869  }
870  }
871  S += "))";
872}
873
874void TypePrinter::printObjCInterface(const ObjCInterfaceType *T,
875                                     std::string &S) {
876  if (!S.empty())    // Prefix the basic type, e.g. 'typedefname X'.
877    S = ' ' + S;
878
879  std::string ObjCQIString = T->getDecl()->getNameAsString();
880  S = ObjCQIString + S;
881}
882
883void TypePrinter::printObjCObject(const ObjCObjectType *T,
884                                  std::string &S) {
885  if (T->qual_empty())
886    return print(T->getBaseType(), S);
887
888  std::string tmp;
889  print(T->getBaseType(), tmp);
890  tmp += '<';
891  bool isFirst = true;
892  for (ObjCObjectType::qual_iterator
893         I = T->qual_begin(), E = T->qual_end(); I != E; ++I) {
894    if (isFirst)
895      isFirst = false;
896    else
897      tmp += ',';
898    tmp += (*I)->getNameAsString();
899  }
900  tmp += '>';
901
902  if (!S.empty()) {
903    tmp += ' ';
904    tmp += S;
905  }
906  std::swap(tmp, S);
907}
908
909void TypePrinter::printObjCObjectPointer(const ObjCObjectPointerType *T,
910                                         std::string &S) {
911  std::string ObjCQIString;
912
913  T->getPointeeType().getLocalQualifiers().getAsStringInternal(ObjCQIString,
914                                                               Policy);
915  if (!ObjCQIString.empty())
916    ObjCQIString += ' ';
917
918  if (T->isObjCIdType() || T->isObjCQualifiedIdType())
919    ObjCQIString += "id";
920  else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
921    ObjCQIString += "Class";
922  else if (T->isObjCSelType())
923    ObjCQIString += "SEL";
924  else
925    ObjCQIString += T->getInterfaceDecl()->getNameAsString();
926
927  if (!T->qual_empty()) {
928    ObjCQIString += '<';
929    for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(),
930                                              E = T->qual_end();
931         I != E; ++I) {
932      ObjCQIString += (*I)->getNameAsString();
933      if (I+1 != E)
934        ObjCQIString += ',';
935    }
936    ObjCQIString += '>';
937  }
938
939  if (!T->isObjCIdType() && !T->isObjCQualifiedIdType())
940    ObjCQIString += " *"; // Don't forget the implicit pointer.
941  else if (!S.empty()) // Prefix the basic type, e.g. 'typedefname X'.
942    S = ' ' + S;
943
944  S = ObjCQIString + S;
945}
946
947std::string TemplateSpecializationType::
948  PrintTemplateArgumentList(const TemplateArgumentListInfo &Args,
949                            const PrintingPolicy &Policy) {
950  return PrintTemplateArgumentList(Args.getArgumentArray(),
951                                   Args.size(),
952                                   Policy);
953}
954
955std::string
956TemplateSpecializationType::PrintTemplateArgumentList(
957                                                const TemplateArgument *Args,
958                                                unsigned NumArgs,
959                                                  const PrintingPolicy &Policy,
960                                                      bool SkipBrackets) {
961  std::string SpecString;
962  if (!SkipBrackets)
963    SpecString += '<';
964
965  for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
966    if (SpecString.size() > !SkipBrackets)
967      SpecString += ", ";
968
969    // Print the argument into a string.
970    std::string ArgString;
971    if (Args[Arg].getKind() == TemplateArgument::Pack) {
972      ArgString = PrintTemplateArgumentList(Args[Arg].pack_begin(),
973                                            Args[Arg].pack_size(),
974                                            Policy, true);
975    } else {
976      llvm::raw_string_ostream ArgOut(ArgString);
977      Args[Arg].print(Policy, ArgOut);
978    }
979
980    // If this is the first argument and its string representation
981    // begins with the global scope specifier ('::foo'), add a space
982    // to avoid printing the diagraph '<:'.
983    if (!Arg && !ArgString.empty() && ArgString[0] == ':')
984      SpecString += ' ';
985
986    SpecString += ArgString;
987  }
988
989  // If the last character of our string is '>', add another space to
990  // keep the two '>''s separate tokens. We don't *have* to do this in
991  // C++0x, but it's still good hygiene.
992  if (!SpecString.empty() && SpecString[SpecString.size() - 1] == '>')
993    SpecString += ' ';
994
995  if (!SkipBrackets)
996    SpecString += '>';
997
998  return SpecString;
999}
1000
1001// Sadly, repeat all that with TemplateArgLoc.
1002std::string TemplateSpecializationType::
1003PrintTemplateArgumentList(const TemplateArgumentLoc *Args, unsigned NumArgs,
1004                          const PrintingPolicy &Policy) {
1005  std::string SpecString;
1006  SpecString += '<';
1007  for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1008    if (SpecString.size() > 1)
1009      SpecString += ", ";
1010
1011    // Print the argument into a string.
1012    std::string ArgString;
1013    if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1014      ArgString = PrintTemplateArgumentList(
1015                                           Args[Arg].getArgument().pack_begin(),
1016                                            Args[Arg].getArgument().pack_size(),
1017                                            Policy, true);
1018    } else {
1019      llvm::raw_string_ostream ArgOut(ArgString);
1020      Args[Arg].getArgument().print(Policy, ArgOut);
1021    }
1022
1023    // If this is the first argument and its string representation
1024    // begins with the global scope specifier ('::foo'), add a space
1025    // to avoid printing the diagraph '<:'.
1026    if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1027      SpecString += ' ';
1028
1029    SpecString += ArgString;
1030  }
1031
1032  // If the last character of our string is '>', add another space to
1033  // keep the two '>''s separate tokens. We don't *have* to do this in
1034  // C++0x, but it's still good hygiene.
1035  if (SpecString[SpecString.size() - 1] == '>')
1036    SpecString += ' ';
1037
1038  SpecString += '>';
1039
1040  return SpecString;
1041}
1042
1043void QualType::dump(const char *msg) const {
1044  std::string R = "identifier";
1045  LangOptions LO;
1046  getAsStringInternal(R, PrintingPolicy(LO));
1047  if (msg)
1048    llvm::errs() << msg << ": ";
1049  llvm::errs() << R << "\n";
1050}
1051void QualType::dump() const {
1052  dump("");
1053}
1054
1055void Type::dump() const {
1056  QualType(this, 0).dump();
1057}
1058
1059std::string Qualifiers::getAsString() const {
1060  LangOptions LO;
1061  return getAsString(PrintingPolicy(LO));
1062}
1063
1064// Appends qualifiers to the given string, separated by spaces.  Will
1065// prefix a space if the string is non-empty.  Will not append a final
1066// space.
1067void Qualifiers::getAsStringInternal(std::string &S,
1068                                     const PrintingPolicy&) const {
1069  AppendTypeQualList(S, getCVRQualifiers());
1070  if (unsigned addrspace = getAddressSpace()) {
1071    if (!S.empty()) S += ' ';
1072    S += "__attribute__((address_space(";
1073    S += llvm::utostr_32(addrspace);
1074    S += ")))";
1075  }
1076  if (Qualifiers::GC gc = getObjCGCAttr()) {
1077    if (!S.empty()) S += ' ';
1078    if (gc == Qualifiers::Weak)
1079      S += "__weak";
1080    else
1081      S += "__strong";
1082  }
1083}
1084
1085std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1086  std::string buffer;
1087  LangOptions options;
1088  getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1089  return buffer;
1090}
1091
1092void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1093                                   std::string &buffer,
1094                                   const PrintingPolicy &policy) {
1095  TypePrinter(policy).print(ty, qs, buffer);
1096}
1097