Home | History | Annotate | Download | only in Core
      1 //===--- QualTypeNames.h - Generate Complete QualType Names ----*- C++ -*-===//
      2 //
      3 // This file is distributed under the University of Illinois Open Source
      4 // License. See LICENSE.TXT for details.
      5 //
      6 // ===----------------------------------------------------------------------===//
      7 //
      8 // \file
      9 // Functionality to generate the fully-qualified names of QualTypes,
     10 // including recursively expanding any subtypes and template
     11 // parameters.
     12 //
     13 // More precisely: Generates a name that can be used to name the same
     14 // type if used at the end of the current translation unit--with
     15 // certain limitations. See below.
     16 //
     17 // This code desugars names only very minimally, so in this code:
     18 //
     19 // namespace A {
     20 //   struct X {};
     21 // }
     22 // using A::X;
     23 // namespace B {
     24 //   using std::tuple;
     25 //   typedef tuple<X> TX;
     26 //   TX t;
     27 // }
     28 //
     29 // B::t's type is reported as "B::TX", rather than std::tuple<A::X>.
     30 //
     31 // Also, this code replaces types found via using declarations with
     32 // their more qualified name, so for the code:
     33 //
     34 // using std::tuple;
     35 // tuple<int> TInt;
     36 //
     37 // TInt's type will be named, "std::tuple<int>".
     38 //
     39 // Limitations:
     40 //
     41 // Some types have ambiguous names at the end of a translation unit,
     42 // are not namable at all there, or are special cases in other ways.
     43 //
     44 // 1) Types with only local scope will have their local names:
     45 //
     46 // void foo() {
     47 //   struct LocalType {} LocalVar;
     48 // }
     49 //
     50 // LocalVar's type will be named, "struct LocalType", without any
     51 // qualification.
     52 //
     53 // 2) Types that have been shadowed are reported normally, but a
     54 // client using that name at the end of the translation unit will be
     55 // referring to a different type.
     56 //
     57 // ===----------------------------------------------------------------------===//
     58 
     59 #ifndef LLVM_CLANG_TOOLING_CORE_QUALTYPENAMES_H
     60 #define LLVM_CLANG_TOOLING_CORE_QUALTYPENAMES_H
     61 
     62 #include "clang/AST/ASTContext.h"
     63 
     64 namespace clang {
     65 namespace TypeName {
     66 /// \brief Get the fully qualified name for a type. This includes full
     67 /// qualification of all template parameters etc.
     68 ///
     69 /// \param[in] QT - the type for which the fully qualified name will be
     70 /// returned.
     71 /// \param[in] Ctx - the ASTContext to be used.
     72 /// \param[in] WithGlobalNsPrefix - If true, then the global namespace
     73 /// specifier "::" will be prepended to the fully qualified name.
     74 std::string getFullyQualifiedName(QualType QT,
     75                                   const ASTContext &Ctx,
     76                                   bool WithGlobalNsPrefix = false);
     77 }  // end namespace TypeName
     78 }  // end namespace clang
     79 #endif  // LLVM_CLANG_TOOLING_CORE_QUALTYPENAMES_H
     80