From 3c2e85178047c1bb44d9a35b89c1940d4801973b Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Sat, 12 Dec 2020 17:13:15 +0000 Subject: [PATCH] Fix for crash when function expression has empty body. FAILURE: _(:<>(o;?(a(@([ [NoSuchMethodError: The getter 'contextType' was called on null. Receiver: null Tried calling: contextType, #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) #1 FunctionExpressionResolver.resolve (package:analyzer/src/dart/resolver/function_expression_resolver.dart:72:35) #2 ResolverVisitor.visitFunctionExpression (package:analyzer/src/generated/resolver.dart:1424:37) #3 FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:5004:49) #4 ResolverVisitor.visitConditionalExpression (package:analyzer/src/generated/resolver.dart:1068:16) #5 ConditionalExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:2265:15) #6 DefaultFormalParameterImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:3008:20) #7 ResolverVisitor.visitNode (package:analyzer/src/generated/resolver.dart:1710:10) #8 UnifyingAstVisitor.visitDefaultFormalParameter (package:analyzer/dart/ast/visitor.dart:3198:65) #9 ResolverVisitor.visitDefaultFormalParameter (package:analyzer/src/generated/resolver.dart:1206:11) #10 DefaultFormalParameterImpl.accept (package:analyzer/src/dart/ast/ast.dart:3003:15) #11 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7611:20) #12 FormalParameterListImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:4493:17) #13 ResolverVisitor.visitNode (package:analyzer/src/generated/resolver.dart:1710:10) #14 UnifyingAstVisitor.visitFormalParameterList (package:analyzer/dart/ast/visitor.dart:3258:59) #15 ScopedVisitor.visitFormalParameterList (package:analyzer/src/generated/resolver.dart:2684:11) #16 FormalParameterListImpl.accept (package:analyzer/src/dart/ast/ast.dart:4489:49) #17 FunctionExpressionImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:5009:18) #18 FunctionExpressionResolver.resolve (package:analyzer/src/dart/resolver/function_expression_resolver.dart:65:10) #19 ResolverVisitor.visitFunctionExpression (package:analyzer/src/generated/resolver.dart:1415:35) #20 FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:5004:49) #21 FunctionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:4873:26) #22 ResolverVisitor.visitNode (package:analyzer/src/generated/resolver.dart:1710:10) #23 UnifyingAstVisitor.visitFunctionDeclaration (package:analyzer/dart/ast/visitor.dart:3271:59) #24 ScopedVisitor.visitFunctionDeclarationInScope (package:analyzer/src/generated/resolver.dart:2749:11) #25 ResolverVisitor.visitFunctionDeclarationInScope (package:analyzer/src/generated/resolver.dart:1405:11) #26 ScopedVisitor.visitFunctionDeclaration (package:analyzer/src/generated/resolver.dart:2742:7) #27 ResolverVisitor.visitFunctionDeclaration (package:analyzer/src/generated/resolver.dart:1374:11) #28 FunctionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:4866:49) #29 ResolverVisitor.visitCompilationUnit (package:analyzer/src/generated/resolver.dart:1055:23) #30 CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2134:49) #31 LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:706:10) Change-Id: I62cde978d075bbafacb1b429e87049ca5d54d268 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175907 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../lib/src/dart/resolver/function_expression_resolver.dart | 2 +- pkg/analyzer/lib/src/generated/resolver.dart | 2 +- pkg/analyzer/test/generated/invalid_code_test.dart | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) 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 0f3a2b1d038c2..aec4def2ce6fd 100644 --- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart @@ -69,7 +69,7 @@ class FunctionExpressionResolver { if (_flowAnalysis.flow != null && !isFunctionDeclaration) { var bodyContext = BodyInferenceContext.of(node.body); _resolver.checkForBodyMayCompleteNormally( - returnType: bodyContext.contextType, + returnType: bodyContext?.contextType, body: body, errorNode: body, ); diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 1d969028ba208..3467a0cd320b5 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -1166,8 +1166,8 @@ class ResolverVisitor extends ScopedVisitor { super.visitConstructorDeclaration(node); if (_flowAnalysis != null) { - var bodyContext = BodyInferenceContext.of(node.body); if (node.factoryKeyword != null) { + var bodyContext = BodyInferenceContext.of(node.body); checkForBodyMayCompleteNormally( returnType: bodyContext?.contextType, body: node.body, diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart index 6fd7955948826..4464ab9d75953 100644 --- a/pkg/analyzer/test/generated/invalid_code_test.dart +++ b/pkg/analyzer/test/generated/invalid_code_test.dart @@ -389,6 +389,12 @@ class B { @reflectiveTest class InvalidCodeWithNullSafetyTest extends PubPackageResolutionTest with WithNullSafetyMixin { + test_functionExpression_emptyBody() async { + await _assertCanBeAnalyzed(r''' +var v = (); +'''); + } + test_issue_40837() async { await _assertCanBeAnalyzed(''' class A {