异常信息附加引用环信息

This commit is contained in:
codeboss 2024-06-15 16:52:16 +08:00
parent 44c93754dd
commit e84bb426f5
2 changed files with 35 additions and 2 deletions

View File

@ -31,6 +31,25 @@ QString FragmentExistsCheck::name() const {
return u8"FragmentExistsCheck"; return u8"FragmentExistsCheck";
} }
QList<std::shared_ptr<FragmentGraphHelper>> example_novel::FragmentGraphCheck::refers_cycle_check(
std::shared_ptr<FragmentGraphHelper> item, QList<std::shared_ptr<FragmentGraphHelper>> prevs) const {
if (prevs.contains(item)) {
return prevs << item;
}
auto next_list = item->nextList();
if (next_list.size()) {
prevs << item;
for (auto next : next_list) {
auto ref_link = refers_cycle_check(next, prevs);
if (ref_link.size())
return ref_link;
}
}
return QList<std::shared_ptr<FragmentGraphHelper>>();
}
void FragmentGraphCheck::setElement(std::shared_ptr<FragmentGraphHelper> inst) void FragmentGraphCheck::setElement(std::shared_ptr<FragmentGraphHelper> inst)
{ {
elements_store[inst->nodePeer()->signature()] = inst; elements_store[inst->nodePeer()->signature()] = inst;
@ -165,8 +184,19 @@ void FragmentGraphCheck::validCheck(std::shared_ptr<const ast_gen::ElementAccess
} }
// 理论上不应该有残余 // 理论上不应该有残余
if (elements_store.size()) if (elements_store.size()) {
throw new lib_parse::CheckException(u8"情节图存在环形结构"); for (auto node : elements_store.values()) {
auto cycle_link = refers_cycle_check(node);
QString error_msg = u8"Parse[0x0006]Çé½Úͼ´æÔÚ»·Ðνṹ£º\n";
for (auto n : cycle_link) {
error_msg += QString(u8"%1->").arg(n->nodePeer()->signature());
}
if (cycle_link.size())
throw new lib_parse::CheckException(error_msg);
}
}
} }
QString example_novel::FragmentGraphCheck::name() const { QString example_novel::FragmentGraphCheck::name() const {

View File

@ -20,6 +20,9 @@ namespace example_novel {
private: private:
QHash<QString, std::shared_ptr<FragmentGraphHelper>> elements_store; QHash<QString, std::shared_ptr<FragmentGraphHelper>> elements_store;
QList<std::shared_ptr<FragmentGraphHelper>> refers_cycle_check(
std::shared_ptr<FragmentGraphHelper> item, QList<std::shared_ptr<FragmentGraphHelper>> prevs = QList<std::shared_ptr<FragmentGraphHelper>>()) const;
public: public:
void setElement(std::shared_ptr<FragmentGraphHelper> inst); void setElement(std::shared_ptr<FragmentGraphHelper> inst);
std::shared_ptr<FragmentGraphHelper> getElement(const QString &signature) const; std::shared_ptr<FragmentGraphHelper> getElement(const QString &signature) const;