mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 11:42:11 +00:00
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:
parent
786ab134a6
commit
a0227f5902
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {}
|
||||
''');
|
||||
}
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue