2 #include "clang/AST/ASTContext.h" 3 #include "clang/AST/Type.h" 4 #include "clang/Index/USRGeneration.h" 5 #include "clang/Sema/CodeCompleteConsumer.h" 6 #include "llvm/ADT/STLExtras.h" 12 static const Type *toEquivClass(ASTContext &
Ctx, QualType T) {
13 if (T.isNull() || T->isDependentType())
16 T = T.getCanonicalType().getNonReferenceType();
18 if (T->isBooleanType())
19 return Ctx.BoolTy.getTypePtr();
20 if (T->isIntegerType() && !T->isEnumeralType())
21 return Ctx.IntTy.getTypePtr();
22 if (T->isFloatingType() && !T->isComplexType())
23 return Ctx.FloatTy.getTypePtr();
27 return Ctx.getPointerType(QualType(T->getArrayElementTypeNoTypeQual(), 0))
31 return T.getTypePtr();
34 static llvm::Optional<QualType>
35 typeOfCompletion(
const CodeCompletionResult &R) {
36 auto *VD = dyn_cast_or_null<ValueDecl>(R.Declaration);
39 auto T = VD->getType();
42 if (
auto FuncT = T->getAs<FunctionType>()) {
47 return FuncT->getReturnType();
53 llvm::Optional<OpaqueType> OpaqueType::encode(ASTContext &Ctx, QualType T) {
56 const Type *C = toEquivClass(Ctx, T);
59 llvm::SmallString<128> Encoded;
60 if (index::generateUSRForType(QualType(C, 0), Ctx, Encoded))
62 return OpaqueType(Encoded.str());
65 OpaqueType::OpaqueType(std::string Data) : Data(std::move(Data)) {}
67 llvm::Optional<OpaqueType> OpaqueType::fromType(ASTContext &Ctx,
69 return encode(Ctx, Type);
72 llvm::Optional<OpaqueType>
73 OpaqueType::fromCompletionResult(ASTContext &Ctx,
74 const CodeCompletionResult &R) {
75 auto T = typeOfCompletion(R);
78 return encode(Ctx, *T);
Documents should not be synced at all.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//