Fix 'isOnlyIncluded' check for 3rdparty adaption
* Ensure the adaption is done in our source file * Allow the 3rdparty class/struct to be in any file
This commit is contained in:
parent
ca2a6acb2a
commit
51e55f1673
|
@ -43,17 +43,21 @@ void JsonSerializationCodeGenerator::addDeclaration(clang::Decl *decl)
|
||||||
|
|
||||||
// check for template specializations to adapt a 3rd party class/struct
|
// check for template specializations to adapt a 3rd party class/struct
|
||||||
if (decl->getKind() == clang::Decl::Kind::ClassTemplateSpecialization) {
|
if (decl->getKind() == clang::Decl::Kind::ClassTemplateSpecialization) {
|
||||||
auto *const templRecord = static_cast<clang::ClassTemplateSpecializationDecl *>(decl);
|
auto *const templateSpecializationRecord = static_cast<clang::ClassTemplateSpecializationDecl *>(decl);
|
||||||
if (templRecord->getQualifiedNameAsString() == AdaptedJsonSerializable<void>::qualifiedName) {
|
// check whether the name of the template specialization matches
|
||||||
const clang::TemplateArgumentList &templateArgs = templRecord->getTemplateArgs();
|
if (templateSpecializationRecord->getQualifiedNameAsString() == AdaptedJsonSerializable<void>::qualifiedName) {
|
||||||
|
// get the template argument of the template specialization (exactly one argument expected)
|
||||||
|
const auto &templateArgs = templateSpecializationRecord->getTemplateArgs();
|
||||||
if (templateArgs.size() != 1 || templateArgs.get(0).getKind() != clang::TemplateArgument::Type) {
|
if (templateArgs.size() != 1 || templateArgs.get(0).getKind() != clang::TemplateArgument::Type) {
|
||||||
return; // FIXME: use Clang diagnostics to print warning
|
return; // FIXME: use Clang diagnostics to print warning
|
||||||
}
|
}
|
||||||
const clang::CXXRecordDecl *templateRecord = templateArgs.get(0).getAsType()->getAsCXXRecordDecl();
|
// get the type the template argument refers to (that's the type of the 3rd party class/struct to adapt)
|
||||||
|
auto *const templateRecord = templateArgs.get(0).getAsType()->getAsCXXRecordDecl();
|
||||||
if (!templateRecord) {
|
if (!templateRecord) {
|
||||||
return; // FIXME: use Clang diagnostics to print warning
|
return; // FIXME: use Clang diagnostics to print warning
|
||||||
}
|
}
|
||||||
m_adaptionRecords.emplace_back(templateRecord->getQualifiedNameAsString());
|
// save the relevant information for the code generation
|
||||||
|
m_adaptionRecords.emplace_back(templateRecord->getQualifiedNameAsString(), templateSpecializationRecord);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +77,18 @@ void JsonSerializationCodeGenerator::addDeclaration(clang::Decl *decl)
|
||||||
*/
|
*/
|
||||||
string JsonSerializationCodeGenerator::qualifiedNameIfRelevant(clang::CXXRecordDecl *record) const
|
string JsonSerializationCodeGenerator::qualifiedNameIfRelevant(clang::CXXRecordDecl *record) const
|
||||||
{
|
{
|
||||||
|
// consider all classes for which a specialization of the "AdaptedJsonSerializable" struct is available
|
||||||
|
const string qualifiedName(record->getQualifiedNameAsString());
|
||||||
|
for (const auto &adaptionRecord : m_adaptionRecords) {
|
||||||
|
// skip all adaption records which are only included
|
||||||
|
if (isOnlyIncluded(adaptionRecord.record)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (adaptionRecord.qualifiedName == qualifiedName) {
|
||||||
|
return qualifiedName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// skip all classes which are only included
|
// skip all classes which are only included
|
||||||
if (isOnlyIncluded(record)) {
|
if (isOnlyIncluded(record)) {
|
||||||
return string();
|
return string();
|
||||||
|
@ -80,15 +96,7 @@ string JsonSerializationCodeGenerator::qualifiedNameIfRelevant(clang::CXXRecordD
|
||||||
|
|
||||||
// consider all classes inheriting from an instantiation of "JsonSerializable" relevant
|
// consider all classes inheriting from an instantiation of "JsonSerializable" relevant
|
||||||
if (inheritsFromInstantiationOf(record, JsonSerializable<void>::qualifiedName)) {
|
if (inheritsFromInstantiationOf(record, JsonSerializable<void>::qualifiedName)) {
|
||||||
return record->getQualifiedNameAsString();
|
return qualifiedName;
|
||||||
}
|
|
||||||
|
|
||||||
// consider all classes for which a specialization of the "AdaptedJsonSerializable" struct is available
|
|
||||||
const string qualifiedName(record->getQualifiedNameAsString());
|
|
||||||
for (const string &adaptionRecord : m_adaptionRecords) {
|
|
||||||
if (adaptionRecord == qualifiedName) {
|
|
||||||
return qualifiedName;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// consider all classes specified via "--additional-classes" argument relevant
|
// consider all classes specified via "--additional-classes" argument relevant
|
||||||
|
|
|
@ -42,7 +42,7 @@ private:
|
||||||
const RelevantClass &relevantClass, const std::vector<RelevantClass> &relevantBases);
|
const RelevantClass &relevantClass, const std::vector<RelevantClass> &relevantBases);
|
||||||
|
|
||||||
std::vector<clang::CXXRecordDecl *> m_records;
|
std::vector<clang::CXXRecordDecl *> m_records;
|
||||||
std::vector<std::string> m_adaptionRecords;
|
std::vector<RelevantClass> m_adaptionRecords;
|
||||||
const Options &m_options;
|
const Options &m_options;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue