prefer-immediate-return
Same as prefer-immediate-return in Dart Code Metrics
- Group
- Complexity
- Path
lint/complexity/prefer-immediate-return- Default
- Off, opt in
- Origin
- Dart Code Metrics
- Rule
- 368 of 512
Flags a local variable that is returned on the immediately following statement.
Assigning a value to a variable only to return it on the next line adds an
intermediate name that carries no information; return the expression
directly. The rule fires when a single-declarator local variable declaration
is immediately followed by a return of that same variable. Every statement
list is checked, including closures, operators, switch cases, and finally blocks.
Invalid
// Bad: unnecessary intermediate variable before return
String getName() {
final result = compute();
return result;
}
int getValue() {
final value = 42;
return value;
}
class Helper {
Future<String> fetchData() async {
final data = await http.get(url);
return data;
}
List<String> getNames(List<User> users) {
final names = users.map((u) => u.name).toList();
return names;
}
}
bool validate(String input) {
final isValid = input.isNotEmpty && input.length > 3;
return isValid;
}String getName() { final result = compute();int getValue() { final value = 42; Future<String> fetchData() async { final data = await http.get(url); List<String> getNames(List<User> users) { final names = users.map((u) => u.name).toList();bool validate(String input) { final isValid = input.isNotEmpty && input.length > 3;Valid
// Good: immediate return
String getName() {
return compute();
}
int getValue() {
return 42;
}
class Helper {
Future<String> fetchData() async {
return await http.get(url);
}
List<String> getNames(List<User> users) {
return users.map((u) => u.name).toList();
}
}
bool validate(String input) {
return input.isNotEmpty && input.length > 3;
}
// OK: variable used multiple times
String processAndLog(String input) {
final result = transform(input);
log('Transformed: $result');
return result;
}
// OK: variable used in conditional
int getCount(List<String> items) {
final count = items.length;
if (count == 0) {
print('Empty');
}
return count;
}
// OK: variable needs intermediate computation
Future<String> getData(bool force) async {
final result = await (force ? fetchRemote() : getLocal());
return result.trim();
}Configure prefer-immediate-return
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"complexity": {
"prefer-immediate-return": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/complexity/prefer-immediate-return: <reason>More complexity rules
- prefer-iterable-any
prefer_iterable_anyrecommendedFlags
iterable.where(...).isNotEmpty. - prefer-iterable-every
prefer_iterable_everyrecommendedFlags
iterable.where(predicate).isEmptyand filtered-length comparisons. - prefer-moving-to-variable
prefer-moving-to-variableFlags repeated property/getter chains in local variable initializers.
- prefer-null-aware-operators
prefer_null_aware_operatorsrecommendedFlags
x == null ? null : x.y(and the invertedx != null ? x.y : null). - unnecessary-const
unnecessary_constrecommendedFlags a redundant
constkeyword inside an already-const context. - unnecessary-getters-setters
unnecessary_getters_settersrecommendedFlags a trivial getter/setter pair that only reads and writes a private field.
- unnecessary-lambdas
unnecessary_lambdasrecommendedFlags a closure that only forwards its parameters to a function a tear-off could name.
- unnecessary-overrides
unnecessary_overridesrecommendedFlags a member that does nothing but forward to
superwith the same arguments and resolved contract.