Skip to content

Commit 3ea3706

Browse files
author
sanex3339
committed
Merge branch 'optional-chaining-support' into nullish-coalescing-support
2 parents 7be75b2 + 9c9ba14 commit 3ea3706

File tree

4 files changed

+39
-34
lines changed

4 files changed

+39
-34
lines changed

escodegen.js

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,12 @@
100100
Await: 14,
101101
Unary: 14,
102102
Postfix: 15,
103-
Call: 16,
104-
New: 17,
105-
TaggedTemplate: 18,
106-
Member: 19,
107-
Primary: 20
103+
OptionalChaining: 16,
104+
Call: 17,
105+
New: 18,
106+
TaggedTemplate: 19,
107+
Member: 20,
108+
Primary: 21
108109
};
109110

110111
BinaryPrecedence = {
@@ -1898,18 +1899,10 @@
18981899
},
18991900

19001901
CallExpression: function (expr, precedence, flags) {
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-
}
1902+
var result, i, iz;
1903+
1904+
// F_ALLOW_UNPARATH_NEW becomes false.
1905+
result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
19131906

19141907
if (expr.optional) {
19151908
result.push('?.');
@@ -1933,8 +1926,9 @@
19331926

19341927
ChainExpression: function (expr, precedence, flags) {
19351928
var expression = expr.expression;
1929+
var result = this[expression.type](expression, precedence, flags);
19361930

1937-
return this[expression.type](expression, precedence, flags);
1931+
return parenthesize(result, Precedence.OptionalChaining, precedence);
19381932
},
19391933

19401934
NewExpression: function (expr, precedence, flags) {
@@ -1965,17 +1959,10 @@
19651959
},
19661960

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

1972-
if (expr.object.type === 'ChainExpression' && expr.object.expression.optional) {
1973-
// F_ALLOW_UNPARATH_NEW becomes false.
1974-
result = [this.generateExpression(expr.object, Precedence.Member, exprObjectFlags)];
1975-
} else {
1976-
// F_ALLOW_UNPARATH_NEW becomes false.
1977-
result = [this.generateExpression(expr.object, Precedence.Call, exprObjectFlags)];
1978-
}
1964+
// F_ALLOW_UNPARATH_NEW becomes false.
1965+
result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
19791966

19801967
if (expr.computed) {
19811968
if (expr.optional) {
@@ -2007,10 +1994,6 @@
20071994
result.push(generateIdentifier(expr.property));
20081995
}
20091996

2010-
if (precedence === Precedence.Member) {
2011-
return parenthesize(result, Precedence.Call, precedence);
2012-
}
2013-
20141997
return parenthesize(result, Precedence.Member, precedence);
20151998
},
20161999

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,15 @@ obj()?.();
2929
(obj?.())();
3030
(obj?.())?.();
3131
obj()()()();
32-
((obj?.())()?.())();
32+
((obj?.())()?.())();
33+
(a?.b)();
34+
a?.b();
35+
a?.b?.();
36+
(a?.b)?.();
37+
a?.().b;
38+
(a?.()).b;
39+
a?.b.c();
40+
(a?.b.c)();
41+
a.b?.().c;
42+
(a.b?.()).c;
43+
(a.b?.())?.c;

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
@@ -30,3 +30,14 @@ obj?.()?.();
3030
(obj?.())?.();
3131
((obj())()())();
3232
((obj?.())()?.())();
33+
(a?.b)();
34+
a?.b();
35+
a?.b?.();
36+
(a?.b)?.();
37+
a?.().b;
38+
(a?.()).b;
39+
a?.b.c();
40+
(a?.b.c)();
41+
a.b?.().c;
42+
(a.b?.()).c;
43+
(a.b?.())?.c;

0 commit comments

Comments
 (0)