Resolve invalid return from constructor.
Change-Id: Ibec6d4e307b22fedb78a72531c852480a61cd8eb
Reviewed-on: https://dart-review.googlesource.com/68501
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 8eb13a5..203479c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -3831,6 +3831,32 @@
assertType(aRef, 'int');
}
+ test_invalid_constructor_return_blockBody() async {
+ addTestFile(r'''
+int a = 0;
+class C {
+ C() {
+ return a;
+ }
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+ assertTopGetRef('a;', 'a');
+ }
+
+ test_invalid_constructor_return_expressionBody() async {
+ addTestFile(r'''
+int a = 0;
+class C {
+ C() => a;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+ assertTopGetRef('a;', 'a');
+ }
+
test_invalid_deferred_type_localVariable() async {
addTestFile(r'''
import 'dart:async' deferred as a;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 0429009..dedcf53 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1761,11 +1761,15 @@
bool hasExpression, Token beginToken, Token endToken) {
debugEvent("ReturnStatement");
Expression expression = hasExpression ? popForValue() : null;
+ var statement = forest.returnStatement(beginToken, expression, endToken);
if (expression != null && inConstructor) {
- push(buildCompileTimeErrorStatement(
- fasta.messageConstructorWithReturnType, beginToken.charOffset));
+ Expression error = buildCompileTimeError(
+ fasta.messageConstructorWithReturnType,
+ beginToken.charOffset,
+ lengthForToken(beginToken));
+ push(new InvalidStatementJudgment(error, statement));
} else {
- push(forest.returnStatement(beginToken, expression, endToken));
+ push(statement);
}
}