Subject: Re: bug#74718: 29.4; Huge metadata with flex completion style

From: Thierry Volpiatto <[email-masked]>
Date: Wed, 11 Dec 2024 05:45:25 +0000

Hello Stefan,

Stefan Monnier <[email-masked]> writes:

>> Here the offending code in minibuffer.el (in
>> completion--nth-completion):
>>
>> --8<---------------cut here---------------start------------->8---
>>    (adjust-fn (get (cdr result-and-style) 'completion--adjust-metadata)))
>>     (when (and adjust-fn metadata)
>>       (setcdr metadata (cdr (funcall adjust-fn metadata))))
>> --8<---------------cut here---------------end--------------->8---
>
> Thanks Thierry.
> The above code is indeed a hack we should try get rid of.
> I suspect it remained unnoticed until now because most UIs get a "fresh"
> new metadata before calling `completion-try/all-completions`, but we
> shouldn't rely on such a property.
>
> I think I vaguely remember when this code was added that we discussed
> whether it's OK to do that (for all I know, I may even have suggested
> this hack), so replacing it with a more robust solution may be
> not straightforward.
>
> In the mean time, maybe a patch like the one below can temporarily paper
> over the underlying problem?

Yes your patch fixed it, it avoids the duplicates as well.

Thanks.

>
>         Stefan
>
>
> diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
> index 405ee21cdb2..d258085c778 100644
> --- a/lisp/minibuffer.el
> +++ b/lisp/minibuffer.el
> @@ -1307,9 +1307,15 @@ completion--nth-completion
>                                 string table pred point)))
>                     (and probe (cons probe style))))))
>             (completion--styles md)))
> -         (adjust-fn (get (cdr result-and-style) 'completion--adjust-metadata)))
> -    (when (and adjust-fn metadata)
> -      (setcdr metadata (cdr (funcall adjust-fn metadata))))
> +         (adjust-fn (get (cdr result-and-style) 'completion--adjust-metadata))
> +         (adjusted (completion-metadata-get
> +                    metadata 'completion--adjusted-metadata)))
> +    (when (and adjust-fn metadata
> +               ;; Avoid re-applying the same adjustment (bug#74718).
> +               (not (memq (cdr result-and-style) adjusted)))
> +      (setcdr metadata `((completion--adjusted-metadata
> +                          ,(cdr result-and-style) . ,adjusted)
> +                         . ,(cdr (funcall adjust-fn metadata)))))
>      (if requote
>          (funcall requote (car result-and-style) n)
>        (car result-and-style))))

-- 
Thierry