Rules / Complexity / avoid-nested-conditional-expressions

avoid-nested-conditional-expressions

lint/complexity/avoid-nested-conditional-expressions
recommended
Same as avoid-nested-conditional-expressions · Dart Code Metrics

Flags 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"
      }
    }
  }
}