Rules / Complexity / avoid-nested-conditional-expressions
avoid-nested-conditional-expressions
lint/complexity/avoid-nested-conditional-expressionsrecommended
Same as avoid-nested-conditional-expressions · Dart Code MetricsFlags a ternary conditional expression nested inside another ternary.
Stacked conditionals like a ? b : c ? d : e are hard to read and easy to
misparse; an if/else chain, a switch expression, or an extracted
variable makes the branching explicit. The rule reports any conditional
expression that has another conditional as an ancestor (nesting level two or
deeper), matching dart_code_linter's default acceptable level of one.
Invalid
example.dartdart
// Each conditional nested inside another conditional is flagged (the inner
// conditional, matching dart_code_linter's nesting-level reporting).
void doubleNesting() {
final x = a ? (b ? c : d) : e;
final y = condition ? (isValid ? "yes" : "no") : "default";
final z = (first ? (second ? 1 : 2) : 3) + 4;
}
// Triple nesting flags both inner conditionals (nesting levels 2 and 3).
String getStatus() {
return active ? (verified ? (premium ? "premium" : "standard") : "unverified") : "inactive";
}
class StatusHelper {
String describe(bool a, bool b, bool c) {
return a ? (b ? (c ? "all" : "a,b") : "a") : "none";
}
}
int calculate(bool x, bool y) {
return x ? (y ? (100) : (50)) : (0);
}
List<String> getItems(bool filter) {
return filter ? (items.isNotEmpty ? (items.toList()) : []) : items;
}
Avoid nested conditional expressions
4void doubleNesting() {
5 final x = a ? (b ? c : d) : e;
∙
Avoid nested conditional expressions
5 final x = a ? (b ? c : d) : e;
6 final y = condition ? (isValid ? "yes" : "no") : "default";
∙
Avoid nested conditional expressions
6 final y = condition ? (isValid ? "yes" : "no") : "default";
7 final z = (first ? (second ? 1 : 2) : 3) + 4;
∙
Avoid nested conditional expressions
11String getStatus() {
12 return active ? (verified ? (premium ? "premium" : "standard") : "unverified") : "inactive";
∙
Avoid nested conditional expressions
11String getStatus() {
12 return active ? (verified ? (premium ? "premium" : "standard") : "unverified") : "inactive";
∙
Avoid nested conditional expressions
16 String describe(bool a, bool b, bool c) {
17 return a ? (b ? (c ? "all" : "a,b") : "a") : "none";
∙
Avoid nested conditional expressions
16 String describe(bool a, bool b, bool c) {
17 return a ? (b ? (c ? "all" : "a,b") : "a") : "none";
∙
Avoid nested conditional expressions
21int calculate(bool x, bool y) {
22 return x ? (y ? (100) : (50)) : (0);
∙
Avoid nested conditional expressions
25List<String> getItems(bool filter) {
26 return filter ? (items.isNotEmpty ? (items.toList()) : []) : items;
∙
Valid
example.dartdart
// Good cases for avoid-nested-conditional-expressions rule
// No violations expected
void testSingleLevelTernary() {
final x = a ? b : c;
final y = condition ? "yes" : "no";
final z = isValid ? 10 : 20;
}
String getStatus() {
if (!active) return "inactive";
if (!verified) return "unverified";
return premium ? "premium" : "standard";
}
class StatusHelper {
String describe(bool a, bool b, bool c) {
if (!a) return "none";
if (!b) return "a";
return c ? "all" : "a,b";
}
}
int calculate(bool x, bool y) {
if (!x) return 0;
return y ? 100 : 50;
}
void cleanNesting() {
if (!condition1) {
return "none";
}
if (!condition2) {
return "shallow";
}
return condition3 ? "deep" : "mid";
}
List<String> getItems(bool filter) {
if (!filter) return items;
return items.isNotEmpty ? items : [];
}
void mixedApproach(bool condition) {
final result = condition ? "active" : "inactive";
print(result);
}
bool isEligible(bool verified, bool premium) {
return verified && premium;
}
How to configure
Set the severity of avoid-nested-conditional-expressions in your falcon.json:
falcon.jsonjson
{
"linter": {
"rules": {
"complexity": {
"avoid-nested-conditional-expressions": "error"
}
}
}
}