From bb0c4cede5da48122cb7e228d7cb43ded1b360eb Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Fri, 11 Nov 2022 06:01:30 +0000 Subject: [PATCH] Fix missing identifier crash * Also, fix missing quotes in message * Also, do not report CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER when obviously not a constructor name. Fixes https://github.com/dart-lang/sdk/issues/50439 Change-Id: Idd78790289068bab1c20314d185a9abce1849ea2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/269202 Reviewed-by: Konstantin Shcheglov Commit-Queue: Samuel Rawlins --- .../lib/src/dart/constant/evaluation.dart | 5 +++- pkg/analyzer/lib/src/error/codes.g.dart | 2 +- pkg/analyzer/messages.yaml | 2 +- .../test/generated/constant_test.dart | 26 +++++++++++++++++-- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index 6ea9a2d42b0..e33f9ef4b61 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart @@ -695,7 +695,10 @@ class ConstantVisitor extends UnifyingAstVisitor { @override DartObjectImpl? visitConstructorReference(ConstructorReference node) { - var constructorFunctionType = node.typeOrThrow as FunctionType; + var constructorFunctionType = node.typeOrThrow; + if (constructorFunctionType is! FunctionType) { + return null; + } var classType = constructorFunctionType.returnType as InterfaceType; var typeArguments = classType.typeArguments; // The result is already instantiated during resolution; diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart index 9a3f58b3a23..73b3a882693 100644 --- a/pkg/analyzer/lib/src/error/codes.g.dart +++ b/pkg/analyzer/lib/src/error/codes.g.dart @@ -383,7 +383,7 @@ class CompileTimeErrorCode extends AnalyzerErrorCode { static const CompileTimeErrorCode CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER = CompileTimeErrorCode( 'CLASS_INSTANTIATION_ACCESS_TO_MEMBER', - "The class '{0} doesn't have a constructor named '{1}.", + "The class '{0}' doesn't have a constructor named '{1}'.", correctionMessage: "Try invoking a different constructor, or defining a constructor named " "'{1}'.", diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml index 9707000a0fa..325efc98326 100644 --- a/pkg/analyzer/messages.yaml +++ b/pkg/analyzer/messages.yaml @@ -1548,7 +1548,7 @@ CompileTimeErrorCode: 0: the name of the member CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: sharedName: CLASS_INSTANTIATION_ACCESS_TO_MEMBER - problemMessage: "The class '{0} doesn't have a constructor named '{1}." + problemMessage: "The class '{0}' doesn't have a constructor named '{1}'." correctionMessage: "Try invoking a different constructor, or defining a constructor named '{1}'." comment: |- Parameters: diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart index f60dcdc0be4..de724bd455c 100644 --- a/pkg/analyzer/test/generated/constant_test.dart +++ b/pkg/analyzer/test/generated/constant_test.dart @@ -9,6 +9,7 @@ import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/dart/element/element.dart'; +import 'package:analyzer/src/dart/error/syntactic_errors.dart'; import 'package:analyzer/src/error/codes.dart'; import 'package:analyzer/src/generated/constant.dart'; import 'package:analyzer/src/test_utilities/find_element.dart'; @@ -78,8 +79,8 @@ const x = kIsWeb ? a : b; 1), ]); - var x_result = findElement.topVar('x').evaluationResult; - assertDartObjectText(x_result.value, r''' + var result = findElement.topVar('x').evaluationResult; + assertDartObjectText(result.value, r''' dynamic variable: self::@variable::x '''); @@ -938,6 +939,27 @@ B '''); } + test_unknownConstuctor() async { + await assertErrorsInCode(''' +class C { + const C.named(); +} + +const x = C.(); +''', [ + // TODO(https://github.com/dart-lang/sdk/issues/50441): This should not be + // reported. + error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER, + 45, 8), + error(ParserErrorCode.MISSING_IDENTIFIER, 52, 1), + ]); + + var result = findElement.topVar('x').evaluationResult; + assertDartObjectText(result.value, r''' + +'''); + } + test_variable_alias() async { await resolveTestCode(''' const a = 42;