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):
3148
3148
3149
3149
return expr
3150
3150
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
+
3151
3167
def _parse_props (self , node ):
3152
3168
# Parses and adds properties to the MenuNode 'node' (type, 'prompt',
3153
3169
# 'default's, etc.) Properties are later copied up to symbols and
@@ -3183,7 +3199,7 @@ def _parse_props(self, node):
3183
3199
self ._parse_error ("expected 'on' after 'depends'" )
3184
3200
3185
3201
node .dep = self ._make_and (node .dep ,
3186
- self ._expect_expr_and_eol ())
3202
+ self ._parse_depends ())
3187
3203
3188
3204
elif t0 is _T_HELP :
3189
3205
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):
1324
1324
"A || B || C" )
1325
1325
1326
1326
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
+
1327
1351
print ("Testing expr_items()" )
1328
1352
1329
1353
c = Kconfig ("Kconfiglib/tests/Kexpr_items" )
You can’t perform that action at this time.
0 commit comments