Re: [PATCH v3 3/3] kconfig: Print reverse dependencies in groups

Ulf Magnusson
2018-02-18T13:35:30Z

On Sun, Feb 18, 2018 at 2:19 PM, Ulf Magnusson <ulfalizer@gmail.com> wrote:
> On Sun, Feb 18, 2018 at 2:02 PM, Ulf Magnusson <ulfalizer@gmail.com> wrote:
>> On Sun, Feb 18, 2018 at 12:07:02PM +0100, Eugeniu Rosca wrote:
>>> If expr_print_newline is renamed to expr_print_{select,revdep}, then
>>> I still face the need of expr_print_newline. So, I kept the *newline()
>>> function in place and came up with below solution to aggregate
>>> duplicated code. Please, let me know if it looks OK to you (btw, it
>>> creates a slightly higher --stat compared to current solution).
>>>
>>> diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
>>> index 48b99371d276..a6316e5681d9 100644
>>> --- a/scripts/kconfig/expr.c
>>> +++ b/scripts/kconfig/expr.c
>>> @@ -1189,6 +1189,34 @@ expr_print_newline(struct expr *e,
>>> expr_print(e, fn, data, prevtoken);
>>> }
>>>
>>> +static void
>>> +expr_print_revdep(struct expr *e,
>>> + void (*fn)(void *, struct symbol *, const char *),
>>> + void *data,
>>> + int prevtoken,
>>> + enum print_type type)
>>> +{
>>> + switch (type) {
>>> + case PRINT_REVDEP_ALL:
>>> + expr_print_newline(e, fn, data, prevtoken);
>>> + break;
>>> + case PRINT_REVDEP_YES:
>>> + if (expr_calc_value(e) == yes)
>>> + expr_print_newline(e, fn, data, prevtoken);
>>> + break;
>>> + case PRINT_REVDEP_MOD:
>>> + if (expr_calc_value(e) == mod)
>>> + expr_print_newline(e, fn, data, prevtoken);
>>> + break;
>>> + case PRINT_REVDEP_NO:
>>> + if (expr_calc_value(e) == no)
>>> + expr_print_newline(e, fn, data, prevtoken);
>>> + break;
>>> + default:
>>> + break;
>>> + }
>>> +}
>>> +
>>
>> I think it's fine to have a separate expr_print_newline() function
>> still. Getting rid of the repetition still makes it more readable to me.
>>
>> Maybe you could do something like this if you want to eliminate
>> expr_print_newline() though. AFAICS, it isn't used outside
>> expr_print_revdep().
>>
>> static void
>> expr_print_revdep(struct expr *e,
>> void (*fn)(void *, struct symbol *, const char *),
>> void *data,
>> int prevtoken,
>> enum print_type type)
>> {
>> if (type == PRINT_REVDEP_ALL ||
>> type == PRINT_REVDEP_YES && expr_calc_value(e) == yes ||
>> type == PRINT_REVDEP_MOD && expr_calc_value(e) == mod ||
>> type == PRINT_REVDEP_NO && expr_calc_value(e) == no) {
>>
>> fn(data, NULL, "\n - ");
>> expr_print(e, fn, data, prevtoken);
>> }
>> }
>>
>>
>> Could turn that into a switch over 'type' and set a 'print_revdep' flag
>> which is checked at the end too, if you'd prefer that:
>>
>> switch (type) {
>> ...
>> case PRINT_REVDEP_YES:
>> print_revdep = (expr_calc_value(e) == yes);
>> break;
>> ...
>> }
>>
>> if (print_revdep) {
>> fn(data, NULL, "\n - ");
>> expr_print(e, fn, data, prevtoken);
>> }
>>
>>
>> Or return early:
>>
>> case PRINT_REVDEP_YES:
>> if (expr_calc_value(e) != yes)
>> return;
>> break;
>> ...
>> }
>>
>> fn(data, NULL, "\n - ");
>> expr_print(e, fn, data, prevtoken);
>>
>>
>> The original version is already fine by me though. The 'if' version
>> seems pretty direct too.
>>
>> Cheers,
>> Ulf
>
> Hmm... was thinking that you could get rid of 'print_type' and just
> pass a tristate value for a moment too. There's PRINT_NORMAL and
> PRINT_REVDEP_ALL to deal with as well though, so it'd get messy.
>
> Cheers,
> Ulf

One last bikeshedding: Could factor out just the check into a function
and do something like this in __expr_print():

if (select_has_type(e, type))
expr_print_newline(e, fn, data, prevtoken);

Having a function that's just one big 'if' feels slightly silly,
though it's not horrible here either IMO.

Cheers,
Ulf