diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart index 477e32519ee..0cf56848f89 100644 --- a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart +++ b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart @@ -28,7 +28,7 @@ class AnalysisDomainGetErrorsTest Directory(path.join(sdkPath, 'lib', 'async')).createSync(recursive: true); Directory(path.join(sdkPath, 'lib', 'fake')).createSync(recursive: true); - File(path.join(sdkPath, 'version')).writeAsStringSync('2.10.0'); + File(path.join(sdkPath, 'version')).writeAsStringSync('2.12.0'); File(path.join(sdkPath, 'lib', 'core', 'core.dart')).writeAsStringSync(r''' library dart.core; diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart index b29d1e8986b..16ec3114760 100644 --- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart +++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analysis_server/src/services/correction/fix.dart'; +import 'package:analyzer/src/error/codes.dart'; import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -517,7 +518,9 @@ main() { A a = new A(callback: (int a) { }); print(a); } -'''); +''', + errorFilter: (error) => + error.errorCode == HintCode.MISSING_REQUIRED_PARAM); } Future test_constructor_single_closure_nnbd_into_legacy() async { diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart index 990feb48eb6..38b3ce4f1f2 100644 --- a/pkg/analyzer/lib/error/error.dart +++ b/pkg/analyzer/lib/error/error.dart @@ -489,6 +489,7 @@ const List errorCodeValues = [ HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, + HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL, HintCode.INFERENCE_FAILURE_ON_FUNCTION_RETURN_TYPE, HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart index 60447c07baa..2a7a07a5bff 100644 --- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart +++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart @@ -571,6 +571,16 @@ class HintCode extends AnalyzerErrorCode { correction: "Try changing the import to not be deferred, or " "rename the function in the imported library."); + /** + * https://github.com/dart-lang/sdk/issues/44063 + */ + static const HintCode IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE = HintCode( + 'IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE', + "The library '{0}' is legacy, and should not be imported into " + "a null safe library.", + correction: "Try migrating the imported library.", + ); + /** * When "strict-inference" is enabled, collection literal types must be * inferred via the context type, or have type arguments. diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart index 5ee814de87d..acc8ac7614a 100644 --- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart +++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart @@ -504,6 +504,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor { _checkForLoadLibraryFunction(node, importElement); } _invalidAccessVerifier.verifyImport(node); + _checkForImportOfLegacyLibraryIntoNullSafe(node); super.visitImportDirective(node); } @@ -922,6 +923,24 @@ class BestPracticesVerifier extends RecursiveAstVisitor { } } + void _checkForImportOfLegacyLibraryIntoNullSafe(ImportDirective node) { + if (!_isNonNullableByDefault) { + return; + } + + var importElement = node.element as ImportElement; + var importedLibrary = importElement.importedLibrary; + if (importedLibrary == null || importedLibrary.isNonNullableByDefault) { + return; + } + + _errorReporter.reportErrorForNode( + HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, + node.uri, + [importedLibrary.source.uri], + ); + } + /// Check that the namespace exported by [node] does not include any elements /// annotated with `@internal`. void _checkForInternalExport(ExportDirective node) { diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart index dc79e240534..f9e47a8f2a2 100644 --- a/pkg/analyzer/test/src/dart/analysis/base.dart +++ b/pkg/analyzer/test/src/dart/analysis/base.dart @@ -63,6 +63,7 @@ class BaseAnalysisDriverTest with ResourceProviderMixin { final List allExceptions = []; String testProject; + String testProject2; String testFile; String testCode; @@ -81,7 +82,7 @@ class BaseAnalysisDriverTest with ResourceProviderMixin { {Map> packageMap, SummaryDataStore externalSummaries}) { packageMap ??= >{ - 'test': [getFolder(testProject)], + 'test': [getFolder('$testProject/lib')], 'aaa': [getFolder('/aaa/lib')], 'bbb': [getFolder('/bbb/lib')], }; @@ -161,7 +162,8 @@ class BaseAnalysisDriverTest with ResourceProviderMixin { void setUp() { sdk = MockSdk(resourceProvider: resourceProvider); - testProject = convertPath('/test/lib'); + testProject = convertPath('/test'); + testProject2 = convertPath('/test/lib'); testFile = convertPath('/test/lib/test.dart'); logger = PerformanceLog(logBuffer); scheduler = AnalysisDriverScheduler(logger); diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart index 70061ed6eec..b73f5bfdf1e 100644 --- a/pkg/analyzer/test/src/dart/analysis/index_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart @@ -136,7 +136,7 @@ mixin M5 on M2 {} } test_isExtendedBy_ClassDeclaration_isQualified() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} '''); await _indexTestUnit(''' @@ -169,7 +169,7 @@ class C = A with B; } test_isExtendedBy_ClassTypeAlias_isQualified() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} '''); await _indexTestUnit(''' @@ -195,7 +195,7 @@ class B implements A {} // 2 } test_isImplementedBy_ClassDeclaration_isQualified() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} '''); await _indexTestUnit(''' @@ -243,7 +243,7 @@ mixin M on A {} // 2 } test_isInvokedBy_FunctionElement() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' library lib; foo() {} '''); @@ -419,7 +419,7 @@ class B extends Object with A {} // 2 } test_isMixedInBy_ClassDeclaration_isQualified() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} '''); await _indexTestUnit(''' @@ -547,7 +547,7 @@ main() { } test_isReferencedBy_ClassElement_invocation_isQualified() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} '''); await _indexTestUnit(''' @@ -586,7 +586,7 @@ main(B p) { } test_isReferencedBy_CompilationUnitElement_export() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' library lib; '''); await _indexTestUnit(''' @@ -597,7 +597,7 @@ export 'lib.dart'; } test_isReferencedBy_CompilationUnitElement_import() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' library lib; '''); await _indexTestUnit(''' @@ -608,7 +608,7 @@ import 'lib.dart'; } test_isReferencedBy_CompilationUnitElement_part() async { - newFile('$testProject/my_unit.dart', content: 'part of my_lib;'); + newFile('$testProject2/my_unit.dart', content: 'part of my_lib;'); await _indexTestUnit(''' library my_lib; part 'my_unit.dart'; @@ -618,8 +618,8 @@ part 'my_unit.dart'; } test_isReferencedBy_CompilationUnitElement_part_inPart() async { - newFile('$testProject/a.dart', content: 'part of lib;'); - newFile('$testProject/b.dart', content: ''' + newFile('$testProject2/a.dart', content: 'part of lib;'); + newFile('$testProject2/b.dart', content: ''' library lib; part 'a.dart'; '''); @@ -899,7 +899,7 @@ main() { } test_isReferencedBy_FunctionElement_with_LibraryElement() async { - newFile('$testProject/foo.dart', content: r''' + newFile('$testProject2/foo.dart', content: r''' bar() {} '''); await _indexTestUnit(''' @@ -957,8 +957,8 @@ class A { } test_isReferencedBy_MultiplyDefinedElement() async { - newFile('$testProject/a1.dart', content: 'class A {}'); - newFile('$testProject/a2.dart', content: 'class A {}'); + newFile('$testProject2/a1.dart', content: 'class A {}'); + newFile('$testProject2/a2.dart', content: 'class A {}'); await _indexTestUnit(''' import 'a1.dart'; import 'a2.dart'; @@ -1153,7 +1153,7 @@ main(bool b) { } test_isReferencedBy_TopLevelVariableElement() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' library lib; var V; '''); @@ -1177,7 +1177,7 @@ main() { } test_isReferencedBy_TopLevelVariableElement_synthetic_hasGetterSetter() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' int get V => 0; void set V(_) {} '''); @@ -1189,7 +1189,7 @@ import 'lib.dart' show V; } test_isReferencedBy_TopLevelVariableElement_synthetic_hasSetter() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' void set V(_) {} '''); await _indexTestUnit(''' @@ -1224,7 +1224,7 @@ class A { test_subtypes_classDeclaration() async { String libP = 'package:test/lib.dart;package:test/lib.dart'; - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} class B {} class C {} @@ -1274,7 +1274,7 @@ class Z implements E, D { test_subtypes_classTypeAlias() async { String libP = 'package:test/lib.dart;package:test/lib.dart'; - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} class B {} class C {} @@ -1312,7 +1312,7 @@ class X extends dynamic { test_subtypes_mixinDeclaration() async { String libP = 'package:test/lib.dart;package:test/lib.dart'; - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' class A {} class B {} class C {} diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart index e5fefd3abc5..3858d02c433 100644 --- a/pkg/analyzer/test/src/dart/analysis/search_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart @@ -261,7 +261,7 @@ List v2 = null; } test_searchReferences_ClassElement_definedOutside() async { - newFile('$testProject/lib.dart', content: r''' + newFile('$testProject2/lib.dart', content: r''' class A {}; '''); await _resolveTestUnit(''' @@ -317,7 +317,7 @@ class B extends Object with A {} // with } test_searchReferences_CompilationUnitElement() async { - newFile('$testProject/foo.dart'); + newFile('$testProject2/foo.dart'); await _resolveTestUnit(''' import 'foo.dart'; // import export 'foo.dart'; // export @@ -354,7 +354,7 @@ main() { } test_searchReferences_ConstructorElement_default_otherFile() async { - String other = convertPath('$testProject/other.dart'); + String other = convertPath('$testProject2/other.dart'); String otherCode = ''' import 'test.dart'; main() { @@ -686,8 +686,8 @@ label: test_searchReferences_LibraryElement() async { var codeA = 'part of lib; // A'; var codeB = 'part of lib; // B'; - newFile('$testProject/unitA.dart', content: codeA); - newFile('$testProject/unitB.dart', content: codeB); + newFile('$testProject2/unitA.dart', content: codeA); + newFile('$testProject2/unitB.dart', content: codeB); await _resolveTestUnit(''' library lib; part 'unitA.dart'; @@ -1103,7 +1103,7 @@ main() { part of my_lib; ppp.Future c; '''; - newFile('$testProject/my_part.dart', content: partCode); + newFile('$testProject2/my_part.dart', content: partCode); await _resolveTestUnit(''' library my_lib; import 'dart:async' as ppp; @@ -1156,9 +1156,9 @@ main() { } test_searchReferences_private_declaredInDefiningUnit() async { - String p1 = convertPath('$testProject/part1.dart'); - String p2 = convertPath('$testProject/part2.dart'); - String p3 = convertPath('$testProject/part3.dart'); + String p1 = convertPath('$testProject2/part1.dart'); + String p2 = convertPath('$testProject2/part2.dart'); + String p3 = convertPath('$testProject2/part3.dart'); String code1 = 'part of lib; _C v1;'; String code2 = 'part of lib; _C v2;'; newFile(p1, content: code1); @@ -1192,9 +1192,9 @@ _C v; } test_searchReferences_private_declaredInPart() async { - String p = convertPath('$testProject/lib.dart'); - String p1 = convertPath('$testProject/part1.dart'); - String p2 = convertPath('$testProject/part2.dart'); + String p = convertPath('$testProject2/lib.dart'); + String p1 = convertPath('$testProject2/part1.dart'); + String p2 = convertPath('$testProject2/part2.dart'); var code = ''' library lib; @@ -1369,7 +1369,7 @@ class A { } test_searchReferences_TopLevelVariableElement() async { - newFile('$testProject/lib.dart', content: ''' + newFile('$testProject2/lib.dart', content: ''' library lib; var V; '''); @@ -1654,8 +1654,8 @@ class A { } test_subtypes_files() async { - String pathB = convertPath('$testProject/b.dart'); - String pathC = convertPath('$testProject/c.dart'); + String pathB = convertPath('$testProject2/b.dart'); + String pathC = convertPath('$testProject2/c.dart'); newFile(pathB, content: r''' import 'test.dart'; class B extends A {} diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart index 34b271d8259..4090683f3c5 100644 --- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart @@ -347,13 +347,15 @@ const cInt = const int.fromEnvironment('foo', defaultValue: 1); const cString = const String.fromEnvironment('foo', defaultValue: 'bar'); '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; const vBool = cBool; const vInt = cInt; const vString = cString; -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); DartObjectImpl evaluate(String name) { return findElement.topVar(name).computeConstantValue(); diff --git a/pkg/analyzer/test/src/dart/resolution/field_test.dart b/pkg/analyzer/test/src/dart/resolution/field_test.dart index 90d814bce48..c8120a06268 100644 --- a/pkg/analyzer/test/src/dart/resolution/field_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/field_test.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:analyzer/src/dart/error/hint_codes.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import 'context_collection_resolution.dart'; @@ -67,13 +68,15 @@ class FieldWithNullSafetyTest extends PubPackageResolutionTest var a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; class A { var f = a; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertType(findElement.field('f').type, 'int'); } diff --git a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart index d200a01b6e6..c94064bcfd1 100644 --- a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart @@ -81,14 +81,16 @@ var z = pi; int a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'dart:math'; import 'package:aaa/a.dart'; var x = 0; var y = a; var z = pi; -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 27, 20), + ]); assertType(findElement.topVar('x').type, 'int'); assertType(findElement.topVar('y').type, 'int'); assertType(findElement.topVar('z').type, 'double'); diff --git a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart index 7e27085fd5d..213fbbb9a01 100644 --- a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart @@ -122,14 +122,16 @@ void f() { var a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; void f() { var x = a; x; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); var x = findElement.localVar('x'); assertType(x.type, 'int'); diff --git a/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart index 896aa453580..fd045d09673 100644 --- a/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/top_level_variable_test.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:analyzer/src/dart/error/hint_codes.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import 'context_collection_resolution.dart'; @@ -59,11 +60,13 @@ class TopLevelVariableWithNullSafetyTest extends TopLevelVariableTest var a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; var v = a; -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertType(findElement.topVar('v').type, 'int'); } diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart index 4ac90c492fd..d66588048f6 100644 --- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart @@ -468,7 +468,7 @@ class FunctionExpressionWithNullSafetyTest extends FunctionExpressionTest int Function(int a) v; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; T foo() => throw 0; @@ -478,7 +478,9 @@ void f() { return foo(); }; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertType(findElement.parameter('a').type, 'int'); _assertReturnType('(a) {', 'int'); } @@ -489,13 +491,15 @@ void f() { void foo(int Function() x) {} '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; void test(int? a) { foo(() => a); } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); _assertReturnType('() => a', 'int?'); } @@ -505,13 +509,15 @@ void test(int? a) { void foo(int Function() x) {} '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; void test(dynamic a) { foo(() => a); } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); _assertReturnType('() => a', 'int'); } diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart index 502c43db83b..562aebb468c 100644 --- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart @@ -472,11 +472,13 @@ f(F a) {} class A {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(A a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('A a'), @@ -491,11 +493,13 @@ f(A a) {} class A {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(A a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('A a'), @@ -510,11 +514,13 @@ f(A a) {} class A {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(A a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('A a'), @@ -529,11 +535,13 @@ f(A a) {} class A {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(A a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('A a'), @@ -548,11 +556,13 @@ f(A a) {} typedef F = int Function(); '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(F a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('F a'), @@ -567,11 +577,13 @@ f(F a) {} typedef F = T Function(); '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(F a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('F a'), @@ -586,11 +598,13 @@ f(F a) {} typedef F = T Function(); '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(F a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('F a'), @@ -605,11 +619,13 @@ f(F a) {} typedef F = T Function(); '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; f(F a) {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); assertTypeName( findNode.typeName('F a'), diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart index 9342301cc84..aa368bbbdcf 100644 --- a/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart +++ b/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart @@ -138,11 +138,13 @@ import 'a.dart'; class C extends Bi implements Biq {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'b.dart'; abstract class D implements C {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_class_topMerge() async { @@ -169,11 +171,13 @@ import 'a.dart'; class B extends A {} '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; import 'b.dart'; class C extends B implements A {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 24, 8), + ]); } } diff --git a/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart b/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart index c1e4746fe2a..9699baeb0b3 100644 --- a/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart +++ b/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart @@ -22,13 +22,15 @@ class DeadNullAwareExpressionTest extends PubPackageResolutionTest var x = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x ??= 0; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_assignCompound_map() async { @@ -68,13 +70,15 @@ f(int? x) { var x = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x ?? 0; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_binary_nonNullable() async { diff --git a/pkg/analyzer/test/src/diagnostics/import_of_legacy_library_into_null_safe_test.dart b/pkg/analyzer/test/src/diagnostics/import_of_legacy_library_into_null_safe_test.dart new file mode 100644 index 00000000000..2119b9f5509 --- /dev/null +++ b/pkg/analyzer/test/src/diagnostics/import_of_legacy_library_into_null_safe_test.dart @@ -0,0 +1,68 @@ +// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:analyzer/src/error/codes.dart'; +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +import '../dart/resolution/context_collection_resolution.dart'; + +main() { + defineReflectiveSuite(() { + defineReflectiveTests(ImportOfLegacyLibraryInoNullSafeTest); + }); +} + +@reflectiveTest +class ImportOfLegacyLibraryInoNullSafeTest extends PubPackageResolutionTest + with WithNullSafetyMixin { + test_legacy_into_legacy() async { + newFile('$testPackageLibPath/a.dart', content: r''' +// @dart = 2.9 +class A {} +'''); + await assertNoErrorsInCode(r''' +// @dart = 2.9 +import 'a.dart'; + +void f(A a) {} +'''); + } + + test_legacy_into_nullSafe() async { + newFile('$testPackageLibPath/a.dart', content: r''' +// @dart = 2.9 +class A {} +'''); + await assertErrorsInCode(r''' +import 'a.dart'; + +void f(A a) {} +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); + } + + test_nullSafe_into_legacy() async { + newFile('$testPackageLibPath/a.dart', content: r''' +class A {} +'''); + await assertNoErrorsInCode(r''' +// @dart = 2.9 +import 'a.dart'; + +void f(A a) {} +'''); + } + + test_nullSafe_into_nullSafe() async { + newFile('$testPackageLibPath/a.dart', content: r''' +class A {} +'''); + await assertNoErrorsInCode(r''' +import 'a.dart'; + +void f(A a) {} +'''); + } +} diff --git a/pkg/analyzer/test/src/diagnostics/invalid_null_aware_operator_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_null_aware_operator_test.dart index bce4df19305..8f903e52d84 100644 --- a/pkg/analyzer/test/src/diagnostics/invalid_null_aware_operator_test.dart +++ b/pkg/analyzer/test/src/diagnostics/invalid_null_aware_operator_test.dart @@ -201,14 +201,16 @@ f() { var x = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x?.isEven; x?..isEven; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_getter_mixin() async { @@ -268,14 +270,16 @@ f() { var x = [0]; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x?[0]; x?..[0]; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_index_nonNullable() async { @@ -329,14 +333,16 @@ f() { var x = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x?.round(); x?..round(); } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_method_mixin() async { @@ -386,13 +392,15 @@ f(List x) { var x = []; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { [...?x]; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_nullableSpread_nonNullableType() async { diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart index e3a0206ff7c..110480cd5ee 100644 --- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart +++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart @@ -308,13 +308,15 @@ class A { } '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; class B extends A { void foo({int a = 0}) {} } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_concrete_equal_optOut_extends_optIn() async { diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart index 67d9fa89221..50128c92328 100644 --- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart +++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart @@ -323,13 +323,15 @@ class A { } '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; class B extends A { void foo([int a = 0]) {} } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_concrete_equal_optOut_extends_optIn() async { diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart index 17c1ae2e1e1..5d526036bed 100644 --- a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart +++ b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart @@ -798,12 +798,14 @@ import 'a.dart'; class C with B {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; import 'b.dart'; class D extends C implements Bq {} -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 24, 8), + ]); } test_mixedInheritance_2() async { @@ -828,7 +830,7 @@ import 'a.dart'; class C extends B with Bq {} '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'b.dart'; class D extends C { @@ -836,7 +838,9 @@ class D extends C { set a(List _) {} int Function(int) m(int Function(int) x) => x; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_setter_overrides_abstract_field_covariant_valid() async { @@ -959,7 +963,7 @@ import 'a.dart'; class L extends A2 implements A1 {} '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; import 'b.dart'; @@ -971,7 +975,9 @@ class Y extends L { int? m() => 0; set s(int _) {} } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 24, 8), + ]); } test_viaLegacy_mixin() async { @@ -996,7 +1002,7 @@ import 'a.dart'; class L extends Object with A2 implements A1 {} '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; import 'b.dart'; @@ -1008,6 +1014,8 @@ class Y extends L { int? m() => 0; set s(int _) {} } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 24, 8), + ]); } } diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart index 2498c30c222..3d1585b557b 100644 --- a/pkg/analyzer/test/src/diagnostics/test_all.dart +++ b/pkg/analyzer/test/src/diagnostics/test_all.dart @@ -230,6 +230,8 @@ import 'implicit_this_reference_in_initializer_test.dart' import 'import_deferred_library_with_load_function_test.dart' as import_deferred_library_with_load_function; import 'import_internal_library_test.dart' as import_internal_library; +import 'import_of_legacy_library_into_null_safe_test.dart' + as mport_of_legacy_library_into_null_safe; import 'import_of_non_library_test.dart' as import_of_non_library; import 'inconsistent_case_expression_types_test.dart' as inconsistent_case_expression_types; @@ -808,6 +810,7 @@ main() { implicit_this_reference_in_initializer.main(); import_deferred_library_with_load_function.main(); import_internal_library.main(); + mport_of_legacy_library_into_null_safe.main(); import_of_non_library.main(); inconsistent_case_expression_types.main(); inconsistent_inheritance_getter_and_method.main(); diff --git a/pkg/analyzer/test/src/diagnostics/throw_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/throw_of_invalid_type_test.dart index d1ec82cfaea..fa947bc3b0f 100644 --- a/pkg/analyzer/test/src/diagnostics/throw_of_invalid_type_test.dart +++ b/pkg/analyzer/test/src/diagnostics/throw_of_invalid_type_test.dart @@ -29,13 +29,15 @@ f(dynamic a) { // @dart = 2.7 int a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { throw a; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_nonNullable() async { diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart index d927ad54e25..4b9d36efaa0 100644 --- a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart +++ b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart @@ -231,6 +231,7 @@ void f() { b; } ''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), error(HintCode.UNNECESSARY_CAST, 39, 8), ]); } @@ -241,13 +242,15 @@ void f() { int a = 0; '''); - await assertNoErrorsInCode(r''' + await assertErrorsInCode(r''' import 'a.dart'; void f() { var b = a as int?; b; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } } diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart index 3104f0557fe..4c521d21cf9 100644 --- a/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart +++ b/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart @@ -22,13 +22,15 @@ class UnnecessaryNonNullAssertionTest extends PubPackageResolutionTest var x = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { x!; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_nonNull_function() async { diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_null_comparison_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_null_comparison_test.dart index e48a345288e..ffd565a4fdd 100644 --- a/pkg/analyzer/test/src/diagnostics/unnecessary_null_comparison_test.dart +++ b/pkg/analyzer/test/src/diagnostics/unnecessary_null_comparison_test.dart @@ -34,14 +34,16 @@ f(int a, int? b) { var a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { a == null; null == a; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_equal_legacyLibrary() async { @@ -96,14 +98,16 @@ f(int a, int? b) { var a = 0; '''); - await assertNoErrorsInCode(''' + await assertErrorsInCode(''' import 'a.dart'; f() { a != null; null != a; } -'''); +''', [ + error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8), + ]); } test_notEqual_legacyLibrary() async { diff --git a/runtime/tests/vm/dart/product_aot_kernel_test.dart b/runtime/tests/vm/dart/product_aot_kernel_test.dart index d46dd145908..5372d3d157d 100644 --- a/runtime/tests/vm/dart/product_aot_kernel_test.dart +++ b/runtime/tests/vm/dart/product_aot_kernel_test.dart @@ -9,8 +9,10 @@ import "dart:async"; import "dart:io"; import 'package:expect/expect.dart'; +// ignore: import_of_legacy_library_into_null_safe import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilderWithMetadata; +// ignore: import_of_legacy_library_into_null_safe import 'package:kernel/kernel.dart'; import 'package:path/path.dart' as path; diff --git a/runtime/tests/vm/dart_2/product_aot_kernel_test.dart b/runtime/tests/vm/dart_2/product_aot_kernel_test.dart index d46dd145908..5372d3d157d 100644 --- a/runtime/tests/vm/dart_2/product_aot_kernel_test.dart +++ b/runtime/tests/vm/dart_2/product_aot_kernel_test.dart @@ -9,8 +9,10 @@ import "dart:async"; import "dart:io"; import 'package:expect/expect.dart'; +// ignore: import_of_legacy_library_into_null_safe import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilderWithMetadata; +// ignore: import_of_legacy_library_into_null_safe import 'package:kernel/kernel.dart'; import 'package:path/path.dart' as path;