diff --git a/js/lib/beautify.js b/js/lib/beautify.js index 3b7741fc2..b98da9397 100644 --- a/js/lib/beautify.js +++ b/js/lib/beautify.js @@ -310,7 +310,7 @@ function generateMapFromStrings(list) { result[list[x].replace(/-/g, '_')] = list[x]; } return result; -} +} function sanitizeOperatorPosition(opPosition) { opPosition = opPosition || OPERATOR_POSITION.before_newline; @@ -595,7 +595,7 @@ function Beautifier(js_source_text, options) { return out; } - var newline_restricted_tokens = ['break', 'continue', 'return', 'throw']; + var newline_restricted_tokens = ['break', 'continue', 'return', 'throw', 'yield']; function allow_wrap_or_preserved_newline(force_linewrap) { force_linewrap = (force_linewrap === undefined) ? false : force_linewrap; @@ -742,7 +742,7 @@ function Beautifier(js_source_text, options) { if ( (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['var', 'let', 'const']) && current_token.type === 'TK_WORD') || (last_type === 'TK_RESERVED' && flags.last_text === 'do') || - (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['return', 'throw']) && !current_token.wanted_newline) || + (last_type === 'TK_RESERVED' && in_array(flags.last_text, newline_restricted_tokens) && !current_token.wanted_newline) || (last_type === 'TK_RESERVED' && flags.last_text === 'else' && !(current_token.type === 'TK_RESERVED' && current_token.text === 'if' && !current_token.comments_before.length)) || (last_type === 'TK_END_EXPR' && (previous_flags.mode === MODE.ForInitializer || previous_flags.mode === MODE.Conditional)) || @@ -1164,7 +1164,9 @@ function Beautifier(js_source_text, options) { } } if (last_type === 'TK_RESERVED' || last_type === 'TK_WORD') { - if (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['get', 'set', 'new', 'return', 'export', 'async'])) { + if (last_type === 'TK_RESERVED' && ( + in_array(flags.last_text, ['get', 'set', 'new', 'export', 'async']) || + in_array(flags.last_text, newline_restricted_tokens))) { output.space_before_token = true; } else if (last_type === 'TK_RESERVED' && flags.last_text === 'default' && last_last_text === 'export') { output.space_before_token = true; diff --git a/js/src/javascript/beautifier.js b/js/src/javascript/beautifier.js index 703f6162e..2e9368470 100644 --- a/js/src/javascript/beautifier.js +++ b/js/src/javascript/beautifier.js @@ -363,7 +363,7 @@ function Beautifier(js_source_text, options) { return out; } - var newline_restricted_tokens = ['break', 'continue', 'return', 'throw']; + var newline_restricted_tokens = ['break', 'continue', 'return', 'throw', 'yield']; function allow_wrap_or_preserved_newline(force_linewrap) { force_linewrap = (force_linewrap === undefined) ? false : force_linewrap; @@ -510,7 +510,7 @@ function Beautifier(js_source_text, options) { if ( (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['var', 'let', 'const']) && current_token.type === 'TK_WORD') || (last_type === 'TK_RESERVED' && flags.last_text === 'do') || - (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['return', 'throw']) && !current_token.wanted_newline) || + (last_type === 'TK_RESERVED' && in_array(flags.last_text, newline_restricted_tokens) && !current_token.wanted_newline) || (last_type === 'TK_RESERVED' && flags.last_text === 'else' && !(current_token.type === 'TK_RESERVED' && current_token.text === 'if' && !current_token.comments_before.length)) || (last_type === 'TK_END_EXPR' && (previous_flags.mode === MODE.ForInitializer || previous_flags.mode === MODE.Conditional)) || @@ -932,7 +932,9 @@ function Beautifier(js_source_text, options) { } } if (last_type === 'TK_RESERVED' || last_type === 'TK_WORD') { - if (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['get', 'set', 'new', 'return', 'export', 'async'])) { + if (last_type === 'TK_RESERVED' && ( + in_array(flags.last_text, ['get', 'set', 'new', 'export', 'async']) || + in_array(flags.last_text, newline_restricted_tokens))) { output.space_before_token = true; } else if (last_type === 'TK_RESERVED' && flags.last_text === 'default' && last_last_text === 'export') { output.space_before_token = true; diff --git a/js/test/generated/beautify-javascript-tests.js b/js/test/generated/beautify-javascript-tests.js index b075751fd..bdede90e2 100644 --- a/js/test/generated/beautify-javascript-tests.js +++ b/js/test/generated/beautify-javascript-tests.js @@ -1687,6 +1687,7 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify, bt('yield /foo\\//;'); bt('result = yield pgClient.query_(queryString);'); bt('yield [1, 2]'); + bt('yield function() {};'); bt('yield* bar();'); // yield should have no space between yield and star diff --git a/package-lock.json b/package-lock.json index 914f54ce9..e85ad9c57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1523,14 +1523,6 @@ } } }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, "string-width": { "version": "1.0.2", "bundled": true, @@ -1541,6 +1533,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, "stringstream": { "version": "0.0.5", "bundled": true, @@ -2908,12 +2908,6 @@ } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -2925,6 +2919,12 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/python/jsbeautifier/javascript/beautifier.py b/python/jsbeautifier/javascript/beautifier.py index c47a0c916..08307d3f2 100644 --- a/python/jsbeautifier/javascript/beautifier.py +++ b/python/jsbeautifier/javascript/beautifier.py @@ -268,7 +268,7 @@ def is_expression(self, mode): return mode in [MODE.Expression, MODE.ForInitializer, MODE.Conditional] - _newline_restricted_tokens = ['break','continue','return', 'throw'] + _newline_restricted_tokens = ['break','continue','return', 'throw', 'yield'] def allow_wrap_or_preserved_newline(self, current_token, force_linewrap = False): # never wrap the first token of a line. if self.output.just_added_newline(): @@ -383,7 +383,7 @@ def start_of_statement(self, current_token): if ( (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['var', 'let', 'const'] and current_token.type == 'TK_WORD') \ or (self.last_type == 'TK_RESERVED' and self.flags.last_text== 'do') \ - or (self.last_type == 'TK_RESERVED' and self.flags.last_text in ['return', 'throw'] and not current_token.wanted_newline) \ + or (self.last_type == 'TK_RESERVED' and self.flags.last_text in self._newline_restricted_tokens and not current_token.wanted_newline) \ or (self.last_type == 'TK_RESERVED' and self.flags.last_text == 'else' \ and not (current_token.type == 'TK_RESERVED' and current_token.text == 'if' and not len(current_token.comments_before))) \ or (self.last_type == 'TK_END_EXPR' and (self.previous_flags.mode == MODE.ForInitializer or self.previous_flags.mode == MODE.Conditional)) \ @@ -729,7 +729,10 @@ def handle_word(self, current_token): self.print_newline(True) if self.last_type == 'TK_RESERVED' or self.last_type == 'TK_WORD': - if self.last_type == 'TK_RESERVED' and self.flags.last_text in ['get', 'set', 'new', 'return', 'export', 'async']: + if self.last_type == 'TK_RESERVED' and ( + self.flags.last_text in ['get', 'set', 'new', 'export', 'async'] or + self.flags.last_text in self._newline_restricted_tokens + ): self.output.space_before_token = True elif self.last_type == 'TK_RESERVED' and self.flags.last_text == 'default' and self.last_last_text == 'export': self.output.space_before_token = True diff --git a/python/jsbeautifier/tests/generated/tests.py b/python/jsbeautifier/tests/generated/tests.py index 375419aac..835745229 100644 --- a/python/jsbeautifier/tests/generated/tests.py +++ b/python/jsbeautifier/tests/generated/tests.py @@ -1515,6 +1515,7 @@ def unicode_char(value): bt('yield /foo\\//;') bt('result = yield pgClient.query_(queryString);') bt('yield [1, 2]') + bt('yield function() {};') bt('yield* bar();') # yield should have no space between yield and star diff --git a/test/data/javascript/tests.js b/test/data/javascript/tests.js index d0f4040fe..a52efcd4d 100644 --- a/test/data/javascript/tests.js +++ b/test/data/javascript/tests.js @@ -761,6 +761,7 @@ exports.test_data = { { unchanged: 'yield /foo\\\\//;' }, { unchanged: 'result = yield pgClient.query_(queryString);' }, { unchanged: 'yield [1, 2]' }, + { unchanged: 'yield function() {};' }, { unchanged: "yield* bar();" }, { comment: "yield should have no space between yield and star",