kconfig: make "Selected by:" and "Implied by:" readable
authorPetr Vorel <petr.vorel@gmail.com>
Thu, 25 Jan 2018 09:46:35 +0000 (10:46 +0100)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 20:54:42 +0000 (21:54 +0100)
Reverse dependency expressions can get rather unwieldy, especially if
a symbol is selected by more than a handful of other symbols. I.e. it's
possible to have near endless expressions like:
   A && B && !C || D || F && (G || H) || [...]

Chop these expressions into actually readable chunks:
   - A && B && !C
   - D
   - F && (G || H)
   - [...]

I.e. transform the top level OR tokens into newlines and prepend each
line with a minus. This makes the "Selected by:" and "Implied by:" blurb
much easier to read. This is done only if there is more than one top
level OR. "Depends on:" and "Range :" were deliberately left as they are.

Based on idea from Paul Bolle.

Suggested-by: Paul Bolle <pebolle@tiscali.nl>
Signed-off-by: Petr Vorel <petr.vorel@gmail.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/expr.c
config/expr.h
config/menu.c

index f8cb886eef9cabe9be8b6d4b55980c8e010f86eb..2ba332b3fed788f6bbdceb707b2a5bf8938feca1 100644 (file)
@@ -1179,7 +1179,7 @@ struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2)
        return expr_get_leftmost_symbol(ret);
 }
 
-void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
+static void __expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken, bool revdep)
 {
        if (!e) {
                fn(data, NULL, "y");
@@ -1234,9 +1234,14 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
                fn(data, e->right.sym, e->right.sym->name);
                break;
        case E_OR:
-               expr_print(e->left.expr, fn, data, E_OR);
-               fn(data, NULL, " || ");
-               expr_print(e->right.expr, fn, data, E_OR);
+               if (revdep && e->left.expr->type != E_OR)
+                       fn(data, NULL, "\n  - ");
+               __expr_print(e->left.expr, fn, data, E_OR, revdep);
+               if (revdep)
+                       fn(data, NULL, "\n  - ");
+               else
+                       fn(data, NULL, " || ");
+               __expr_print(e->right.expr, fn, data, E_OR, revdep);
                break;
        case E_AND:
                expr_print(e->left.expr, fn, data, E_AND);
@@ -1269,6 +1274,11 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
                fn(data, NULL, ")");
 }
 
+void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
+{
+       __expr_print(e, fn, data, prevtoken, false);
+}
+
 static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
 {
        xfwrite(str, strlen(str), 1, data);
@@ -1313,3 +1323,13 @@ void expr_gstr_print(struct expr *e, struct gstr *gs)
 {
        expr_print(e, expr_print_gstr_helper, gs, E_NONE);
 }
+
+/*
+ * Transform the top level "||" tokens into newlines and prepend each
+ * line with a minus. This makes expressions much easier to read.
+ * Suitable for reverse dependency expressions.
+ */
+void expr_gstr_print_revdep(struct expr *e, struct gstr *gs)
+{
+       __expr_print(e, expr_print_gstr_helper, gs, E_NONE, true);
+}
index e7d7a5e3da68797c687ce8490f71245baead492f..c16e82e302a2de32d0101cb4fb535894f1fc0ec2 100644 (file)
@@ -310,6 +310,7 @@ struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2);
 void expr_fprint(struct expr *e, FILE *out);
 struct gstr; /* forward */
 void expr_gstr_print(struct expr *e, struct gstr *gs);
+void expr_gstr_print_revdep(struct expr *e, struct gstr *gs);
 
 static inline int expr_is_yes(struct expr *e)
 {
index d365fc9513c5a6c57cb3619ba3a6ad32e6941c74..99222855544c3a7c2f67b3c33b3796eb36e5ff80 100644 (file)
@@ -828,14 +828,14 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym,
        get_symbol_props_str(r, sym, P_SELECT, _("  Selects: "));
        if (sym->rev_dep.expr) {
                str_append(r, _("  Selected by: "));
-               expr_gstr_print(sym->rev_dep.expr, r);
+               expr_gstr_print_revdep(sym->rev_dep.expr, r);
                str_append(r, "\n");
        }
 
        get_symbol_props_str(r, sym, P_IMPLY, _("  Implies: "));
        if (sym->implied.expr) {
                str_append(r, _("  Implied by: "));
-               expr_gstr_print(sym->implied.expr, r);
+               expr_gstr_print_revdep(sym->implied.expr, r);
                str_append(r, "\n");
        }