10#include "llvm/ADT/IndexedMap.h"
11#include <initializer_list>
24struct BlockIdToIndexFunctor {
25 using argument_type = unsigned;
26 unsigned operator()(
unsigned ID)
const {
return ID -
BI_FIRST; }
29struct RecordIdToIndexFunctor {
30 using argument_type = unsigned;
31 unsigned operator()(
unsigned ID)
const {
return ID -
RI_FIRST; }
34using AbbrevDsc = void (*)(std::shared_ptr<BitCodeAbbrev> &Abbrev);
38 const std::initializer_list<BitCodeAbbrevOp> Ops) {
39 for (
const auto &Op : Ops)
63 BitCodeAbbrevOp(BitCodeAbbrevOp::Array),
64 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
71 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
74 BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)});
82 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
85 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
90 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
93 BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)});
98 RecordIdDsc() =
default;
99 constexpr RecordIdDsc(StringRef Name, AbbrevDsc Abbrev)
100 : Name(Name), Abbrev(Abbrev) {}
103 explicit operator bool()
const {
104 return Abbrev !=
nullptr && Name.data() !=
nullptr && !Name.empty();
108 AbbrevDsc Abbrev =
nullptr;
111static const IndexedMap<StringRef, BlockIdToIndexFunctor> BlockIdNameMap =
113 IndexedMap<StringRef, BlockIdToIndexFunctor> BlockIdNameMap;
118 static constexpr std::pair<BlockId, StringRef> IdToName[] = {
139 ArrayRef<std::pair<BlockId, StringRef>> Inits(IdToName);
141 for (
const auto &Init : Inits)
142 BlockIdNameMap[Init.first] = Init.second;
144 return BlockIdNameMap;
147static const IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> RecordIdNameMap =
149 IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> RecordIdNameMap;
154 static constexpr std::pair<RecordId, RecordIdDsc> IdToFunc[] = {
240 ArrayRef<std::pair<RecordId, RecordIdDsc>> Inits(IdToFunc);
242 for (
const auto &Init : Inits) {
243 RecordIdNameMap[Init.first] = Init.second;
247 return RecordIdNameMap;
250struct BlockToIdList {
252 std::initializer_list<RecordId> RIDs;
255static const BlockToIdList RecordsByBlock[] = {
322void ClangDocBitcodeWriter::AbbreviationMap::add(
RecordId RID,
324 assert(RecordIdNameMap[RID] &&
"Unknown RecordId.");
325 assert(!Abbrevs.contains(RID) &&
"Abbreviation already added.");
326 Abbrevs[RID] = AbbrevID;
329unsigned ClangDocBitcodeWriter::AbbreviationMap::get(
RecordId RID)
const {
330 assert(RecordIdNameMap[RID] &&
"Unknown RecordId.");
331 assert(Abbrevs.contains(RID) &&
"Unknown abbreviation.");
332 return Abbrevs.lookup(RID);
339void ClangDocBitcodeWriter::emitHeader() {
344void ClangDocBitcodeWriter::emitVersionBlock() {
350void ClangDocBitcodeWriter::emitBlockID(
BlockId BID) {
351 const auto &BlockIdName = BlockIdNameMap[BID];
352 assert(BlockIdName.data() && BlockIdName.size() &&
"Unknown BlockId.");
355 Record.push_back(BID);
356 Stream.EmitRecord(bitc::BLOCKINFO_CODE_SETBID, Record);
357 Stream.EmitRecord(bitc::BLOCKINFO_CODE_BLOCKNAME,
358 ArrayRef<unsigned char>(BlockIdName.bytes_begin(),
359 BlockIdName.bytes_end()));
363void ClangDocBitcodeWriter::emitRecordID(
RecordId ID) {
364 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
366 Record.append(RecordIdNameMap[ID].Name.begin(),
367 RecordIdNameMap[ID].Name.end());
368 Stream.EmitRecord(bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
374 assert(RecordIdNameMap[ID] &&
"Unknown abbreviation.");
375 auto Abbrev = std::make_shared<BitCodeAbbrev>();
376 Abbrev->Add(BitCodeAbbrevOp(ID));
377 RecordIdNameMap[ID].Abbrev(Abbrev);
378 Abbrevs.add(ID, Stream.EmitBlockInfoAbbrev(Block, std::move(Abbrev)));
384 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
386 "Abbrev type mismatch.");
387 if (!prepRecordData(ID, Sym !=
EmptySID))
389 assert(Sym.size() == 20);
390 Record.push_back(Sym.size());
391 Record.append(Sym.begin(), Sym.end());
392 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
395void ClangDocBitcodeWriter::emitRecord(StringRef Str,
RecordId ID) {
396 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
398 "Abbrev type mismatch.");
399 if (!prepRecordData(ID, !Str.empty()))
402 Record.push_back(Str.size());
403 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Str);
406void ClangDocBitcodeWriter::emitRecord(
const Location &Loc,
RecordId ID) {
407 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
409 "Abbrev type mismatch.");
410 if (!prepRecordData(ID,
true))
417 Record.push_back(Loc.
Filename.size());
418 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Loc.
Filename);
421void ClangDocBitcodeWriter::emitRecord(
bool Val,
RecordId ID) {
422 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
424 "Abbrev type mismatch.");
425 if (!prepRecordData(ID, Val))
427 Record.push_back(Val);
428 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
431void ClangDocBitcodeWriter::emitRecord(
int Val,
RecordId ID) {
432 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
434 "Abbrev type mismatch.");
435 if (!prepRecordData(ID, Val))
438 Record.push_back(Val);
439 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
442void ClangDocBitcodeWriter::emitRecord(
unsigned Val,
RecordId ID) {
443 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
445 "Abbrev type mismatch.");
446 if (!prepRecordData(ID, Val))
449 Record.push_back(Val);
450 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
453void ClangDocBitcodeWriter::emitRecord(
const TemplateInfo &Templ) {}
455bool ClangDocBitcodeWriter::prepRecordData(
RecordId ID,
bool ShouldEmit) {
456 assert(RecordIdNameMap[ID] &&
"Unknown RecordId.");
460 Record.push_back(ID);
466void ClangDocBitcodeWriter::emitBlockInfoBlock() {
467 Stream.EnterBlockInfoBlock();
468 for (
const auto &Block : RecordsByBlock) {
470 emitBlockInfo(Block.BID, Block.RIDs);
475void ClangDocBitcodeWriter::emitBlockInfo(
BlockId BID,
476 ArrayRef<RecordId> RIDs) {
481 emitAbbrev(RID, BID);
506 for (
const auto &P : R.
Params)
525 for (
const auto &N : T.Namespace)
527 for (
const auto &CI : T.Description)
555 for (
const auto &CI : T.Description)
563 for (
const auto &L : std::vector<std::pair<StringRef, RecordId>>{
569 emitRecord(L.first, L.second);
576 for (
const auto &A : I.
Args)
618 for (
const auto &L : I.
Loc)
623 for (
const auto &N : I.
Members)
649 for (
const auto &L : I.
Loc)
653 for (
const auto &N : I.
Members)
655 for (
const auto &P : I.
Parents)
659 for (
const auto &PB : I.
Bases)
671 for (
const auto &C : I.
Friends)
684 for (
const auto &M : I.
Members)
703 for (
const auto &L : I.
Loc)
707 for (
const auto &N : I.
Params)
728 for (
const auto &P : T.Params)
730 if (T.Specialization)
732 for (
const auto &C : T.Constraints)
739 for (
const auto &P : T.Params)
795 unsigned ID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
796 "Unexpected info, unable to write.");
static void genLocationAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev)
static void genBoolAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev)
static void genSymbolIdAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev)
static void genIntAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev)
static void generateAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev, const std::initializer_list< BitCodeAbbrevOp > Ops)
static void genStringAbbrev(std::shared_ptr< BitCodeAbbrev > &Abbrev)
void emitBlock(const NamespaceInfo &I)
bool dispatchInfoForWrite(Info *I)
@ TEMPLATE_SPECIALIZATION_OF
@ MEMBER_TYPE_IS_TEMPLATE
@ TEMPLATE_PARAM_CONTENTS
@ CONCEPT_CONSTRAINT_EXPRESSION
static constexpr unsigned BlockIdCount
static const unsigned VersionNumber
static constexpr unsigned RecordIdCount
std::array< uint8_t, 20 > SymbolID
llvm::StringRef commentKindToString(CommentKind Kind)
@ BI_TEMPLATE_SPECIALIZATION_BLOCK_ID
@ BI_TEMPLATE_PARAM_BLOCK_ID
@ BI_MEMBER_TYPE_BLOCK_ID
@ BI_BASE_RECORD_BLOCK_ID
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Some operations such as code completion produce a set of candidates.
static constexpr unsigned BoolSize
static constexpr unsigned LineNumberSize
static constexpr unsigned RecordSize
static constexpr unsigned StringLengthSize
static constexpr unsigned USRBitLengthSize
static constexpr unsigned char Signature[4]
static constexpr unsigned IntSize
static constexpr unsigned SignatureBitSize
static constexpr unsigned SubblockIDSize
static constexpr unsigned USRLengthSize
StringRef ConstraintExpression
llvm::ArrayRef< EnumValueInfo > Members
std::optional< TypeInfo > BaseType
DocList< CommentInfo > Description
Comment description of this field.
std::optional< TypeInfo > ReturnType
llvm::ArrayRef< FieldTypeInfo > Params
std::optional< TemplateInfo > Template
llvm::ArrayRef< FieldTypeInfo > Params
std::optional< TemplateInfo > Template
DocList< CommentInfo > Description
llvm::ArrayRef< Reference > Namespace
llvm::ArrayRef< BaseRecordInfo > Bases
llvm::ArrayRef< FriendInfo > Friends
llvm::ArrayRef< Reference > VirtualParents
std::optional< TemplateInfo > Template
llvm::ArrayRef< Reference > Parents
llvm::ArrayRef< MemberTypeInfo > Members
StringRef DocumentationFileName
DocList< Reference > Records
DocList< EnumInfo > Enums
DocList< ConceptInfo > Concepts
DocList< VarInfo > Variables
DocList< FunctionInfo > Functions
DocList< Reference > Namespaces
DocList< TypedefInfo > Typedefs
std::optional< Location > DefLoc