Skip to content

Commit 7be75b2

Browse files
author
sanex3339
committed
Merge branch 'optional-chaining-support' into nullish-coalescing-support
2 parents ccb7f41 + ba05f20 commit 7be75b2

File tree

4 files changed

+46
-13
lines changed

4 files changed

+46
-13
lines changed

escodegen.js

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,8 @@
103103
Call: 16,
104104
New: 17,
105105
TaggedTemplate: 18,
106-
OptionalMember: 19,
107-
Member: 20,
108-
Primary: 21
106+
Member: 19,
107+
Primary: 20
109108
};
110109

111110
BinaryPrecedence = {
@@ -1899,9 +1898,18 @@
18991898
},
19001899

19011900
CallExpression: function (expr, precedence, flags) {
1902-
var result, i, iz;
1903-
// F_ALLOW_UNPARATH_NEW becomes false.
1904-
result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
1901+
var result,
1902+
i,
1903+
iz,
1904+
exprCalleeFlags = E_TTF;
1905+
1906+
if (expr.callee.type === 'ChainExpression' && expr.callee.expression.optional) {
1907+
// F_ALLOW_UNPARATH_NEW becomes false.
1908+
result = [this.generateExpression(expr.callee, Precedence.Member, exprCalleeFlags)];
1909+
} else {
1910+
// F_ALLOW_UNPARATH_NEW becomes false.
1911+
result = [this.generateExpression(expr.callee, Precedence.Call, exprCalleeFlags)];
1912+
}
19051913

19061914
if (expr.optional) {
19071915
result.push('?.');
@@ -1919,6 +1927,7 @@
19191927
if (!(flags & F_ALLOW_CALL)) {
19201928
return ['(', result, ')'];
19211929
}
1930+
19221931
return parenthesize(result, Precedence.Call, precedence);
19231932
},
19241933

@@ -1956,14 +1965,16 @@
19561965
},
19571966

19581967
MemberExpression: function (expr, precedence, flags) {
1959-
var result, fragment;
1968+
var result,
1969+
fragment,
1970+
exprObjectFlags = (flags & F_ALLOW_CALL) ? E_TTF : E_TFF;
19601971

19611972
if (expr.object.type === 'ChainExpression' && expr.object.expression.optional) {
19621973
// F_ALLOW_UNPARATH_NEW becomes false.
1963-
result = [this.generateExpression(expr.object, Precedence.Member, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
1974+
result = [this.generateExpression(expr.object, Precedence.Member, exprObjectFlags)];
19641975
} else {
19651976
// F_ALLOW_UNPARATH_NEW becomes false.
1966-
result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
1977+
result = [this.generateExpression(expr.object, Precedence.Call, exprObjectFlags)];
19671978
}
19681979

19691980
if (expr.computed) {
@@ -1975,7 +1986,7 @@
19751986
result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
19761987
result.push(']');
19771988
} else {
1978-
if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
1989+
if (!expr.optional && expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
19791990
fragment = toSourceNodeWhenNeeded(result).toString();
19801991
// When the following conditions are all true,
19811992
// 1. No floating point
@@ -1997,7 +2008,7 @@
19972008
}
19982009

19992010
if (precedence === Precedence.Member) {
2000-
return parenthesize(result, Precedence.OptionalMember, precedence);
2011+
return parenthesize(result, Precedence.Call, precedence);
20012012
}
20022013

20032014
return parenthesize(result, Precedence.Member, precedence);

test/compare-acorn-es2020/optional-chaining.expected.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,15 @@ obj[aaa]?.[bbb];
1818
(obj?.[aaa])[bbb];
1919
(obj?.[aaa])?.[bbb];
2020
obj[aaa][bbb][ccc][ddd];
21-
((obj?.[aaa])[bbb]?.[ccc])[ddd];
21+
((obj?.[aaa])[bbb]?.[ccc])[ddd];
22+
1?.a;
23+
obj()();
24+
obj()?.();
25+
obj?.()();
26+
obj?.()?.();
27+
obj()();
28+
obj()?.();
29+
(obj?.())();
30+
(obj?.())?.();
31+
obj()()()();
32+
((obj?.())()?.())();

test/compare-acorn-es2020/optional-chaining.expected.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/compare-acorn-es2020/optional-chaining.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,14 @@ obj?.[aaa]?.[bbb];
1919
(obj?.[aaa])?.[bbb];
2020
((obj[aaa])[bbb][ccc])[ddd];
2121
((obj?.[aaa])[bbb]?.[ccc])[ddd];
22+
1?.a;
23+
obj()();
24+
obj()?.();
25+
obj?.()();
26+
obj?.()?.();
27+
(obj())();
28+
(obj())?.();
29+
(obj?.())();
30+
(obj?.())?.();
31+
((obj())()())();
32+
((obj?.())()?.())();

0 commit comments

Comments
 (0)