mirror of
https://github.com/JakeHillion/object-introspection.git
synced 2024-11-09 21:24:14 +00:00
Printer: Make prefix() [[nodiscard]] and fix bug printing Dummy nodes
Dummy and DummyAllocator nodes had been changed to use NodeIds, but were still printed out in full when visited for a second time. [[nodiscard]] prevents future bugs of this type by turning them into compilation errors. Example of the now-fixed bug: [1] Container: std::map<int32_t, int32_t, DummySizedOperator<0, 0, 8>, std::allocator<std::pair<int32_t const, int32_t>>> Param Primitive: int32_t Param Primitive: int32_t Param [2] Dummy [less<int>] Param ... [3] Container: std::map<int32_t, int32_t, DummySizedOperator<0, 0, 8>, std::allocator<std::pair<int32_t const, int32_t>>> Param Primitive: int32_t Param Primitive: int32_t Param [2] Dummy [less<int>] Param ... With this patch, the second "Dummy" line will not be printed.
This commit is contained in:
parent
c766d7b572
commit
bbc4cb822b
@ -37,7 +37,7 @@ void Printer::print(const Type& type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Class& c) {
|
void Printer::visit(const Class& c) {
|
||||||
if (prefix(&c))
|
if (prefix(c))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string kind;
|
std::string kind;
|
||||||
@ -79,7 +79,7 @@ void Printer::visit(const Class& c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Container& c) {
|
void Printer::visit(const Container& c) {
|
||||||
if (prefix(&c))
|
if (prefix(c))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_ << "Container: " << c.name() << " (size: " << c.size() << ")"
|
out_ << "Container: " << c.name() << " (size: " << c.size() << ")"
|
||||||
@ -106,7 +106,7 @@ void Printer::visit(const Enum& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Array& a) {
|
void Printer::visit(const Array& a) {
|
||||||
if (prefix(&a))
|
if (prefix(a))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_ << "Array: ";
|
out_ << "Array: ";
|
||||||
@ -117,7 +117,7 @@ void Printer::visit(const Array& a) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Typedef& td) {
|
void Printer::visit(const Typedef& td) {
|
||||||
if (prefix(&td))
|
if (prefix(td))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto name = td.name();
|
auto name = td.name();
|
||||||
@ -129,7 +129,7 @@ void Printer::visit(const Typedef& td) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Pointer& p) {
|
void Printer::visit(const Pointer& p) {
|
||||||
if (prefix(&p))
|
if (prefix(p))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_ << "Pointer";
|
out_ << "Pointer";
|
||||||
@ -140,36 +140,41 @@ void Printer::visit(const Pointer& p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const Dummy& d) {
|
void Printer::visit(const Dummy& d) {
|
||||||
prefix(&d);
|
if (prefix(d))
|
||||||
|
return;
|
||||||
out_ << "Dummy ";
|
out_ << "Dummy ";
|
||||||
out_ << "[" << d.inputName() << "] ";
|
out_ << "[" << d.inputName() << "] ";
|
||||||
out_ << "(size: " << d.size() << align_str(d.align()) << ")" << std::endl;
|
out_ << "(size: " << d.size() << align_str(d.align()) << ")" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Printer::visit(const DummyAllocator& d) {
|
void Printer::visit(const DummyAllocator& d) {
|
||||||
prefix(&d);
|
if (prefix(d))
|
||||||
|
return;
|
||||||
out_ << "DummyAllocator ";
|
out_ << "DummyAllocator ";
|
||||||
out_ << "[" << d.inputName() << "] ";
|
out_ << "[" << d.inputName() << "] ";
|
||||||
out_ << "(size: " << d.size() << align_str(d.align()) << ")" << std::endl;
|
out_ << "(size: " << d.size() << align_str(d.align()) << ")" << std::endl;
|
||||||
print(d.allocType());
|
print(d.allocType());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Printer::prefix(const Type* type) {
|
void Printer::prefix() {
|
||||||
|
int indent = baseIndent_ + depth_ * 2;
|
||||||
|
out_ << std::string(indent, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Printer::prefix(const Type& type) {
|
||||||
int indent = baseIndent_ + depth_ * 2;
|
int indent = baseIndent_ + depth_ * 2;
|
||||||
|
|
||||||
if (type) {
|
if (tracker_.visit(type)) {
|
||||||
if (tracker_.visit(*type)) {
|
// Node has already been printed - print a reference to it this time
|
||||||
// Node has already been printed - print a reference to it this time
|
out_ << std::string(indent, ' ');
|
||||||
out_ << std::string(indent, ' ');
|
out_ << "[" << type.id() << "]" << std::endl;
|
||||||
out_ << "[" << type->id() << "]" << std::endl;
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string nodeId = "[" + std::to_string(type->id()) + "]";
|
|
||||||
out_ << nodeId;
|
|
||||||
indent -= nodeId.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string nodeId = "[" + std::to_string(type.id()) + "]";
|
||||||
|
out_ << nodeId;
|
||||||
|
indent -= nodeId.size();
|
||||||
|
|
||||||
out_ << std::string(indent, ' ');
|
out_ << std::string(indent, ' ');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,8 @@ class Printer : public ConstVisitor {
|
|||||||
void visit(const DummyAllocator& d) override;
|
void visit(const DummyAllocator& d) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool prefix(const Type* type = nullptr);
|
void prefix();
|
||||||
|
[[nodiscard]] bool prefix(const Type& type);
|
||||||
void print_param(const TemplateParam& param);
|
void print_param(const TemplateParam& param);
|
||||||
void print_parent(const Parent& parent);
|
void print_parent(const Parent& parent);
|
||||||
void print_member(const Member& member);
|
void print_member(const Member& member);
|
||||||
|
Loading…
Reference in New Issue
Block a user