File tree Expand file tree Collapse file tree 3 files changed +69
-1
lines changed
Expand file tree Collapse file tree 3 files changed +69
-1
lines changed Original file line number Diff line number Diff line change @@ -3148,6 +3148,22 @@ def _parse_cond(self):
31483148
31493149 return expr
31503150
3151+ def _parse_depends (self ):
3152+ # Parses 'depends on' with optional conditional: 'depends on A if B'
3153+ # Converts 'A if B' to '!B || A' (if B is false, dependency is satisfied;
3154+ # if B is true, dependency becomes A)
3155+
3156+ expr = self ._parse_expr (True )
3157+
3158+ if self ._check_token (_T_IF ):
3159+ # Transform "A if B" into "!B || A"
3160+ expr = self ._make_or ((NOT , self ._parse_expr (True )), expr )
3161+
3162+ if self ._tokens [self ._tokens_i ] is not None :
3163+ self ._trailing_tokens_error ()
3164+
3165+ return expr
3166+
31513167 def _parse_props (self , node ):
31523168 # Parses and adds properties to the MenuNode 'node' (type, 'prompt',
31533169 # 'default's, etc.) Properties are later copied up to symbols and
@@ -3183,7 +3199,7 @@ def _parse_props(self, node):
31833199 self ._parse_error ("expected 'on' after 'depends'" )
31843200
31853201 node .dep = self ._make_and (node .dep ,
3186- self ._expect_expr_and_eol ())
3202+ self ._parse_depends ())
31873203
31883204 elif t0 is _T_HELP :
31893205 self ._parse_help (node )
Original file line number Diff line number Diff line change 1+ # Test conditional dependencies: "depends on A if B"
2+ # Should be equivalent to "depends on !B || A"
3+
4+ config COND_DEP_1
5+ bool
6+ depends on A if B
7+
8+ config COND_DEP_2
9+ bool
10+ depends on (C && D) if E
11+
12+ config COND_DEP_MIXED
13+ bool
14+ depends on A
15+ depends on B if C
16+ depends on D
17+
18+ # Test with choice
19+ choice COND_CHOICE
20+ bool "conditional choice"
21+ depends on X if Y
22+ endchoice
23+
24+ # Test multiple conditional dependencies combined
25+ config MULTI_COND
26+ bool
27+ depends on A if B
28+ depends on C if D
Original file line number Diff line number Diff line change @@ -1324,6 +1324,30 @@ def verify_prompts(items, *expected_prompts):
13241324 "A || B || C" )
13251325
13261326
1327+ print ("Testing conditional dependencies (depends on A if B)" )
1328+
1329+ c = Kconfig ("Kconfiglib/tests/Kconddep" )
1330+
1331+ # "depends on A if B" should become "!B || A"
1332+ verify_equal (expr_str (c .syms ["COND_DEP_1" ].direct_dep ), "!B || A" )
1333+
1334+ # "depends on (C && D) if E" should become "!E || (C && D)"
1335+ verify_equal (expr_str (c .syms ["COND_DEP_2" ].direct_dep ), "!E || (C && D)" )
1336+
1337+ # Multiple depends combined: "depends on A", "depends on B if C", "depends on D"
1338+ # Should become: "A && (!C || B) && D"
1339+ verify_equal (expr_str (c .syms ["COND_DEP_MIXED" ].direct_dep ),
1340+ "A && (!C || B) && D" )
1341+
1342+ # Test with choice
1343+ verify_equal (expr_str (c .named_choices ["COND_CHOICE" ].direct_dep ), "!Y || X" )
1344+
1345+ # Multiple conditional dependencies: "depends on A if B" and "depends on C if D"
1346+ # Should become: "(!B || A) && (!D || C)"
1347+ verify_equal (expr_str (c .syms ["MULTI_COND" ].direct_dep ),
1348+ "(!B || A) && (!D || C)" )
1349+
1350+
13271351 print ("Testing expr_items()" )
13281352
13291353 c = Kconfig ("Kconfiglib/tests/Kexpr_items" )
You can’t perform that action at this time.
0 commit comments