Skip to content

Commit

Permalink
Merge pull request #1829 from mayankshouche/fix/nullish-coalescing
Browse files Browse the repository at this point in the history
Support for nullish coalescing
  • Loading branch information
bitwiseman authored Aug 13, 2020
2 parents a4d6cb9 + c82a98e commit 7f18fed
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 39 deletions.
4 changes: 2 additions & 2 deletions js/src/javascript/tokenizer.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ var dot_pattern = /[^\d\.]/;

var positionable_operators = (
">>> === !== " +
"<< && >= ** != == <= >> || |> " +
"<< && >= ** != == <= >> || ?? |> " +
"< / - + > : & % ? ^ | *").split(' ');

// IMPORTANT: this must be sorted longest to shortest or tokenizing many not work.
// Also, you must update possitionable operators separately from punct
var punct =
">>>= " +
"... >>= <<= === >>> !== **= " +
"=> ^= :: /= << <= == && -= >= >> != -- += ** || ++ %= &= *= |= |> " +
"=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> " +
"= ! ? > < : / ^ - + * & % ~ |";

punct = punct.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&");
Expand Down
51 changes: 33 additions & 18 deletions js/test/generated/beautify-javascript-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -3221,14 +3221,14 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,


//============================================================
// operator_position option - ensure no neswlines if preserve_newlines is false - (preserve_newlines = "false")
// operator_position option - ensure no newlines if preserve_newlines is false - (preserve_newlines = "false")
reset_options();
set_name('operator_position option - ensure no neswlines if preserve_newlines is false - (preserve_newlines = "false")');
set_name('operator_position option - ensure no newlines if preserve_newlines is false - (preserve_newlines = "false")');
opts.preserve_newlines = false;
bt(
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');
Expand All @@ -3246,6 +3246,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand All @@ -3266,20 +3267,20 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
// -- output --
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');

// operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""before-newline"", preserve_newlines = "false")
// operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""before-newline"", preserve_newlines = "false")
reset_options();
set_name('operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""before-newline"", preserve_newlines = "false")');
set_name('operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""before-newline"", preserve_newlines = "false")');
opts.operator_position = 'before-newline';
opts.preserve_newlines = false;
bt(
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');
Expand All @@ -3297,6 +3298,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand All @@ -3317,20 +3319,20 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
// -- output --
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');

// operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""after-newline"", preserve_newlines = "false")
// operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""after-newline"", preserve_newlines = "false")
reset_options();
set_name('operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""after-newline"", preserve_newlines = "false")');
set_name('operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""after-newline"", preserve_newlines = "false")');
opts.operator_position = 'after-newline';
opts.preserve_newlines = false;
bt(
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');
Expand All @@ -3348,6 +3350,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand All @@ -3368,20 +3371,20 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
// -- output --
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');

// operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""preserve-newline"", preserve_newlines = "false")
// operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""preserve-newline"", preserve_newlines = "false")
reset_options();
set_name('operator_position option - ensure no neswlines if preserve_newlines is false - (operator_position = ""preserve-newline"", preserve_newlines = "false")');
set_name('operator_position option - ensure no newlines if preserve_newlines is false - (operator_position = ""preserve-newline"", preserve_newlines = "false")');
opts.operator_position = 'preserve-newline';
opts.preserve_newlines = false;
bt(
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');
Expand All @@ -3399,6 +3402,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand All @@ -3419,7 +3423,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
// -- output --
'var res = a + b - c / d * e % f;\n' +
'var res = g & h | i ^ j |> console.log;\n' +
'var res = (k && l || m) ? n : o;\n' +
'var res = (k && l || m) ? n ?? nn : o;\n' +
'var res = p >> q << r >>> s;\n' +
'var res = t === u !== v != w == x >= y <= z > aa < ab;\n' +
'ac + -ad');
Expand All @@ -3445,6 +3449,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand Down Expand Up @@ -3474,7 +3479,8 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'var res = (k &&\n' +
' l ||\n' +
' m) ?\n' +
' n :\n' +
' n ??\n' +
' nn :\n' +
' o;\n' +
'var res = p >>\n' +
' q <<\n' +
Expand Down Expand Up @@ -3569,6 +3575,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand Down Expand Up @@ -3598,7 +3605,8 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'var res = (k &&\n' +
' l ||\n' +
' m) ?\n' +
' n :\n' +
' n ??\n' +
' nn :\n' +
' o;\n' +
'var res = p >>\n' +
' q <<\n' +
Expand Down Expand Up @@ -3695,6 +3703,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand Down Expand Up @@ -3725,6 +3734,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
' && l\n' +
' || m)\n' +
' ? n\n' +
' ?? nn\n' +
' : o;\n' +
'var res = p\n' +
' >> q\n' +
Expand Down Expand Up @@ -3820,6 +3830,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
'l\n' +
'|| m) ?\n' +
'n\n' +
'?? nn\n' +
': o\n' +
';\n' +
'var res = p\n' +
Expand Down Expand Up @@ -3851,6 +3862,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
' l\n' +
' || m) ?\n' +
' n\n' +
' ?? nn\n' +
' : o;\n' +
'var res = p\n' +
' >> q <<\n' +
Expand Down Expand Up @@ -7001,6 +7013,9 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify,
' return x;\n' +
' };');

// Issue #1794 - support nullish-coalescing
bt('a = b ?? c');

// Issue #569 - function should not have blank line in a number of cases
bt(
'(function(global) {\n' +
Expand Down
4 changes: 2 additions & 2 deletions python/jsbeautifier/javascript/tokenizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ def __init__(self):

positionable_operators = frozenset(
(
">>> === !== " + "<< && >= ** != == <= >> || |> " + "< / - + > : & % ? ^ | *"
">>> === !== " + "<< && >= ** != == <= >> || ?? |> " + "< / - + > : & % ? ^ | *"
).split(" ")
)

punct = (
">>>= "
+ "... >>= <<= === >>> !== **= "
+ "=> ^= :: /= << <= == && -= >= >> != -- += ** || ++ %= &= *= |= |> "
+ "=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> "
+ "= ! ? > < : / ^ - + * & % ~ |"
)

Expand Down
Loading

0 comments on commit 7f18fed

Please sign in to comment.