diff options
author | Erick Velez <erickvelez7@gmail.com> | 2025-06-30 12:43:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-30 12:43:52 -0700 |
commit | a68e4470c16b4d45f78b6f69f59013c89bdf7ec2 (patch) | |
tree | fcdeb24e90c8f3d9dfa3e1c0f1cd91d53346b3f7 /clang-tools-extra/clang-doc/BitcodeReader.cpp | |
parent | 96b9b2e21de466490ba733a23e8bb6cbd39ad58c (diff) | |
download | llvm-a68e4470c16b4d45f78b6f69f59013c89bdf7ec2.zip llvm-a68e4470c16b4d45f78b6f69f59013c89bdf7ec2.tar.gz llvm-a68e4470c16b4d45f78b6f69f59013c89bdf7ec2.tar.bz2 |
[clang-doc] serialize friends (#146165)
Parse friends into a new FriendInfo and serialize them in JSON. We keep track of the friend declaration's template and function information if applicable.
Diffstat (limited to 'clang-tools-extra/clang-doc/BitcodeReader.cpp')
-rw-r--r-- | clang-tools-extra/clang-doc/BitcodeReader.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp index fd6f40c..2cbf8bf 100644 --- a/clang-tools-extra/clang-doc/BitcodeReader.cpp +++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp @@ -94,6 +94,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType &Field, case InfoType::IT_typedef: case InfoType::IT_concept: case InfoType::IT_variable: + case InfoType::IT_friend: Field = IT; return llvm::Error::success(); } @@ -111,6 +112,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId &Field, case FieldId::F_child_namespace: case FieldId::F_child_record: case FieldId::F_concept: + case FieldId::F_friend: case FieldId::F_default: Field = F; return llvm::Error::success(); @@ -450,6 +452,15 @@ static llvm::Error parseRecord(const Record &R, unsigned ID, } } +static llvm::Error parseRecord(const Record &R, unsigned ID, StringRef Blob, + FriendInfo *F) { + if (ID == FRIEND_IS_CLASS) { + return decodeRecord(R, F->IsClass, Blob); + } + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "invalid field for Friend"); +} + template <typename T> static llvm::Expected<CommentInfo *> getCommentInfo(T I) { return llvm::createStringError(llvm::inconvertibleErrorCode(), "invalid type cannot contain CommentInfo"); @@ -525,6 +536,18 @@ template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) { return llvm::Error::success(); } +template <> llvm::Error addTypeInfo(FriendInfo *I, FieldTypeInfo &&T) { + if (!I->Params) + I->Params.emplace(); + I->Params->emplace_back(std::move(T)); + return llvm::Error::success(); +} + +template <> llvm::Error addTypeInfo(FriendInfo *I, TypeInfo &&T) { + I->ReturnType.emplace(std::move(T)); + return llvm::Error::success(); +} + template <> llvm::Error addTypeInfo(EnumInfo *I, TypeInfo &&T) { I->BaseType = std::move(T); return llvm::Error::success(); @@ -667,6 +690,16 @@ llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) { "ConstraintInfo cannot contain this Reference"); } +template <> +llvm::Error addReference(FriendInfo *Friend, Reference &&R, FieldId F) { + if (F == FieldId::F_friend) { + Friend->Ref = std::move(R); + return llvm::Error::success(); + } + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Friend cannot contain this Reference"); +} + template <typename T, typename ChildInfoType> static void addChild(T I, ChildInfoType &&R) { llvm::errs() << "invalid child type for info"; @@ -700,6 +733,9 @@ template <> void addChild(RecordInfo *I, EnumInfo &&R) { template <> void addChild(RecordInfo *I, TypedefInfo &&R) { I->Children.Typedefs.emplace_back(std::move(R)); } +template <> void addChild(RecordInfo *I, FriendInfo &&R) { + I->Friends.emplace_back(std::move(R)); +} // Other types of children: template <> void addChild(EnumInfo *I, EnumValueInfo &&R) { @@ -741,6 +777,9 @@ template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) { template <> void addTemplate(ConceptInfo *I, TemplateInfo &&P) { I->Template = std::move(P); } +template <> void addTemplate(FriendInfo *I, TemplateInfo &&P) { + I->Template.emplace(std::move(P)); +} // Template specializations go only into template records. template <typename T> @@ -921,6 +960,10 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) { case BI_VAR_BLOCK_ID: { return handleSubBlock<VarInfo>(ID, I, CreateAddFunc(addChild<T, VarInfo>)); } + case BI_FRIEND_BLOCK_ID: { + return handleSubBlock<FriendInfo>(ID, I, + CreateAddFunc(addChild<T, FriendInfo>)); + } default: return llvm::createStringError(llvm::inconvertibleErrorCode(), "invalid subblock type"); @@ -1032,6 +1075,8 @@ ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { return createInfo<FunctionInfo>(ID); case BI_VAR_BLOCK_ID: return createInfo<VarInfo>(ID); + case BI_FRIEND_BLOCK_ID: + return createInfo<FriendInfo>(ID); default: return llvm::createStringError(llvm::inconvertibleErrorCode(), "cannot create info"); @@ -1072,6 +1117,7 @@ ClangDocBitcodeReader::readBitcode() { case BI_TYPEDEF_BLOCK_ID: case BI_CONCEPT_BLOCK_ID: case BI_VAR_BLOCK_ID: + case BI_FRIEND_BLOCK_ID: case BI_FUNCTION_BLOCK_ID: { auto InfoOrErr = readBlockToInfo(ID); if (!InfoOrErr) |