Bug 1589072 - Improve numeric separators error messages r=jorendorff
authorRohit Awate <rohitawate121@gmail.com>
Fri, 01 Nov 2019 22:43:52 +0000
changeset 500237 08d0bf739badeaa728fb8c9fda0d4a740dba0df5
parent 500236 60244e31ea1d74b38eafe4ec3dcbf4e9a551fa0c
child 500238 43b1b62048cd0bf9e2c57da514829401f3e165d1
push id36757
push userapavel@mozilla.com
push dateSat, 02 Nov 2019 09:54:21 +0000
treeherdermozilla-central@8aa8ed80ea43 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjorendorff
bugs1589072
milestone72.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1589072 - Improve numeric separators error messages r=jorendorff Differential Revision: https://phabricator.services.mozilla.com/D51134
js/src/frontend/TokenStream.cpp
js/src/js.msg
js/src/tests/non262/Number/numericSeparator.js
--- a/js/src/frontend/TokenStream.cpp
+++ b/js/src/frontend/TokenStream.cpp
@@ -2432,17 +2432,21 @@ TokenStreamSpecific<Unit, AnyCharsAccess
     if (isIntegerUnit(unit)) {
       continue;
     }
     if (unit != '_') {
       break;
     }
     unit = getCodeUnit();
     if (!isIntegerUnit(unit)) {
-      error(JSMSG_MISSING_DIGIT_AFTER_SEPARATOR);
+      if (unit == '_') {
+        error(JSMSG_NUMBER_MULTIPLE_ADJACENT_UNDERSCORES);
+      } else {
+        error(JSMSG_NUMBER_END_WITH_UNDERSCORE);
+      }
       return false;
     }
   }
 
   *nextUnit = unit;
   return true;
 }
 
--- a/js/src/js.msg
+++ b/js/src/js.msg
@@ -286,17 +286,18 @@ MSG_DEF(JSMSG_LINE_BREAK_AFTER_THROW,  0
 MSG_DEF(JSMSG_LINE_BREAK_BEFORE_ARROW, 0, JSEXN_SYNTAXERR, "no line break is allowed before '=>'")
 MSG_DEF(JSMSG_MALFORMED_ESCAPE,        1, JSEXN_SYNTAXERR, "malformed {0} character escape sequence")
 MSG_DEF(JSMSG_MISSING_BINARY_DIGITS,   0, JSEXN_SYNTAXERR, "missing binary digits after '0b'")
 MSG_DEF(JSMSG_MISSING_EXPONENT,        0, JSEXN_SYNTAXERR, "missing exponent")
 MSG_DEF(JSMSG_MISSING_EXPR_AFTER_THROW,0, JSEXN_SYNTAXERR, "throw statement is missing an expression")
 MSG_DEF(JSMSG_MISSING_FORMAL,          0, JSEXN_SYNTAXERR, "missing formal parameter")
 MSG_DEF(JSMSG_MISSING_HEXDIGITS,       0, JSEXN_SYNTAXERR, "missing hexadecimal digits after '0x'")
 MSG_DEF(JSMSG_MISSING_OCTAL_DIGITS,    0, JSEXN_SYNTAXERR, "missing octal digits after '0o'")
-MSG_DEF(JSMSG_MISSING_DIGIT_AFTER_SEPARATOR, 0, JSEXN_SYNTAXERR, "missing digit after '_' numeric separator")
+MSG_DEF(JSMSG_NUMBER_END_WITH_UNDERSCORE, 0, JSEXN_SYNTAXERR, "underscore can appear only between digits, not after the last digit in a number")
+MSG_DEF(JSMSG_NUMBER_MULTIPLE_ADJACENT_UNDERSCORES, 0, JSEXN_SYNTAXERR, "number cannot contain multiple adjacent underscores")
 MSG_DEF(JSMSG_MODULE_SPEC_AFTER_FROM,  0, JSEXN_SYNTAXERR, "missing module specifier after 'from' keyword")
 MSG_DEF(JSMSG_NAME_AFTER_DOT,          0, JSEXN_SYNTAXERR, "missing name after . operator")
 MSG_DEF(JSMSG_NAMED_IMPORTS_OR_NAMESPACE_IMPORT, 0, JSEXN_SYNTAXERR, "expected named imports or namespace import after comma")
 MSG_DEF(JSMSG_NO_BINDING_NAME,        0, JSEXN_SYNTAXERR, "missing binding name")
 MSG_DEF(JSMSG_NO_EXPORT_NAME,          0, JSEXN_SYNTAXERR, "missing export name")
 MSG_DEF(JSMSG_NO_IMPORT_NAME,          0, JSEXN_SYNTAXERR, "missing import name")
 MSG_DEF(JSMSG_NO_VARIABLE_NAME,        0, JSEXN_SYNTAXERR, "missing variable name")
 MSG_DEF(JSMSG_OF_AFTER_FOR_NAME,       0, JSEXN_SYNTAXERR, "missing 'of' after for")
new file mode 100644
--- /dev/null
+++ b/js/src/tests/non262/Number/numericSeparator.js
@@ -0,0 +1,9 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+assertThrowsInstanceOf(function() { eval('let a = 100_00_;'); }, SyntaxError);
+assertThrowsInstanceOf(() => eval("let b = 10__;"), SyntaxError);
+
+if (typeof reportCompare === "function")
+  reportCompare(true, true);
+