Skip to content

Commit ba1988e

Browse files
kallentuCommit Queue
authored and
Commit Queue
committed
[analyzer] Replace non-serializable nodes in asserts.
Function expressions and other non-serializable nodes are crashing the asserts in const constructors because they are not being replaced with a marker. Fixes #53075 Bug: #53075 Change-Id: I366e7cbd2853c57aaee358caa93f197e241fbf1b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329240 Reviewed-by: Nate Bosch <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Kallen Tu <[email protected]>
1 parent d9731ac commit ba1988e

File tree

2 files changed

+72
-8
lines changed

2 files changed

+72
-8
lines changed

pkg/analyzer/lib/src/summary2/detach_nodes.dart

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,23 @@ class _Visitor extends GeneralizingElementVisitor<void> {
3434
initializers.forEach(_detachNode);
3535

3636
for (final initializer in initializers) {
37-
if (initializer is ConstructorFieldInitializerImpl) {
38-
final expression = initializer.expression;
39-
final replacement = replaceNotSerializableNode(expression);
40-
initializer.expression = replacement;
41-
} else if (initializer is RedirectingConstructorInvocationImpl) {
42-
_sanitizeArguments(initializer.argumentList.arguments);
43-
} else if (initializer is SuperConstructorInvocationImpl) {
44-
_sanitizeArguments(initializer.argumentList.arguments);
37+
if (initializer is! ConstructorInitializerImpl) continue;
38+
switch (initializer) {
39+
case AssertInitializerImpl(:final condition, :final message):
40+
var conditionReplacement = replaceNotSerializableNode(condition);
41+
initializer.condition = conditionReplacement;
42+
43+
if (message != null) {
44+
var messageReplacement = replaceNotSerializableNode(message);
45+
initializer.message = messageReplacement;
46+
}
47+
case ConstructorFieldInitializerImpl(:final expression):
48+
var replacement = replaceNotSerializableNode(expression);
49+
initializer.expression = replacement;
50+
case RedirectingConstructorInvocationImpl(:final argumentList):
51+
_sanitizeArguments(argumentList.arguments);
52+
case SuperConstructorInvocationImpl(:final argumentList):
53+
_sanitizeArguments(argumentList.arguments);
4554
}
4655
}
4756

pkg/analyzer/test/src/summary/elements_test.dart

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16635,6 +16635,61 @@ library
1663516635
''');
1663616636
}
1663716637

16638+
test_const_invalid_functionExpression_assertInitializer() async {
16639+
var library = await buildLibrary('''
16640+
class A {
16641+
const A() : assert((() => true)());
16642+
}
16643+
''');
16644+
checkElementText(library, r'''
16645+
library
16646+
definingUnit
16647+
classes
16648+
class A @6
16649+
constructors
16650+
const @19
16651+
constantInitializers
16652+
AssertInitializer
16653+
assertKeyword: assert @25
16654+
leftParenthesis: ( @31
16655+
condition: SimpleIdentifier
16656+
token: _notSerializableExpression @-1
16657+
staticElement: <null>
16658+
staticType: null
16659+
rightParenthesis: ) @46
16660+
''');
16661+
}
16662+
16663+
test_const_invalid_functionExpression_assertInitializer_message() async {
16664+
var library = await buildLibrary('''
16665+
class A {
16666+
const A() : assert(b, () => 0);
16667+
}
16668+
''');
16669+
checkElementText(library, r'''
16670+
library
16671+
definingUnit
16672+
classes
16673+
class A @6
16674+
constructors
16675+
const @19
16676+
constantInitializers
16677+
AssertInitializer
16678+
assertKeyword: assert @25
16679+
leftParenthesis: ( @31
16680+
condition: SimpleIdentifier
16681+
token: b @32
16682+
staticElement: <null>
16683+
staticType: InvalidType
16684+
comma: , @33
16685+
message: SimpleIdentifier
16686+
token: _notSerializableExpression @-1
16687+
staticElement: <null>
16688+
staticType: null
16689+
rightParenthesis: ) @42
16690+
''');
16691+
}
16692+
1663816693
test_const_invalid_functionExpression_constructorFieldInitializer() async {
1663916694
var library = await buildLibrary('''
1664016695
class A {

0 commit comments

Comments
 (0)