menuconfig: Improve behavior for named choices included multiple times
Update menuconfig to upstream revision 38dff36b0f97b, to improve the behavior for a case reported by Øyvind Rønningstad. Upstream commit message: menuconfig: Only list duplicated choice symbols once When a Kconfig file defined a named choice and was included multiple times, the choice symbols were listed multiple times in the menuconfig as well (due to commit 17d7c1e ("menuconfig: Show all symbols at each menu location for multi.def. choices")). That's probably not what you want. Tweak it so that each symbol is only shown once, with the prompt that was used for it at whatever choice definition location is entered. Also change how the choice selection is displayed before the choice is entered, so that the prompt used for the selected symbol at that particular location is used. Previously, the prompt at the first definition location for the symbol was always used. Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
This commit is contained in:
parent
c43a116f41
commit
c1f4d677f2
1 changed files with 30 additions and 6 deletions
|
@ -1421,9 +1421,23 @@ def _shown_nodes(menu):
|
|||
#
|
||||
# Note: Named choices are pretty broken in the C tools, and this is
|
||||
# super obscure, so you probably won't find much that relies on this.
|
||||
return [node
|
||||
for choice_node in menu.item.nodes
|
||||
for node in rec(choice_node.list)]
|
||||
|
||||
# Do some additional work to avoid listing choice symbols twice if all
|
||||
# or part of the choice is copied in multiple locations (e.g. by
|
||||
# including some Kconfig file multiple times). We give the prompts at
|
||||
# the current location precedence.
|
||||
seen_syms = {node.item for node in rec(menu.list)
|
||||
if isinstance(node.item, Symbol)}
|
||||
res = []
|
||||
for choice_node in menu.item.nodes:
|
||||
for node in rec(choice_node.list):
|
||||
# 'choice_node is menu' checks if we're dealing with the
|
||||
# current location
|
||||
if node.item not in seen_syms or choice_node is menu:
|
||||
res.append(node)
|
||||
if isinstance(node.item, Symbol):
|
||||
seen_syms.add(node.item)
|
||||
return res
|
||||
|
||||
return rec(menu.list)
|
||||
|
||||
|
@ -2791,9 +2805,19 @@ def _node_str(node):
|
|||
# choices in y mode
|
||||
sym = node.item.selection
|
||||
if sym:
|
||||
for node_ in sym.nodes:
|
||||
if node_.prompt:
|
||||
s += " ({})".format(node_.prompt[0])
|
||||
for sym_node in sym.nodes:
|
||||
# Use the prompt used at this choice location, in case the
|
||||
# choice symbol is defined in multiple locations
|
||||
if sym_node.parent is node and sym_node.prompt:
|
||||
s += " ({})".format(sym_node.prompt[0])
|
||||
break
|
||||
else:
|
||||
# If the symbol isn't defined at this choice location, then
|
||||
# just use whatever prompt we can find for it
|
||||
for sym_node in sym.nodes:
|
||||
if sym_node.prompt:
|
||||
s += " ({})".format(sym_node.prompt[0])
|
||||
break
|
||||
|
||||
# Print "--->" next to nodes that have menus that can potentially be
|
||||
# entered. Print "----" if the menu is empty. We don't allow those to be
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue