mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-23 22:33:41 +00:00
log_help: Refactor help content adding
Content is now added to the `ContentListing` rather than the `PrettyHelp`. `open_*` methods return the `ContentListing` that was added instead of leaving a hanging continuation. This allows for (e.g.) options to be added directly to optiongroups, instead of requiring that groups be closed before continuation. This also means that all `PrettyHelp`s are a listing, with the actual log being called by the default `Pass::help()`; making the mode field redundant. Added `PrettyHelp::log_help()` which replaces the `PrettyHelp::Mode::LOG` logic. Added `ContentListing::back()` which just returns the last element of the underlying content vector. Some of the content tracking was made redundant and removed, in particular `PrettyHelp::_current_listing` and `ContentListing::parent`. Converted `ContentListing` to a class instead of a struct, adjusting constructors to match. Added `ContentListing` constructor that accepts a `source_location`. Update `HelpPass::dump_cmds_json()` for new log_help.
This commit is contained in:
parent
bce73af324
commit
f4ad934542
4 changed files with 166 additions and 227 deletions
|
@ -25,73 +25,41 @@
|
|||
|
||||
YOSYS_NAMESPACE_BEGIN
|
||||
|
||||
struct ContentListing {
|
||||
string type = "root";
|
||||
string body = "";
|
||||
const char* source_file = "unknown";
|
||||
int source_line = 0;
|
||||
vector<ContentListing *> content = {};
|
||||
ContentListing *parent = nullptr;
|
||||
class ContentListing {
|
||||
vector<ContentListing *> _content;
|
||||
public:
|
||||
string type;
|
||||
string body;
|
||||
const char* source_file;
|
||||
int source_line;
|
||||
|
||||
ContentListing(
|
||||
string type = "root", string body = "",
|
||||
const char* source_file = "unknown", int source_line = 0
|
||||
) : type(type), body(body), source_file(source_file), source_line(source_line) {
|
||||
_content = {};
|
||||
}
|
||||
|
||||
ContentListing(string type, string body, source_location location) :
|
||||
ContentListing(type, body, location.file_name(), location.line()) { }
|
||||
|
||||
void add_content(ContentListing *new_content) {
|
||||
new_content->parent = this;
|
||||
content.push_back(new_content);
|
||||
_content.push_back(new_content);
|
||||
}
|
||||
|
||||
void add_content(string type, string body, source_location location) {
|
||||
auto new_content = new ContentListing();
|
||||
new_content->type = type;
|
||||
new_content->body = body;
|
||||
new_content->source_file = location.file_name();
|
||||
new_content->source_line = location.line();
|
||||
auto new_content = new ContentListing(type, body, location);
|
||||
add_content(new_content);
|
||||
}
|
||||
|
||||
Json to_json();
|
||||
};
|
||||
|
||||
class PrettyHelp
|
||||
{
|
||||
public:
|
||||
string group = "unknown";
|
||||
enum Mode {
|
||||
LOG,
|
||||
LISTING,
|
||||
};
|
||||
|
||||
private:
|
||||
PrettyHelp *_prior;
|
||||
Mode _mode;
|
||||
|
||||
int _current_indent = 0;
|
||||
ContentListing _root_listing;
|
||||
ContentListing *_current_listing;
|
||||
|
||||
void add_content(string type, string body, source_location location) {
|
||||
_current_listing->add_content(type, body, location);
|
||||
}
|
||||
void push_content(string type, string body, source_location location) {
|
||||
add_content(type, body, location);
|
||||
_current_listing = _current_listing->content.back();
|
||||
}
|
||||
void pop_content() {
|
||||
_current_listing = _current_listing->parent;
|
||||
log_assert(_current_listing != nullptr);
|
||||
}
|
||||
public:
|
||||
PrettyHelp(Mode mode = LOG);
|
||||
~PrettyHelp();
|
||||
|
||||
static PrettyHelp *get_current();
|
||||
|
||||
bool has_content() { return _root_listing.content.size();}
|
||||
bool has_content() { return _content.size() != 0; }
|
||||
const vector<ContentListing *> get_content() {
|
||||
const vector<ContentListing *> content = _root_listing.content;
|
||||
const vector<ContentListing *> content = _content;
|
||||
return content;
|
||||
}
|
||||
|
||||
void set_group(const string g) { group = g; }
|
||||
bool has_group() { return group.compare("unknown") != 0; }
|
||||
ContentListing* back() {
|
||||
return _content.back();
|
||||
}
|
||||
|
||||
void usage(
|
||||
const string &usage,
|
||||
|
@ -112,15 +80,45 @@ public:
|
|||
const source_location location = source_location::current()
|
||||
);
|
||||
|
||||
void open_optiongroup(
|
||||
ContentListing* open_optiongroup(
|
||||
const string &name = "",
|
||||
const source_location location = source_location::current()
|
||||
);
|
||||
void open_option(
|
||||
ContentListing* open_option(
|
||||
const string &text,
|
||||
const source_location location = source_location::current()
|
||||
);
|
||||
void close(int levels = 1);
|
||||
|
||||
Json to_json();
|
||||
};
|
||||
|
||||
class PrettyHelp
|
||||
{
|
||||
public:
|
||||
string group = "unknown";
|
||||
|
||||
private:
|
||||
PrettyHelp *_prior;
|
||||
ContentListing _root_listing;
|
||||
|
||||
public:
|
||||
PrettyHelp();
|
||||
~PrettyHelp();
|
||||
|
||||
static PrettyHelp *get_current();
|
||||
|
||||
bool has_content() { return _root_listing.has_content(); }
|
||||
const vector<ContentListing *> get_content() {
|
||||
return _root_listing.get_content();
|
||||
}
|
||||
ContentListing* get_root() {
|
||||
return &_root_listing;
|
||||
}
|
||||
|
||||
void set_group(const string g) { group = g; }
|
||||
bool has_group() { return group.compare("unknown") != 0; }
|
||||
|
||||
void log_help();
|
||||
};
|
||||
|
||||
YOSYS_NAMESPACE_END
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue