异常信息附加引用环信息
This commit is contained in:
parent
44c93754dd
commit
e84bb426f5
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue