Version 2.12.0-125.0.dev
Merge commit 'c9854e3453cf34d69ccd520daaa51f6ed112fd0f' into 'dev'
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6fbe5f2..21b7d76 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -739,7 +739,7 @@
void startNullAwareIndexExpression(IndexExpression node) {
if (_migratableAstInfoProvider.isIndexExpressionNullAware(node) &&
- _isNonNullableByDefault) {
+ _flowAnalysis != null) {
_flowAnalysis.flow.nullAwareAccess_rightBegin(
node.target, node.realTarget.staticType ?? typeProvider.dynamicType);
_unfinishedNullShorts.add(node.nullShortingTermination);
@@ -750,7 +750,7 @@
PropertyAccess node,
) {
if (_migratableAstInfoProvider.isPropertyAccessNullAware(node) &&
- _isNonNullableByDefault) {
+ _flowAnalysis != null) {
var target = node.target;
if (target is SimpleIdentifier && target.staticElement is ClassElement) {
// `?.` to access static methods is equivalent to `.`, so do nothing.
@@ -948,7 +948,7 @@
InferenceContext.setTypeFromNode(node.target, node);
node.target.accept(this);
- if (node.isNullAware && _isNonNullableByDefault) {
+ if (node.isNullAware && _flowAnalysis != null) {
_flowAnalysis.flow.nullAwareAccess_rightBegin(
node.target, node.target.staticType ?? typeProvider.dynamicType);
_unfinishedNullShorts.add(node.nullShortingTermination);
@@ -1652,7 +1652,7 @@
target?.accept(this);
if (_migratableAstInfoProvider.isMethodInvocationNullAware(node) &&
- _isNonNullableByDefault) {
+ _flowAnalysis != null) {
if (target is SimpleIdentifier && target.staticElement is ClassElement) {
// `?.` to access static methods is equivalent to `.`, so do nothing.
} else {
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 9652773..fc67be62 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -16,6 +16,19 @@
@reflectiveTest
class IndexExpressionTest extends PubPackageResolutionTest {
+ test_invalid_inDefaultValue_nullAware() async {
+ await assertInvalidTestCode(r'''
+void f({a = b?[0]}) {}
+''');
+
+ assertIndexExpression(
+ findNode.index('[0]'),
+ readElement: null,
+ writeElement: null,
+ type: 'dynamic',
+ );
+ }
+
test_read() async {
await assertNoErrorsInCode(r'''
class A {
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index c1ff99b..92450fb 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -1703,6 +1703,20 @@
assertSuperExpression(invocation.target);
}
+ test_invalid_inDefaultValue_nullAware() async {
+ await assertInvalidTestCode('''
+void f({a = b?.foo()}) {}
+''');
+
+ assertMethodInvocation2(
+ findNode.methodInvocation('?.foo()'),
+ element: null,
+ typeArgumentTypes: [],
+ invokeType: 'dynamic',
+ type: 'dynamic',
+ );
+ }
+
test_namedArgument() async {
var question = typeToStringWithNullability ? '?' : '';
await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 313cd97..645d77a 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -238,6 +238,30 @@
}
}
+ test_invalid_inDefaultValue_nullAware() async {
+ await assertInvalidTestCode('''
+void f({a = b?.foo}) {}
+''');
+
+ assertPropertyAccess2(
+ findNode.propertyAccess('?.foo'),
+ element: null,
+ type: 'dynamic',
+ );
+ }
+
+ test_invalid_inDefaultValue_nullAware_cascade() async {
+ await assertInvalidTestCode('''
+void f({a = b?..foo}) {}
+''');
+
+ assertPropertyAccess2(
+ findNode.propertyAccess('?..foo'),
+ element: null,
+ type: 'dynamic',
+ );
+ }
+
test_ofExtension_read() async {
await assertNoErrorsInCode('''
class A {}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index b91cab9..5e7e81c 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -448,6 +448,13 @@
expectedPrefix: expectedPrefix);
}
+ /// Resolve the [code], and ensure that it can be resolved without a crash,
+ /// and is invalid, i.e. produces a diagnostic.
+ Future<void> assertInvalidTestCode(String code) async {
+ await resolveTestCode(code);
+ assertHasTestErrors();
+ }
+
void assertInvokeType(Expression node, String expected) {
DartType actual;
if (node is BinaryExpression) {
diff --git a/tools/VERSION b/tools/VERSION
index 9d17a5f..7ae2f46 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 124
+PRERELEASE 125
PRERELEASE_PATCH 0
\ No newline at end of file