Skip to content

Commit 77202bf

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Resolve invalid 'as' constant expression.
Change-Id: I4d9463fe60a47ec2dc44d5da30d4923b20244e45 Reviewed-on: https://dart-review.googlesource.com/68428 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent cec29e4 commit 77202bf

File tree

5 files changed

+41
-18
lines changed

5 files changed

+41
-18
lines changed

pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3516,6 +3516,23 @@ main() {
35163516
useCFE || Parser.useFasta ? 'StackTrace' : 'dynamic');
35173517
}
35183518

3519+
test_invalid_const_as() async {
3520+
addTestFile(r'''
3521+
class A {
3522+
final int a;
3523+
const A(num b) : a = b as int;
3524+
}
3525+
''');
3526+
await resolveTestFile();
3527+
expect(result.errors, isNotEmpty);
3528+
3529+
var bRef = findNode.simple('b as int');
3530+
assertElement(bRef, findElement.parameter('b'));
3531+
assertType(bRef, 'num');
3532+
3533+
assertTypeName(findNode.typeName('int;'), intElement, 'int');
3534+
}
3535+
35193536
test_invalid_const_constructor_initializer_field_multiple() async {
35203537
addTestFile(r'''
35213538
var a = 0;
@@ -10212,20 +10229,17 @@ class FindElement {
1021210229
}
1021310230

1021410231
for (var accessor in unitElement.accessors) {
10215-
for (var parameter in accessor.parameters) {
10216-
considerParameter(parameter);
10217-
}
10232+
accessor.parameters.forEach(considerParameter);
1021810233
}
1021910234
for (var function in unitElement.functions) {
10220-
for (var parameter in function.parameters) {
10221-
considerParameter(parameter);
10222-
}
10235+
function.parameters.forEach(considerParameter);
1022310236
}
1022410237
for (var class_ in unitElement.types) {
10238+
for (var constructor in class_.constructors) {
10239+
constructor.parameters.forEach(considerParameter);
10240+
}
1022510241
for (var method in class_.methods) {
10226-
for (var parameter in method.parameters) {
10227-
considerParameter(parameter);
10228-
}
10242+
method.parameters.forEach(considerParameter);
1022910243
}
1023010244
}
1023110245
if (parameterElement != null) {

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2280,14 +2280,15 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
22802280
debugEvent("AsOperator");
22812281
DartType type = pop();
22822282
Expression expression = popForValue();
2283+
Expression error;
22832284
if (constantContext != ConstantContext.none) {
2284-
push(buildCompileTimeError(
2285+
error = buildCompileTimeError(
22852286
fasta.templateNotConstantExpression.withArguments('As expression'),
22862287
operator.charOffset,
2287-
operator.length));
2288-
} else {
2289-
push(forest.asExpression(expression, type, operator));
2288+
operator.length);
22902289
}
2290+
push(
2291+
forest.asExpression(expression, type, operator, desugaredError: error));
22912292
}
22922293

22932294
@override

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,11 @@ class Fangorn extends Forest {
288288
}
289289

290290
@override
291-
Expression asExpression(Expression expression, covariant type, Token token) {
291+
Expression asExpression(Expression expression, covariant type, Token token,
292+
{Expression desugaredError}) {
292293
return new AsJudgment(
293-
expression, typeInferenceTokensSaver?.asExpressionTokens(token), type)
294+
expression, typeInferenceTokensSaver?.asExpressionTokens(token), type,
295+
desugaredError: desugaredError)
294296
..fileOffset = offsetForToken(token);
295297
}
296298

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ abstract class Forest {
162162

163163
Expression checkLibraryIsLoaded(covariant dependency);
164164

165-
Expression asExpression(
166-
Expression expression, covariant type, Token location);
165+
Expression asExpression(Expression expression, covariant type, Token location,
166+
{Expression desugaredError});
167167

168168
/// Return a representation of an assert that appears in a constructor's
169169
/// initializer list.

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,12 @@ class ArgumentsJudgment extends Arguments {
203203
/// Shadow object for [AsExpression].
204204
class AsJudgment extends AsExpression implements ExpressionJudgment {
205205
final AsExpressionTokens tokens;
206+
final Expression desugaredError;
206207

207208
DartType inferredType;
208209

209-
AsJudgment(Expression operand, this.tokens, DartType type)
210+
AsJudgment(Expression operand, this.tokens, DartType type,
211+
{this.desugaredError})
210212
: super(operand, type);
211213

212214
ExpressionJudgment get judgment => operand;
@@ -218,6 +220,10 @@ class AsJudgment extends AsExpression implements ExpressionJudgment {
218220
inferredType = type;
219221
inferrer.listener
220222
.asExpression(this, fileOffset, null, tokens, null, inferredType);
223+
if (desugaredError != null) {
224+
parent.replaceChild(this, desugaredError);
225+
parent = null;
226+
}
221227
return null;
222228
}
223229
}

0 commit comments

Comments
 (0)