| //===--- ExpectedTypes.h - Simplified C++ types -----------------*- C++-*--===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // A simplified model of C++ types that can be used to check whether they are | 
 | // convertible between each other for the purposes of code completion ranking | 
 | // without looking at the ASTs. Note that we don't aim to fully mimic the C++ | 
 | // conversion rules, merely try to have a model that gives useful improvements | 
 | // to the code completion ranking. | 
 | // | 
 | // We define an encoding of AST types as opaque strings, which can be stored in | 
 | // the index. Similar types (such as `int` and `long`) are folded together, | 
 | // forming equivalence classes with the same encoding. | 
 | //===----------------------------------------------------------------------===// | 
 | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_EXPECTED_TYPES_H | 
 | #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_EXPECTED_TYPES_H | 
 |  | 
 | #include "clang/AST/Type.h" | 
 | #include "llvm/ADT/StringRef.h" | 
 |  | 
 | namespace clang { | 
 | class CodeCompletionResult; | 
 |  | 
 | namespace clangd { | 
 | /// A representation of a type that can be computed based on clang AST and | 
 | /// compared for equality. The encoding is stable between different ASTs, this | 
 | /// allows the representation to be stored in the index and compared with types | 
 | /// coming from a different AST later. | 
 | /// OpaqueType is a strongly-typedefed std::string, you can get the underlying | 
 | /// string with raw(). | 
 | class OpaqueType { | 
 | public: | 
 |   /// Create a type from a code completion result. | 
 |   static llvm::Optional<OpaqueType> | 
 |   fromCompletionResult(ASTContext &Ctx, const CodeCompletionResult &R); | 
 |   /// Construct an instance from a clang::QualType. This is usually a | 
 |   /// PreferredType from a clang's completion context. | 
 |   static llvm::Optional<OpaqueType> fromType(ASTContext &Ctx, QualType Type); | 
 |  | 
 |   /// Get the raw byte representation of the type. You can only rely on the | 
 |   /// types being equal iff their raw representation is the same. The particular | 
 |   /// details of the used encoding might change over time and one should not | 
 |   /// rely on it. | 
 |   llvm::StringRef raw() const { return Data; } | 
 |  | 
 |   friend bool operator==(const OpaqueType &L, const OpaqueType &R) { | 
 |     return L.Data == R.Data; | 
 |   } | 
 |   friend bool operator!=(const OpaqueType &L, const OpaqueType &R) { | 
 |     return !(L == R); | 
 |   } | 
 |  | 
 | private: | 
 |   static llvm::Optional<OpaqueType> encode(ASTContext &Ctx, QualType Type); | 
 |   explicit OpaqueType(std::string Data); | 
 |  | 
 |   std::string Data; | 
 | }; | 
 | } // namespace clangd | 
 | } // namespace clang | 
 | #endif |