Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 27 additions & 53 deletions lib/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/error/listener.dart';
import 'package:custom_lint_builder/custom_lint_builder.dart';
import 'package:analyzer/analysis_rule/rule_context.dart';
import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
import 'package:analyzer/error/error.dart';
import 'package:solid_lints/src/lints/avoid_late_keyword/models/avoid_late_keyword_parameters.dart';
import 'package:solid_lints/src/models/rule_config.dart';
import 'package:solid_lints/src/lints/avoid_late_keyword/visitors/avoid_late_keyword_visitor.dart';
import 'package:solid_lints/src/models/solid_lint_rule.dart';
import 'package:solid_lints/src/utils/types_utils.dart';

/// Avoid `late` keyword
///
Expand Down Expand Up @@ -48,62 +47,37 @@ import 'package:solid_lints/src/utils/types_utils.dart';
/// }
/// ```
class AvoidLateKeywordRule extends SolidLintRule<AvoidLateKeywordParameters> {
/// This lint rule represents
/// the error whether we use `late` keyword.
static const lintName = 'avoid_late_keyword';
static const String _lintName = 'avoid_late_keyword';

AvoidLateKeywordRule._(super.config);
static const LintCode _code = LintCode(
_lintName,
'Avoid using the "late" keyword. It may result in runtime exceptions.',
);

/// Creates a new instance of [AvoidLateKeywordRule]
/// based on the lint configuration.
factory AvoidLateKeywordRule.createRule(CustomLintConfigs configs) {
final rule = RuleConfig(
configs: configs,
name: lintName,
paramsParser: AvoidLateKeywordParameters.fromJson,
problemMessage: (_) => 'Avoid using the "late" keyword. '
'It may result in runtime exceptions.',
);
/// Creates an instance of [AvoidLateKeywordRule].
AvoidLateKeywordRule({required super.analysisOptionsLoader})
: super.withParameters(
name: _lintName,
description: 'Warns against using the late keyword.',
parametersParser: AvoidLateKeywordParameters.fromJson,
);

return AvoidLateKeywordRule._(rule);
}
@override
LintCode get diagnosticCode => _code;

@override
void run(
CustomLintResolver resolver,
DiagnosticReporter reporter,
CustomLintContext context,
void registerNodeProcessors(
RuleVisitorRegistry registry,
RuleContext context,
) {
context.registry.addVariableDeclaration((node) {
if (_shouldLint(node)) {
reporter.atNode(node, code);
}
});
}

bool _shouldLint(VariableDeclaration node) {
final isLateDeclaration = node.isLate;
if (!isLateDeclaration) return false;

final hasIgnoredType = _hasIgnoredType(node);
if (hasIgnoredType) return false;

final allowInitialized = config.parameters.allowInitialized;
if (!allowInitialized) return true;

final hasInitializer = node.initializer != null;
return !hasInitializer;
}

bool _hasIgnoredType(VariableDeclaration node) {
final ignoredTypes = config.parameters.ignoredTypes.toSet();
if (ignoredTypes.isEmpty) return false;
final parameters =
getParametersForContext(context) ?? const AvoidLateKeywordParameters();

final variableType = node.declaredFragment?.element.type;
if (variableType == null) return false;
final visitor = AvoidLateKeywordVisitor(this, parameters);

return variableType.hasIgnoredType(
ignoredTypes: ignoredTypes,
registry.addVariableDeclaration(
this,
visitor,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:solid_lints/src/lints/avoid_late_keyword/avoid_late_keyword_rule.dart';
Comment thread
andrew-bekhiet-solid marked this conversation as resolved.
import 'package:solid_lints/src/lints/avoid_late_keyword/models/avoid_late_keyword_parameters.dart';
import 'package:solid_lints/src/utils/types_utils.dart';

/// Visitor for [AvoidLateKeywordRule].
class AvoidLateKeywordVisitor extends SimpleAstVisitor<void> {
final AvoidLateKeywordRule _rule;

final AvoidLateKeywordParameters _parameters;

/// Creates an instance of [AvoidLateKeywordVisitor].
AvoidLateKeywordVisitor(this._rule, this._parameters);

@override
void visitVariableDeclaration(VariableDeclaration node) {
if (!_shouldReport(node)) return;

_rule.reportAtNode(node);
}

bool _shouldReport(VariableDeclaration node) {
final isLateDeclaration = node.isLate;
if (!isLateDeclaration) return false;

final hasIgnoredType = _hasIgnoredType(node);
if (hasIgnoredType) return false;

final allowInitialized = _parameters.allowInitialized;
if (!allowInitialized) return true;

final hasInitializer = node.initializer != null;
return !hasInitializer;
}

bool _hasIgnoredType(VariableDeclaration node) {
final ignoredTypes = _parameters.ignoredTypes.toSet();
if (ignoredTypes.isEmpty) return false;

final variableType = node.declaredFragment?.element.type;
if (variableType == null) return false;

return variableType.hasIgnoredType(
ignoredTypes: ignoredTypes,
);
}
}

This file was deleted.

This file was deleted.

10 changes: 0 additions & 10 deletions lint_test/avoid_late_keyword/no_generics/analysis_options.yaml

This file was deleted.

This file was deleted.

14 changes: 0 additions & 14 deletions lint_test/avoid_late_keyword/with_generics/analysis_options.yaml

This file was deleted.

Loading
Loading