Skip to content

Commit 2bcc415

Browse files
srawlinscommit-bot@chromium.org
authored andcommitted
analyzer: Report unnecessary import directives.
In a given library, every import directive has a set of "used elements," the subset of elements provided by the import which are used in the library. In a given library, an import directive is "unnecessary" if there exists at least one other import directive with the same prefix as the aforementioned import directive, and a "used elements" set which is a proper superset of the aforementioned import directive's "used elements" set. #44569 Change-Id: I4da43be36837cdafb07a0ab67a94e644f351e593 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177221 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 53b08e3 commit 2bcc415

File tree

8 files changed

+449
-65
lines changed

8 files changed

+449
-65
lines changed

pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class AddMissingRequiredArgumentTest extends FixProcessorTest {
3333
Future<void> test_constructor_flutter_children() async {
3434
await resolveTestCode('''
3535
import 'package:flutter/widgets.dart';
36-
import 'package:meta/meta.dart';
3736
3837
class MyWidget extends Widget {
3938
MyWidget({@required List<Widget> children});
@@ -45,7 +44,6 @@ build() {
4544
''');
4645
await assertHasFix('''
4746
import 'package:flutter/widgets.dart';
48-
import 'package:meta/meta.dart';
4947
5048
class MyWidget extends Widget {
5149
MyWidget({@required List<Widget> children});
@@ -60,7 +58,6 @@ build() {
6058
Future<void> test_constructor_flutter_hasTrailingComma() async {
6159
await resolveTestCode('''
6260
import 'package:flutter/widgets.dart';
63-
import 'package:meta/meta.dart';
6461
6562
class MyWidget extends Widget {
6663
MyWidget({@required int a, @required int b});
@@ -72,7 +69,6 @@ build() {
7269
''');
7370
await assertHasFix('''
7471
import 'package:flutter/widgets.dart';
75-
import 'package:meta/meta.dart';
7672
7773
class MyWidget extends Widget {
7874
MyWidget({@required int a, @required int b});
@@ -335,7 +331,6 @@ main() {
335331
Future<void> test_param_child() async {
336332
await resolveTestCode('''
337333
import 'package:flutter/widgets.dart';
338-
import 'package:meta/meta.dart';
339334
340335
class MyWidget extends Widget {
341336
MyWidget({@required String foo, @required Widget child});
@@ -349,7 +344,6 @@ build() {
349344
''');
350345
await assertHasFix('''
351346
import 'package:flutter/widgets.dart';
352-
import 'package:meta/meta.dart';
353347
354348
class MyWidget extends Widget {
355349
MyWidget({@required String foo, @required Widget child});
@@ -367,7 +361,6 @@ build() {
367361
Future<void> test_param_children() async {
368362
await resolveTestCode('''
369363
import 'package:flutter/widgets.dart';
370-
import 'package:meta/meta.dart';
371364
372365
class MyWidget extends Widget {
373366
MyWidget({@required String foo, @required List<Widget> children});
@@ -381,7 +374,6 @@ build() {
381374
''');
382375
await assertHasFix('''
383376
import 'package:flutter/widgets.dart';
384-
import 'package:meta/meta.dart';
385377
386378
class MyWidget extends Widget {
387379
MyWidget({@required String foo, @required List<Widget> children});

pkg/analyzer/lib/error/error.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ const List<ErrorCode> errorCodeValues = [
592592
HintCode.UNIGNORABLE_IGNORE,
593593
HintCode.UNNECESSARY_CAST,
594594
HintCode.UNNECESSARY_IGNORE,
595+
HintCode.UNNECESSARY_IMPORT,
595596
HintCode.UNNECESSARY_NO_SUCH_METHOD,
596597
HintCode.UNNECESSARY_NULL_COMPARISON_FALSE,
597598
HintCode.UNNECESSARY_NULL_COMPARISON_TRUE,

pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ class LibraryAnalyzer {
299299
verifier.generateDuplicateShownHiddenNameHints(errorReporter);
300300
verifier.generateUnusedImportHints(errorReporter);
301301
verifier.generateUnusedShownNameHints(errorReporter);
302+
verifier.generateUnnecessaryImportHints(
303+
errorReporter, _usedImportedElementsList);
302304
}
303305

304306
// Unused local elements.

pkg/analyzer/lib/src/dart/error/hint_codes.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2684,6 +2684,12 @@ class HintCode extends AnalyzerErrorCode {
26842684
"Try removing the name from the list, or removing the whole comment "
26852685
"if this is the only name in the list.");
26862686

2687+
static const HintCode UNNECESSARY_IMPORT = HintCode(
2688+
'UNNECESSARY_IMPORT',
2689+
"The import of '{0}' is unnecessary as all of the used elements are also "
2690+
"provided by the import of '{1}'.",
2691+
correction: 'Try removing the import directive.');
2692+
26872693
/**
26882694
* Unnecessary `noSuchMethod` declaration.
26892695
*/

0 commit comments

Comments
 (0)