3
3
import 'package:analyzer/dart/ast/ast.dart' ;
4
4
import 'package:analyzer/dart/ast/visitor.dart' ;
5
5
import 'package:analyzer/dart/element/element.dart' ;
6
+ import 'package:collection/collection.dart' ;
6
7
7
8
import '../../utils/flutter_types_utils.dart' ;
8
9
import 'models/file_elements_usage.dart' ;
@@ -13,6 +14,31 @@ import 'models/prefix_element_usage.dart';
13
14
class UsedCodeVisitor extends RecursiveAstVisitor <void > {
14
15
final fileElementsUsage = FileElementsUsage ();
15
16
17
+ UsedCodeVisitor ();
18
+
19
+ @override
20
+ void visitImportDirective (ImportDirective node) {
21
+ if (node.configurations.isNotEmpty) {
22
+ final paths = node.configurations.map ((config) {
23
+ final uri = config.resolvedUri;
24
+
25
+ return (uri is DirectiveUriWithSource ) ? uri.source.fullName : null ;
26
+ }).whereNotNull ();
27
+ // ignore: deprecated_member_use
28
+ final mainImport = node.element2? .importedLibrary? .source.fullName;
29
+
30
+ final allPaths = {if (mainImport != null ) mainImport, ...paths};
31
+
32
+ fileElementsUsage.conditionalElements.update (
33
+ allPaths,
34
+ (conditionalElements) => conditionalElements,
35
+ ifAbsent: () => {},
36
+ );
37
+ }
38
+
39
+ super .visitImportDirective (node);
40
+ }
41
+
16
42
@override
17
43
void visitExportDirective (ExportDirective node) {
18
44
super .visitExportDirective (node);
@@ -130,6 +156,24 @@ class UsedCodeVisitor extends RecursiveAstVisitor<void> {
130
156
return false ;
131
157
}
132
158
159
+ bool _recordConditionalElement (Element element) {
160
+ final elementPath = element.source? .fullName;
161
+ if (elementPath == null ) {
162
+ return false ;
163
+ }
164
+
165
+ final entries = fileElementsUsage.conditionalElements.entries;
166
+ for (final conditionalElement in entries) {
167
+ if (conditionalElement.key.contains (elementPath)) {
168
+ conditionalElement.value.add (element);
169
+
170
+ return true ;
171
+ }
172
+ }
173
+
174
+ return false ;
175
+ }
176
+
133
177
/// Records use of a not prefixed [element] .
134
178
void _recordUsedElement (Element element) {
135
179
// Ignore if an unknown library.
@@ -157,11 +201,16 @@ class UsedCodeVisitor extends RecursiveAstVisitor<void> {
157
201
return ;
158
202
}
159
203
160
- // Usage in State<WidgetClassName> is not a sing of usage.
204
+ // Usage in State<WidgetClassName> is not a sign of usage.
161
205
if (_isUsedAsNamedTypeForWidgetState (identifier)) {
162
206
return ;
163
207
}
164
208
209
+ // Record elements that are imported with conditional imports
210
+ if (_recordConditionalElement (element)) {
211
+ return ;
212
+ }
213
+
165
214
// Record `importPrefix.identifier` into 'prefixMap'.
166
215
if (_recordPrefixMap (identifier, element)) {
167
216
return ;
0 commit comments