Issue 44063. Report IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE hint.

Bug: https://github.com/dart-lang/sdk/issues/44063
Change-Id: I69c6f84da9a9c928e177507cedb30e06a561f3f2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170441
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Konstantin Shcheglov 2020-11-09 19:42:08 +00:00
parent 786ab134a6
commit a0227f5902
29 changed files with 292 additions and 109 deletions

View file

@ -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;

View file

@ -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<void> test_constructor_single_closure_nnbd_into_legacy() async {

View file

@ -489,6 +489,7 @@ const List<ErrorCode> 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,

View file

@ -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.

View file

@ -504,6 +504,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
_checkForLoadLibraryFunction(node, importElement);
}
_invalidAccessVerifier.verifyImport(node);
_checkForImportOfLegacyLibraryIntoNullSafe(node);
super.visitImportDirective(node);
}
@ -922,6 +923,24 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
}
}
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) {

View file

@ -63,6 +63,7 @@ class BaseAnalysisDriverTest with ResourceProviderMixin {
final List<ExceptionResult> allExceptions = <ExceptionResult>[];
String testProject;
String testProject2;
String testFile;
String testCode;
@ -81,7 +82,7 @@ class BaseAnalysisDriverTest with ResourceProviderMixin {
{Map<String, List<Folder>> packageMap,
SummaryDataStore externalSummaries}) {
packageMap ??= <String, List<Folder>>{
'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);

View file

@ -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 {}

View file

@ -261,7 +261,7 @@ List<A> 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 {}

View file

@ -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();

View file

@ -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');
}

View file

@ -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');

View file

@ -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');

View file

@ -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');
}

View file

@ -468,7 +468,7 @@ class FunctionExpressionWithNullSafetyTest extends FunctionExpressionTest
int Function(int a) v;
''');
await assertNoErrorsInCode('''
await assertErrorsInCode('''
import 'a.dart';
T foo<T>() => 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');
}

View file

@ -472,11 +472,13 @@ f(F<int> 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<T extends num> {}
''');
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<T> {}
''');
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<T> {}
''');
await assertNoErrorsInCode(r'''
await assertErrorsInCode(r'''
import 'a.dart';
f(A<int> a) {}
''');
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
]);
assertTypeName(
findNode.typeName('A<int> a'),
@ -548,11 +556,13 @@ f(A<int> 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 extends num> = 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> = 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> = T Function();
''');
await assertNoErrorsInCode(r'''
await assertErrorsInCode(r'''
import 'a.dart';
f(F<int> a) {}
''');
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
]);
assertTypeName(
findNode.typeName('F<int> a'),

View file

@ -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<int> {}
''');
await assertNoErrorsInCode('''
await assertErrorsInCode('''
import 'a.dart';
import 'b.dart';
class C extends B implements A<int> {}
''');
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 24, 8),
]);
}
}

View file

@ -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 {

View file

@ -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) {}
''');
}
}

View file

@ -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<int> x) {
var x = <int>[];
''');
await assertNoErrorsInCode('''
await assertErrorsInCode('''
import 'a.dart';
f() {
[...?x];
}
''');
''', [
error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
]);
}
test_nullableSpread_nonNullableType() async {

View file

@ -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 {

View file

@ -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 {

View file

@ -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)> _) {}
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),
]);
}
}

View file

@ -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();

View file

@ -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 {

View file

@ -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),
]);
}
}

View file

@ -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 {

View file

@ -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 {

View file

@ -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;

View file

@ -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;