From faae2ec2c5c19f7d93bf6a83adf685d1f453eba4 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Tue, 17 Mar 2020 17:16:56 +0000 Subject: [PATCH] Issue 41019. Fix for readType of IndexExpression. Bug: https://github.com/dart-lang/sdk/issues/41019 Change-Id: I861b355c14c6bb30e570bb0c0101871db423ffb0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139821 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../resolver/postfix_expression_resolver.dart | 4 +-- pkg/analyzer/lib/src/task/strong/checker.dart | 12 ++++++--- .../resolution/postfix_expression_test.dart | 25 +++++++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart index e788ced2bbe..5917ebc7daa 100644 --- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart @@ -204,9 +204,7 @@ class PostfixExpressionResolver { operand.accept(_resolver); operand = node.operand; - var operandType = getReadType( - operand, - ); + var operandType = getReadType(operand); var type = _typeSystem.promoteToNonNull(operandType); _inferenceHelper.recordStaticType(node, type); diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart index d46db5f2273..e1a65018914 100644 --- a/pkg/analyzer/lib/src/task/strong/checker.dart +++ b/pkg/analyzer/lib/src/task/strong/checker.dart @@ -37,10 +37,14 @@ DartType getExpressionType( DartType getReadType(Expression expression) { if (expression is IndexExpression) { - var staticElement = expression.auxiliaryElements?.staticElement; - return staticElement == null - ? DynamicTypeImpl.instance - : staticElement.returnType; + var aux = expression.auxiliaryElements; + if (aux != null) { + var staticElement = aux.staticElement; + return staticElement == null + ? DynamicTypeImpl.instance + : staticElement.returnType; + } + return expression.staticType; } { Element setter; diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart index b7faca03619..e80dec78add 100644 --- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart @@ -159,6 +159,31 @@ main(Function f2) { '''); } + test_nullCheck_indexExpression() async { + await assertNoErrorsInCode(r''' +main(Map a) { + int v = a['foo']!; + v; +} +'''); + + assertIndexExpression( + findNode.index('a['), + readElement: elementMatcher( + mapElement.getMethod('[]'), + substitution: {'K': 'String', 'V': 'int'}, + ), + writeElement: null, + type: 'int?', + ); + + assertPostfixExpression( + findNode.postfix(']!'), + element: null, + type: 'int', + ); + } + test_nullCheck_null() async { await assertNoErrorsInCode(''' main(Null x) {