Skip to content

Commit 4bf54b2

Browse files
rishipalcopybara-github
authored andcommitted
Add support for Optional chaining in ReferenceCollectingCallBack pass
PiperOrigin-RevId: 321252042
1 parent 603d343 commit 4bf54b2

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

src/com/google/javascript/jscomp/ReferenceCollectingCallback.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,9 @@ private static boolean isBlockBoundary(Node n, Node parent) {
337337
case OR:
338338
case SWITCH:
339339
case COALESCE:
340+
case OPTCHAIN_GETPROP:
341+
case OPTCHAIN_GETELEM:
342+
case OPTCHAIN_CALL:
340343
// The first child of a conditional is not a boundary,
341344
// but all the rest of the children are.
342345
return n != parent.getFirstChild();

test/com/google/javascript/jscomp/ReferenceCollectingCallbackTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,26 @@ public void afterExitScope(NodeTraversal t, ReferenceMap rm) {
427427
});
428428
}
429429

430+
@Test
431+
public void optionalChaining() {
432+
setLanguage(UNSUPPORTED, UNSUPPORTED);
433+
testBehavior(
434+
"var x = 0; var y = x?.(x = 1)",
435+
new Behavior() {
436+
@Override
437+
public void afterExitScope(NodeTraversal t, ReferenceMap rm) {
438+
if (t.getScope().isGlobal()) {
439+
ReferenceCollection x = rm.getReferences(t.getScope().getVar("x"));
440+
assertThat(x.references).hasSize(3);
441+
assertNode(x.references.get(0).getBasicBlock().getRoot()).hasType(Token.ROOT);
442+
assertNode(x.references.get(1).getBasicBlock().getRoot()).hasType(Token.ROOT);
443+
// first child of `?.` is not a boundary, but the second child is.
444+
assertNode(x.references.get(2).getBasicBlock().getRoot()).hasType(Token.ASSIGN);
445+
}
446+
}
447+
});
448+
}
449+
430450
@Test
431451
public void testThis() {
432452
testBehavior(

0 commit comments

Comments
 (0)