Skip to content

Commit 6136a0d

Browse files
scheglovCommit Queue
authored andcommitted
Verify parent of child in ResolvedAstPrinter.
Fix found issues. Change-Id: I72f3eed470f0cb474ae9db75ec7ee4f0fd805563 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/262841 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 6d27517 commit 6136a0d

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,10 +1478,13 @@ class CaseClauseImpl extends AstNodeImpl implements CaseClause {
14781478
@override
14791479
final DartPatternImpl pattern;
14801480

1481-
CaseClauseImpl(
1482-
{required this.caseKeyword,
1483-
required this.pattern,
1484-
required this.whenClause});
1481+
CaseClauseImpl({
1482+
required this.caseKeyword,
1483+
required this.pattern,
1484+
required this.whenClause,
1485+
}) {
1486+
_becomeParentOf(pattern);
1487+
}
14851488

14861489
@override
14871490
Token get beginToken => caseKeyword;
@@ -2769,10 +2772,12 @@ class ConstantPatternImpl extends DartPatternImpl implements ConstantPattern {
27692772
@override
27702773
final Token? constKeyword;
27712774

2772-
@override
2773-
ExpressionImpl expression;
2775+
ExpressionImpl _expression;
27742776

2775-
ConstantPatternImpl({required this.constKeyword, required this.expression}) {
2777+
ConstantPatternImpl({
2778+
required this.constKeyword,
2779+
required ExpressionImpl expression,
2780+
}) : _expression = expression {
27762781
_becomeParentOf(expression);
27772782
}
27782783

@@ -2782,6 +2787,13 @@ class ConstantPatternImpl extends DartPatternImpl implements ConstantPattern {
27822787
@override
27832788
Token get endToken => expression.endToken;
27842789

2790+
@override
2791+
ExpressionImpl get expression => _expression;
2792+
2793+
set expression(ExpressionImpl expression) {
2794+
_expression = _becomeParentOf(expression);
2795+
}
2796+
27852797
@override
27862798
ChildEntities get _childEntities => super._childEntities
27872799
..addToken('const', constKeyword)
@@ -10606,6 +10618,7 @@ class RecordTypeAnnotationImpl extends TypeAnnotationImpl
1060610618
required this.rightParenthesis,
1060710619
required this.question,
1060810620
}) {
10621+
_becomeParentOf(namedFields);
1060910622
this.positionalFields._initialize(this, positionalFields);
1061010623
}
1061110624

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,6 +1510,25 @@ class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
15101510
}
15111511
}
15121512

1513+
/// Check that the actual parent of [child] is [parent].
1514+
void _checkParentOfChild(AstNode parent, AstNode child) {
1515+
final actualParent = child.parent;
1516+
if (actualParent == null) {
1517+
fail('''
1518+
No parent.
1519+
Child: (${child.runtimeType}) $child
1520+
Expected parent: (${parent.runtimeType}) $parent
1521+
''');
1522+
} else if (actualParent != parent) {
1523+
fail('''
1524+
Wrong parent.
1525+
Child: (${child.runtimeType}) $child
1526+
Actual parent: (${actualParent.runtimeType}) $actualParent
1527+
Expected parent: (${parent.runtimeType}) $parent
1528+
''');
1529+
}
1530+
}
1531+
15131532
String _elementToReferenceString(Element element) {
15141533
final enclosingElement = element.enclosingElement;
15151534
final reference = (element as ElementImpl).reference;
@@ -1741,14 +1760,15 @@ class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
17411760
if (value is Token) {
17421761
_writeToken(entity.name, value);
17431762
} else if (value is AstNode) {
1763+
_checkParentOfChild(node, value);
17441764
if (value is ArgumentList && skipArgumentList) {
17451765
} else {
17461766
_writeNode(entity.name, value);
17471767
}
17481768
} else if (value is List<Token>) {
17491769
_writeTokenList(entity.name, value);
17501770
} else if (value is List<AstNode>) {
1751-
_writeNodeList(entity.name, value);
1771+
_writeNodeList(node, entity.name, value);
17521772
} else {
17531773
throw UnimplementedError('(${value.runtimeType}) $value');
17541774
}
@@ -1763,11 +1783,12 @@ class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
17631783
}
17641784
}
17651785

1766-
void _writeNodeList(String name, List<AstNode> nodeList) {
1786+
void _writeNodeList(AstNode parent, String name, List<AstNode> nodeList) {
17671787
if (nodeList.isNotEmpty) {
17681788
_writelnWithIndent(name);
17691789
_withIndent(() {
17701790
for (var node in nodeList) {
1791+
_checkParentOfChild(parent, node);
17711792
_sink.write(_indent);
17721793
node.accept(this);
17731794
}

0 commit comments

Comments
 (0)