Skip to content

Commit 7b671fe

Browse files
authored
Merge pull request #17 from sysprog21/improve-condition
Support 'depends on A if B' syntax
2 parents 9544f72 + 35c8fed commit 7b671fe

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

kconfiglib.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff 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)

tests/Kconddep

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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

testsuite.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff 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")

0 commit comments

Comments
 (0)