Skip to content

Commit b5b45ff

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Issue 38953. Exit the unit element walker on enter into a directive.
[email protected] Bug: #38953 Change-Id: I54e84e28f5d576bcd50c8bb10e99aefdae725c25 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/125528 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 1e7d4fd commit b5b45ff

2 files changed

Lines changed: 29 additions & 12 deletions

File tree

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,12 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
394394

395395
@override
396396
void visitExportDirective(ExportDirective node) {
397-
super.visitExportDirective(node);
398-
if (node.element != null) {
399-
_setElementAnnotations(node.metadata, node.element.metadata);
400-
}
397+
_withElementWalker(null, () {
398+
super.visitExportDirective(node);
399+
if (node.element != null) {
400+
_setElementAnnotations(node.metadata, node.element.metadata);
401+
}
402+
});
401403
}
402404

403405
@override
@@ -707,10 +709,12 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
707709

708710
@override
709711
void visitImportDirective(ImportDirective node) {
710-
super.visitImportDirective(node);
711-
if (node.element != null) {
712-
_setElementAnnotations(node.metadata, node.element.metadata);
713-
}
712+
_withElementWalker(null, () {
713+
super.visitImportDirective(node);
714+
if (node.element != null) {
715+
_setElementAnnotations(node.metadata, node.element.metadata);
716+
}
717+
});
714718
}
715719

716720
@override
@@ -812,10 +816,12 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
812816

813817
@override
814818
void visitPartDirective(PartDirective node) {
815-
super.visitPartDirective(node);
816-
if (node.element != null) {
817-
_setElementAnnotations(node.metadata, node.element.metadata);
818-
}
819+
_withElementWalker(null, () {
820+
super.visitPartDirective(node);
821+
if (node.element != null) {
822+
_setElementAnnotations(node.metadata, node.element.metadata);
823+
}
824+
});
819825
}
820826

821827
@override

pkg/analyzer/test/generated/invalid_code_test.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,17 @@ library c;
213213
''');
214214
}
215215

216+
test_fuzz_38953() async {
217+
// When we enter a directive, we should stop using the element walker
218+
// of the unit, just like when we enter a method body. Even though using
219+
// interpolation is not allowed in any directives.
220+
await _assertCanBeAnalyzed(r'''
221+
import '${[for(var v = 0;;) v]}';
222+
export '${[for(var v = 0;;) v]}';
223+
part '${[for(var v = 0;;) v]}';
224+
''');
225+
}
226+
216227
test_genericFunction_asTypeArgument_ofUnresolvedClass() async {
217228
await _assertCanBeAnalyzed(r'''
218229
C<int Function()> c;

0 commit comments

Comments
 (0)