Skip to content

Commit cec29e4

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Infer original expression in SyntheticExpressionJudgment.
Change-Id: I91a27d06ccf4197274fc96597d384ba4e2335dbd Reviewed-on: https://dart-review.googlesource.com/68426 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent b0de4d8 commit cec29e4

7 files changed

+24
-45
lines changed

pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -992,30 +992,6 @@ class CompileTimeErrorCodeTest_Kernel extends CompileTimeErrorCodeTest_Driver {
992992
await super.test_optionalParameterInOperator_positional();
993993
}
994994

995-
@override
996-
@failingTest
997-
test_prefix_conditionalPropertyAccess_call() async {
998-
await super.test_prefix_conditionalPropertyAccess_call();
999-
}
1000-
1001-
@override
1002-
@failingTest
1003-
test_prefix_conditionalPropertyAccess_call_loadLibrary() async {
1004-
await super.test_prefix_conditionalPropertyAccess_call_loadLibrary();
1005-
}
1006-
1007-
@override
1008-
@failingTest
1009-
test_prefix_conditionalPropertyAccess_get() async {
1010-
await super.test_prefix_conditionalPropertyAccess_get();
1011-
}
1012-
1013-
@override
1014-
@failingTest
1015-
test_prefix_conditionalPropertyAccess_get_loadLibrary() async {
1016-
return super.test_prefix_conditionalPropertyAccess_get_loadLibrary();
1017-
}
1018-
1019995
@override
1020996
@failingTest
1021997
test_prefix_conditionalPropertyAccess_set() async {
@@ -1052,12 +1028,6 @@ class CompileTimeErrorCodeTest_Kernel extends CompileTimeErrorCodeTest_Driver {
10521028
return super.test_prefixCollidesWithTopLevelMembers_type();
10531029
}
10541030

1055-
@override
1056-
@failingTest
1057-
test_prefixNotFollowedByDot_conditionalMethodInvocation() async {
1058-
await super.test_prefixNotFollowedByDot_conditionalMethodInvocation();
1059-
}
1060-
10611031
@override
10621032
@failingTest
10631033
test_privateCollisionInClassTypeAlias_mixinAndMixin() async {

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4018,19 +4018,21 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
40184018
{List<LocatedMessage> context}) {
40194019
// TODO(askesc): Produce explicit error expression wrapping the original.
40204020
// See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
4021-
return new SyntheticExpressionJudgment(new Let(
4022-
new VariableDeclaration.forValue(new SyntheticExpressionJudgment(
4023-
buildCompileTimeError(
4024-
message.messageObject, message.charOffset, message.length,
4025-
context: context)))
4026-
..fileOffset = forest.readOffset(expression),
4021+
return new SyntheticExpressionJudgment(
40274022
new Let(
4028-
new VariableDeclaration.forValue(expression)
4023+
new VariableDeclaration.forValue(new SyntheticExpressionJudgment(
4024+
buildCompileTimeError(
4025+
message.messageObject, message.charOffset, message.length,
4026+
context: context)))
40294027
..fileOffset = forest.readOffset(expression),
4030-
forest.literalNull(null)
4028+
new Let(
4029+
new VariableDeclaration.forValue(expression)
4030+
..fileOffset = forest.readOffset(expression),
4031+
forest.literalNull(null)
4032+
..fileOffset = forest.readOffset(expression))
40314033
..fileOffset = forest.readOffset(expression))
4032-
..fileOffset = forest.readOffset(expression))
4033-
..fileOffset = forest.readOffset(expression));
4034+
..fileOffset = forest.readOffset(expression),
4035+
original: expression);
40344036
}
40354037

40364038
Expression buildFallThroughError(int charOffset) {

pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2797,9 +2797,13 @@ class InvalidPropertyGetJudgment extends SyntheticExpressionJudgment {
27972797
/// These expressions are removed by type inference and replaced with their
27982798
/// desugared equivalents.
27992799
class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
2800+
/// The original expression that is wrapped by this synthetic expression.
2801+
/// Its type will be inferred.
2802+
final Expression original;
2803+
28002804
DartType inferredType;
28012805

2802-
SyntheticExpressionJudgment(Expression desugared)
2806+
SyntheticExpressionJudgment(Expression desugared, {this.original})
28032807
: super(new VariableDeclaration('_', initializer: new NullLiteral()),
28042808
desugared);
28052809

@@ -2814,6 +2818,9 @@ class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
28142818
@override
28152819
Expression infer<Expression, Statement, Initializer, Type>(
28162820
ShadowTypeInferrer inferrer, DartType typeContext) {
2821+
if (original != null) {
2822+
inferrer.inferExpression(original, typeContext, true);
2823+
}
28172824
_replaceWithDesugared();
28182825
inferredType = const DynamicType();
28192826
return null;

pkg/front_end/testcases/regress/issue_29984.dart.direct.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import "dart:core" as core;
55
static method bad() → dynamic {
66
for (core::int i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
77
for (int i = i;; false) {}
8-
^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
8+
^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
99
}
1010
}
1111
static method main() → dynamic {}

pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import "dart:core" as core;
55
static method bad() → dynamic {
66
for (core::int i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
77
for (int i = i;; false) {}
8-
^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
8+
^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
99
}
1010
}
1111
static method main() → dynamic {}

pkg/front_end/testcases/regress/issue_29984.dart.strong.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import "dart:core" as core;
1111
static method bad() → dynamic {
1212
for (core::int i = (let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
1313
for (int i = i;; false) {}
14-
^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
14+
^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
1515
}
1616
}
1717
static method main() → dynamic {}

pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import "dart:core" as core;
1111
static method bad() → dynamic {
1212
for (core::int i = (let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
1313
for (int i = i;; false) {}
14-
^" in let final<BottomType> #t2 = let<BottomType> _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
14+
^" in let final<BottomType> #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
1515
}
1616
}
1717
static method main() → dynamic {}

0 commit comments

Comments
 (0)