This repository has been archived by the owner on Jul 16, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 258
/
declarations_visitor.dart
74 lines (57 loc) · 2.12 KB
/
declarations_visitor.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// ignore_for_file: public_member_api_docs
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import '../../utils/node_utils.dart';
typedef DeclarationUsages = Map<Element, Iterable<FormalParameter>>;
class DeclarationsVisitor extends RecursiveAstVisitor<void> {
final DeclarationUsages declarations = {};
@override
void visitMethodDeclaration(MethodDeclaration node) {
super.visitMethodDeclaration(node);
final parameters = node.parameters?.parameters;
if (parameters == null || !_hasNullableParameters(parameters)) {
return;
}
_getDeclarationElement(node, parameters);
}
@override
void visitFunctionDeclaration(FunctionDeclaration node) {
super.visitFunctionDeclaration(node);
final parameters = node.functionExpression.parameters?.parameters;
if (isEntrypoint(node.name.name, node.metadata) ||
(parameters == null || !_hasNullableParameters(parameters))) {
return;
}
_getDeclarationElement(node, parameters);
}
@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
super.visitConstructorDeclaration(node);
final parameters = node.parameters.parameters;
if (!_hasNullableParameters(parameters)) {
return;
}
_getDeclarationElement(node, parameters);
}
bool _hasNullableParameters(Iterable<FormalParameter> parameters) =>
parameters.any((parameter) {
final type = parameter.declaredElement?.type;
return type != null &&
(type.nullabilitySuffix == NullabilitySuffix.question &&
(!parameter.isOptional ||
parameter.isOptional && parameter.isRequired)) ||
(parameter is DefaultFormalParameter &&
parameter.defaultValue == null);
});
void _getDeclarationElement(
Declaration node,
Iterable<FormalParameter> parameters,
) {
final element = node.declaredElement;
if (element != null) {
declarations[element] = parameters;
}
}
}