Version 2.14.0-388.0.dev Merge commit '3bec5e5ecd13e5696e8e503750fef65a60692824' into 'dev'
diff --git a/DEPS b/DEPS index 8b2457d..288bd01 100644 --- a/DEPS +++ b/DEPS
@@ -73,7 +73,7 @@ # Revisions of /third_party/* dependencies. "args_rev": "bf4c8796881b62fd5d3f6d86ab43014f9651eb20", - "async_rev": "25a7e2ec39c03622b86918cb9ce3e7d00dd283d1", + "async_rev": "88cc6079037da08dcb31cf8dcd62173c2ddf1e89", "bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0", "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7", "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart index 1ab5812..ad30563 100644 --- a/pkg/analysis_server/lib/src/services/correction/fix.dart +++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -127,7 +127,7 @@ static const ADD_NE_NULL_MULTI = FixKind('dart.fix.add.neNull.multi', DartFixKindPriority.IN_FILE, 'Add != null everywhere in file'); static const ADD_NULL_CHECK = FixKind('dart.fix.add.nullCheck', - DartFixKindPriority.DEFAULT, 'Add a null check (!)'); + DartFixKindPriority.DEFAULT - 1, 'Add a null check (!)',); static const ADD_OVERRIDE = FixKind('dart.fix.add.override', DartFixKindPriority.DEFAULT, "Add '@override' annotation"); static const ADD_OVERRIDE_MULTI = FixKind(
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart index ed02e6a..2ea42d8 100644 --- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -32,7 +32,10 @@ TypeSystemImpl get _typeSystem => _resolver.typeSystem; void resolve(FunctionExpressionImpl node) { - var isFunctionDeclaration = node.parent is FunctionDeclaration; + var parent = node.parent; + // Note: `isFunctionDeclaration` must have an explicit type to work around + // https://github.com/dart-lang/language/issues/1785. + bool isFunctionDeclaration = parent is FunctionDeclaration; var body = node.body; if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) { @@ -53,6 +56,11 @@ } node.visitChildren(_resolver); + if (isFunctionDeclaration) { + // A side effect of visiting the children is that the parameters are now + // in scope, so we can visit the documentation comment now. + parent.documentationComment?.accept(_resolver); + } _resolve2(node); if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 4c75b2a..209b132 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -739,13 +739,6 @@ } } - /// Visit the given [comment] if it is not `null`. - void safelyVisitComment(Comment? comment) { - if (comment != null) { - super.visitComment(comment); - } - } - void setReadElement(Expression node, Element? element) { DartType readType = DynamicTypeImpl.instance; if (node is IndexExpression) { @@ -1097,52 +1090,6 @@ } @override - void visitComment(Comment node) { - var parent = node.parent; - if (parent is FunctionDeclaration || - parent is FunctionTypeAlias || - parent is ConstructorDeclaration) { - return; - } - - // TODO(scheglov) Change corresponding visiting places to visit comments - // with name scopes set for correct comments resolution. - if (parent is GenericTypeAlias) { - var element = parent.declaredElement as TypeAliasElement; - var outerScope = nameScope; - try { - nameScope = TypeParameterScope(nameScope, element.typeParameters); - - var aliasedElement = element.aliasedElement; - if (aliasedElement is GenericFunctionTypeElement) { - nameScope = FormalParameterScope( - TypeParameterScope(nameScope, aliasedElement.typeParameters), - aliasedElement.parameters, - ); - } - - super.visitComment(node); - return; - } finally { - nameScope = outerScope; - } - } else if (parent is MethodDeclaration) { - var outerScope = nameScope; - try { - var element = parent.declaredElement!; - nameScope = FormalParameterScope(nameScope, element.parameters); - - super.visitComment(node); - return; - } finally { - nameScope = outerScope; - } - } - - super.visitComment(node); - } - - @override void visitCommentReference(CommentReference node) { // // We do not visit the identifier because it needs to be visited in the @@ -1246,7 +1193,6 @@ // element resolver and type analyzer to visit the constructor declaration. node.accept(elementResolver); node.accept(typeAnalyzer); - safelyVisitComment(node.documentationComment); } @override @@ -1480,12 +1426,6 @@ } @override - void visitFunctionDeclarationInScope(FunctionDeclaration node) { - super.visitFunctionDeclarationInScope(node); - safelyVisitComment(node.documentationComment); - } - - @override void visitFunctionExpression(covariant FunctionExpressionImpl node) { // Note: we have to update _enclosingFunction because we don't make use of // super.visitFunctionExpression. @@ -1536,12 +1476,6 @@ } @override - void visitFunctionTypeAliasInScope(FunctionTypeAlias node) { - super.visitFunctionTypeAliasInScope(node); - safelyVisitComment(node.documentationComment); - } - - @override void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { super.visitFunctionTypedFormalParameter(node); node.accept(elementResolver); @@ -1558,12 +1492,6 @@ } @override - void visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) { - super.visitGenericTypeAliasInFunctionScope(node); - safelyVisitComment(node.documentationComment); - } - - @override void visitHideCombinator(HideCombinator node) {} @override @@ -2574,7 +2502,6 @@ try { ConstructorElement element = node.declaredElement!; - node.documentationComment?.accept(this); node.metadata.accept(this); node.returnType.accept(this); node.name?.accept(this); @@ -2604,6 +2531,7 @@ } void visitConstructorDeclarationInScope(ConstructorDeclaration node) { + node.documentationComment?.accept(this); node.body.accept(this); } @@ -2801,7 +2729,6 @@ void visitFunctionDeclarationInScope(FunctionDeclaration node) { // Note: we don't visit metadata because it's not inside the function's type // parameter scope. It was already visited in [visitFunctionDeclaration]. - node.documentationComment?.accept(this); node.returnType?.accept(this); node.name.accept(this); node.functionExpression.accept(this); @@ -2809,9 +2736,11 @@ @override void visitFunctionExpression(FunctionExpression node) { - if (node.parent is FunctionDeclaration) { + var parent = node.parent; + if (parent is FunctionDeclaration) { // We have already created a function scope and don't need to do so again. super.visitFunctionExpression(node); + parent.documentationComment?.accept(this); return; } @@ -2848,11 +2777,13 @@ // Note: we don't visit metadata because it's not inside the function type // alias's type parameter scope. It was already visited in // [visitFunctionTypeAlias]. - node.documentationComment?.accept(this); node.returnType?.accept(this); node.name.accept(this); node.typeParameters?.accept(this); node.parameters.accept(this); + // Visiting the parameters added them to the scope as a side effect. So it + // is safe to visit the documentation comment now. + node.documentationComment?.accept(this); } @override @@ -2917,21 +2848,20 @@ var aliasedElement = element.aliasedElement; if (aliasedElement is GenericFunctionTypeElement) { - nameScope = FormalParameterScope(nameScope, aliasedElement.parameters); - visitGenericTypeAliasInFunctionScope(node); + nameScope = FormalParameterScope( + TypeParameterScope(nameScope, aliasedElement.typeParameters), + aliasedElement.parameters); } + node.documentationComment?.accept(this); } finally { nameScope = outerScope; } } - void visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) {} - void visitGenericTypeAliasInScope(GenericTypeAlias node) { // Note: we don't visit metadata because it's not inside the generic type // alias's type parameter scope. It was already visited in // [visitGenericTypeAlias]. - node.documentationComment?.accept(this); node.name.accept(this); node.typeParameters?.accept(this); node.type.accept(this); @@ -2978,11 +2908,13 @@ void visitMethodDeclarationInScope(MethodDeclaration node) { // Note: we don't visit metadata because it's not inside the method's type // parameter scope. It was already visited in [visitMethodDeclaration]. - node.documentationComment?.accept(this); node.returnType?.accept(this); node.name.accept(this); node.typeParameters?.accept(this); node.parameters?.accept(this); + // Visiting the parameters added them to the scope as a side effect. So it + // is safe to visit the documentation comment now. + node.documentationComment?.accept(this); node.body.accept(this); }
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart index b2bceea..1c5c4b3 100644 --- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -14,9 +14,6 @@ main() { defineReflectiveSuite(() { defineReflectiveTests(AstRewriteMethodInvocationTest); - defineReflectiveTests( - AstRewriteMethodInvocationWithNonFunctionTypeAliasesTest, - ); }); } @@ -99,6 +96,46 @@ _assertArgumentList(invocation.argumentList, ['0']); } + test_targetNull_typeAlias_interfaceType() async { + await assertNoErrorsInCode(r''' +class A<T, U> { + A(int _); +} + +typedef X<T, U> = A<T, U>; + +void f() { + X<int, String>(0); +} +'''); + + var creation = findNode.instanceCreation('X<int, String>(0);'); + assertInstanceCreation( + creation, + findElement.class_('A'), + 'A<int, String>', + expectedConstructorMember: true, + expectedSubstitution: {'T': 'int', 'U': 'String'}, + expectedTypeNameElement: findElement.typeAlias('X'), + ); + _assertArgumentList(creation.argumentList, ['0']); + } + + test_targetNull_typeAlias_Never() async { + await assertErrorsInCode(r''' +typedef X = Never; + +void f() { + X(0); +} +''', [ + error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION, 33, 1), + ]); + + // Not rewritten. + findNode.methodInvocation('X(0)'); + } + test_targetPrefixedIdentifier_prefix_class_constructor() async { newFile('$testPackageLibPath/a.dart', content: r''' class A<T> { @@ -192,6 +229,39 @@ _assertArgumentList(invocation.argumentList, ['0']); } + test_targetPrefixedIdentifier_typeAlias_interfaceType_constructor() async { + newFile('$testPackageLibPath/a.dart', content: r''' +class A<T> { + A.named(T a); +} + +typedef X<T> = A<T>; +'''); + + await assertNoErrorsInCode(r''' +import 'a.dart' as prefix; + +void f() { + prefix.X.named(0); +} +'''); + + var importFind = findElement.importFind('package:test/a.dart'); + + var creation = findNode.instanceCreation('X.named(0);'); + assertInstanceCreation( + creation, + importFind.class_('A'), + 'A<int>', + constructorName: 'named', + expectedConstructorMember: true, + expectedSubstitution: {'T': 'int'}, + expectedPrefix: findElement.prefix('prefix'), + expectedTypeNameElement: importFind.typeAlias('X'), + ); + _assertArgumentList(creation.argumentList, ['0']); + } + test_targetSimpleIdentifier_class_constructor() async { await assertNoErrorsInCode(r''' class A<T> { @@ -346,6 +416,32 @@ _assertArgumentList(invocation.argumentList, ['0']); } + test_targetSimpleIdentifier_typeAlias_interfaceType_constructor() async { + await assertNoErrorsInCode(r''' +class A<T> { + A.named(T a); +} + +typedef X<T> = A<T>; + +void f() { + X.named(0); +} +'''); + + var creation = findNode.instanceCreation('X.named(0);'); + assertInstanceCreation( + creation, + findElement.class_('A'), + 'A<int>', + constructorName: 'named', + expectedConstructorMember: true, + expectedSubstitution: {'T': 'int'}, + expectedTypeNameElement: findElement.typeAlias('X'), + ); + _assertArgumentList(creation.argumentList, ['0']); + } + void _assertArgumentList( ArgumentList argumentList, List<String> expectedArguments, @@ -388,106 +484,3 @@ expect(argumentStrings, expectedArguments); } } - -@reflectiveTest -class AstRewriteMethodInvocationWithNonFunctionTypeAliasesTest - extends PubPackageResolutionTest with AstRewriteMethodInvocationTestCases { - test_targetNull_typeAlias_interfaceType() async { - await assertNoErrorsInCode(r''' -class A<T, U> { - A(int _); -} - -typedef X<T, U> = A<T, U>; - -void f() { - X<int, String>(0); -} -'''); - - var creation = findNode.instanceCreation('X<int, String>(0);'); - assertInstanceCreation( - creation, - findElement.class_('A'), - 'A<int, String>', - expectedConstructorMember: true, - expectedSubstitution: {'T': 'int', 'U': 'String'}, - expectedTypeNameElement: findElement.typeAlias('X'), - ); - _assertArgumentList(creation.argumentList, ['0']); - } - - test_targetNull_typeAlias_Never() async { - await assertErrorsInCode(r''' -typedef X = Never; - -void f() { - X(0); -} -''', [ - error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION, 33, 1), - ]); - - // Not rewritten. - findNode.methodInvocation('X(0)'); - } - - test_targetPrefixedIdentifier_typeAlias_interfaceType_constructor() async { - newFile('$testPackageLibPath/a.dart', content: r''' -class A<T> { - A.named(T a); -} - -typedef X<T> = A<T>; -'''); - - await assertNoErrorsInCode(r''' -import 'a.dart' as prefix; - -void f() { - prefix.X.named(0); -} -'''); - - var importFind = findElement.importFind('package:test/a.dart'); - - var creation = findNode.instanceCreation('X.named(0);'); - assertInstanceCreation( - creation, - importFind.class_('A'), - 'A<int>', - constructorName: 'named', - expectedConstructorMember: true, - expectedSubstitution: {'T': 'int'}, - expectedPrefix: findElement.prefix('prefix'), - expectedTypeNameElement: importFind.typeAlias('X'), - ); - _assertArgumentList(creation.argumentList, ['0']); - } - - test_targetSimpleIdentifier_typeAlias_interfaceType_constructor() async { - await assertNoErrorsInCode(r''' -class A<T> { - A.named(T a); -} - -typedef X<T> = A<T>; - -void f() { - X.named(0); -} -'''); - - var creation = findNode.instanceCreation('X.named(0);'); - assertInstanceCreation( - creation, - findElement.class_('A'), - 'A<int>', - constructorName: 'named', - expectedConstructorMember: true, - expectedSubstitution: {'T': 'int'}, - expectedTypeNameElement: findElement.typeAlias('X'), - ); - _assertArgumentList(creation.argumentList, ['0']); - } -}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/equality_expressions_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/equality_expressions_test.dart index d56dc4a..bc5d454 100644 --- a/pkg/analyzer/test/src/dart/resolution/type_inference/equality_expressions_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/type_inference/equality_expressions_test.dart
@@ -9,14 +9,16 @@ main() { defineReflectiveSuite(() { defineReflectiveTests(EqualTest); - defineReflectiveTests(EqualWithNullSafetyTest); + defineReflectiveTests(EqualWithoutNullSafetyTest); defineReflectiveTests(NotEqualTest); - defineReflectiveTests(NotEqualWithNullSafetyTest); + defineReflectiveTests(NotEqualWithoutNullSafetyTest); }); } @reflectiveTest -class EqualTest extends PubPackageResolutionTest with WithoutNullSafetyMixin { +class EqualTest extends PubPackageResolutionTest with EqualTestCases {} + +mixin EqualTestCases on PubPackageResolutionTest { test_simple() async { await resolveTestCode(''' void f(Object a, Object b) { @@ -29,11 +31,13 @@ } @reflectiveTest -class EqualWithNullSafetyTest extends EqualTest with WithNullSafetyMixin {} +class EqualWithoutNullSafetyTest extends PubPackageResolutionTest + with EqualTestCases, WithoutNullSafetyMixin {} @reflectiveTest -class NotEqualTest extends PubPackageResolutionTest - with WithoutNullSafetyMixin { +class NotEqualTest extends PubPackageResolutionTest with NotEqualTestCases {} + +mixin NotEqualTestCases on PubPackageResolutionTest { test_simple() async { await resolveTestCode(''' void f(Object a, Object b) { @@ -46,5 +50,5 @@ } @reflectiveTest -class NotEqualWithNullSafetyTest extends NotEqualTest with WithNullSafetyMixin { -} +class NotEqualWithoutNullSafetyTest extends PubPackageResolutionTest + with NotEqualTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/logical_boolean_expressions_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/logical_boolean_expressions_test.dart index 209ac2b..bb81efe 100644 --- a/pkg/analyzer/test/src/dart/resolution/type_inference/logical_boolean_expressions_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/type_inference/logical_boolean_expressions_test.dart
@@ -9,29 +9,14 @@ main() { defineReflectiveSuite(() { defineReflectiveTests(LogicalAndTest); - defineReflectiveTests(LogicalAndWithNullSafetyTest); + defineReflectiveTests(LogicalAndWithoutNullSafetyTest); defineReflectiveTests(LogicalOrTest); - defineReflectiveTests(LogicalOrWithNullSafetyTest); + defineReflectiveTests(LogicalOrWithoutNullSafetyTest); }); } @reflectiveTest -class LogicalAndTest extends PubPackageResolutionTest - with WithoutNullSafetyMixin { - test_upward() async { - await resolveTestCode(''' -void f(bool a, bool b) { - var c = a && b; - print(c); -} -'''); - assertType(findNode.simple('c)'), 'bool'); - } -} - -@reflectiveTest -class LogicalAndWithNullSafetyTest extends LogicalAndTest - with WithNullSafetyMixin { +class LogicalAndTest extends PubPackageResolutionTest with LogicalAndTestCases { @failingTest test_downward() async { await resolveTestCode(''' @@ -47,13 +32,11 @@ } } -@reflectiveTest -class LogicalOrTest extends PubPackageResolutionTest - with WithoutNullSafetyMixin { +mixin LogicalAndTestCases on PubPackageResolutionTest { test_upward() async { await resolveTestCode(''' void f(bool a, bool b) { - var c = a || b; + var c = a && b; print(c); } '''); @@ -62,8 +45,11 @@ } @reflectiveTest -class LogicalOrWithNullSafetyTest extends LogicalOrTest - with WithNullSafetyMixin { +class LogicalAndWithoutNullSafetyTest extends PubPackageResolutionTest + with LogicalAndTestCases, WithoutNullSafetyMixin {} + +@reflectiveTest +class LogicalOrTest extends PubPackageResolutionTest with LogicalOrTestCases { @failingTest test_downward() async { await resolveTestCode(''' @@ -78,3 +64,19 @@ assertInvokeType(findNode.methodInvocation('b('), 'bool Function()'); } } + +mixin LogicalOrTestCases on PubPackageResolutionTest { + test_upward() async { + await resolveTestCode(''' +void f(bool a, bool b) { + var c = a || b; + print(c); +} +'''); + assertType(findNode.simple('c)'), 'bool'); + } +} + +@reflectiveTest +class LogicalOrWithoutNullSafetyTest extends PubPackageResolutionTest + with LogicalOrTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/type_test_expressions_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/type_test_expressions_test.dart index 7e9f8fe..3b14b09 100644 --- a/pkg/analyzer/test/src/dart/resolution/type_inference/type_test_expressions_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/type_inference/type_test_expressions_test.dart
@@ -9,14 +9,16 @@ main() { defineReflectiveSuite(() { defineReflectiveTests(IsNotTest); - defineReflectiveTests(IsNotWithNullSafetyTest); + defineReflectiveTests(IsNotWithoutNullSafetyTest); defineReflectiveTests(IsTest); - defineReflectiveTests(IsWithNullSafetyTest); + defineReflectiveTests(IsWithoutNullSafetyTest); }); } @reflectiveTest -class IsNotTest extends PubPackageResolutionTest with WithoutNullSafetyMixin { +class IsNotTest extends PubPackageResolutionTest with IsNotTestCases {} + +mixin IsNotTestCases on PubPackageResolutionTest { test_simple() async { await resolveTestCode(''' void f(Object a) { @@ -29,10 +31,13 @@ } @reflectiveTest -class IsNotWithNullSafetyTest extends IsNotTest with WithNullSafetyMixin {} +class IsNotWithoutNullSafetyTest extends PubPackageResolutionTest + with IsNotTestCases, WithoutNullSafetyMixin {} @reflectiveTest -class IsTest extends PubPackageResolutionTest with WithoutNullSafetyMixin { +class IsTest extends PubPackageResolutionTest with IsTestCases {} + +mixin IsTestCases on PubPackageResolutionTest { test_simple() async { await resolveTestCode(''' void f(Object a) { @@ -45,4 +50,5 @@ } @reflectiveTest -class IsWithNullSafetyTest extends IsTest with WithNullSafetyMixin {} +class IsWithoutNullSafetyTest extends PubPackageResolutionTest + with IsTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart index 30de480..de079aa 100644 --- a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart +++ b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
@@ -10,15 +10,59 @@ main() { defineReflectiveSuite(() { defineReflectiveTests(AmbiguousSetOrMapLiteralBothTest); - defineReflectiveTests(AmbiguousSetOrMapLiteralBothWithNullSafetyTest); + defineReflectiveTests(AmbiguousSetOrMapLiteralBothWithoutNullSafetyTest); defineReflectiveTests(AmbiguousSetOrMapLiteralEitherTest); - defineReflectiveTests(AmbiguousSetOrMapLiteralEitherWithNullSafetyTest); + defineReflectiveTests(AmbiguousSetOrMapLiteralEitherWithoutNullSafetyTest); }); } @reflectiveTest class AmbiguousSetOrMapLiteralBothTest extends PubPackageResolutionTest - with WithoutNullSafetyMixin { + with AmbiguousSetOrMapLiteralBothTestCases { + test_map_keyNonNullable_valueNullable() async { + await assertNoErrorsInCode(''' +f(Map<int, int?> map) { + return {...map}; +} +'''); + } + + test_map_keyNullable_valueNonNullable() async { + await assertNoErrorsInCode(''' +f(Map<int?, int> map) { + return {...map}; +} +'''); + } + + test_map_keyNullable_valueNullable() async { + await assertNoErrorsInCode(''' +f(Map<int?, int?> map) { + return {...map}; +} +'''); + } + + test_set_elementNullable() async { + await assertNoErrorsInCode(''' +f(Set<int?> set) { + return {...set}; +} +'''); + } + + test_setAndMap_nullable() async { + await assertErrorsInCode(''' +f(Map<int?, int> map, Set<int?> set) { + return {...set, ...map}; +} +''', [ + error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 48, 16), + ]); + } +} + +mixin AmbiguousSetOrMapLiteralBothTestCases on PubPackageResolutionTest { test_map() async { await assertNoErrorsInCode(''' f(Map<int, int> map) { @@ -63,54 +107,15 @@ } @reflectiveTest -class AmbiguousSetOrMapLiteralBothWithNullSafetyTest - extends AmbiguousSetOrMapLiteralBothTest with WithNullSafetyMixin { - test_map_keyNonNullable_valueNullable() async { - await assertNoErrorsInCode(''' -f(Map<int, int?> map) { - return {...map}; -} -'''); - } - - test_map_keyNullable_valueNonNullable() async { - await assertNoErrorsInCode(''' -f(Map<int?, int> map) { - return {...map}; -} -'''); - } - - test_map_keyNullable_valueNullable() async { - await assertNoErrorsInCode(''' -f(Map<int?, int?> map) { - return {...map}; -} -'''); - } - - test_set_elementNullable() async { - await assertNoErrorsInCode(''' -f(Set<int?> set) { - return {...set}; -} -'''); - } - - test_setAndMap_nullable() async { - await assertErrorsInCode(''' -f(Map<int?, int> map, Set<int?> set) { - return {...set, ...map}; -} -''', [ - error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 48, 16), - ]); - } -} +class AmbiguousSetOrMapLiteralBothWithoutNullSafetyTest + extends PubPackageResolutionTest + with AmbiguousSetOrMapLiteralBothTestCases, WithoutNullSafetyMixin {} @reflectiveTest class AmbiguousSetOrMapLiteralEitherTest extends PubPackageResolutionTest - with WithoutNullSafetyMixin { + with AmbiguousSetOrMapLiteralEitherTestCases {} + +mixin AmbiguousSetOrMapLiteralEitherTestCases on PubPackageResolutionTest { test_invalidPrefixOperator() async { // Guard against an exception being thrown. await assertErrorsInCode(''' @@ -132,5 +137,6 @@ } @reflectiveTest -class AmbiguousSetOrMapLiteralEitherWithNullSafetyTest - extends AmbiguousSetOrMapLiteralEitherTest with WithNullSafetyMixin {} +class AmbiguousSetOrMapLiteralEitherWithoutNullSafetyTest + extends PubPackageResolutionTest + with AmbiguousSetOrMapLiteralEitherTestCases, WithoutNullSafetyMixin {}
diff --git a/tools/VERSION b/tools/VERSION index 5b78760..d457a23 100644 --- a/tools/VERSION +++ b/tools/VERSION
@@ -27,5 +27,5 @@ MAJOR 2 MINOR 14 PATCH 0 -PRERELEASE 387 +PRERELEASE 388 PRERELEASE_PATCH 0 \ No newline at end of file