From be86643508658c70ccb5bec8bc4e3dc2479cac62 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 25 Jan 2023 13:00:17 +0100 Subject: [PATCH] feat: support modifiers proposal (#1) --- package-lock.json | 14 +- package.json | 2 +- regjsgen.js | 9 +- tests/equiv.js | 4 + tests/test-data-modifiers-group.json | 514 +++++++++++++++++++++++++++ tests/test-data.json | 80 +++++ tests/tests.js | 4 + tests/update-fixtures.js | 1 + 8 files changed, 619 insertions(+), 9 deletions(-) create mode 100644 tests/test-data-modifiers-group.json diff --git a/package-lock.json b/package-lock.json index 75d1f90..d1f2eb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "devDependencies": { "codecov": "^3.8.3", "nyc": "^15.1.0", - "regjsparser": "^0.8.2", + "regjsparser": "^0.9.1", "request": "^2.88.2" } }, @@ -1602,9 +1602,9 @@ } }, "node_modules/regjsparser": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.2.tgz", - "integrity": "sha512-/7yhmlBODOI+sdv3ThmD0b0wkFypkj4Kd+8GIwKK783NnY/1WCW0iAD/c1Z1LYGstXwozejtzHzDqMv6LmJkxg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -3434,9 +3434,9 @@ "dev": true }, "regjsparser": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.2.tgz", - "integrity": "sha512-/7yhmlBODOI+sdv3ThmD0b0wkFypkj4Kd+8GIwKK783NnY/1WCW0iAD/c1Z1LYGstXwozejtzHzDqMv6LmJkxg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" diff --git a/package.json b/package.json index 2467855..4a24820 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "devDependencies": { "codecov": "^3.8.3", "nyc": "^15.1.0", - "regjsparser": "^0.8.2", + "regjsparser": "^0.9.1", "request": "^2.88.2" } } diff --git a/regjsgen.js b/regjsgen.js index add5312..c24eb48 100644 --- a/regjsgen.js +++ b/regjsgen.js @@ -236,7 +236,14 @@ } break; case 'ignore': - result += '?:'; + if (node.modifierFlags) { + result += '?'; + if(node.modifierFlags.enabling) result += node.modifierFlags.enabling; + if(node.modifierFlags.disabling) result += "-" + node.modifierFlags.disabling; + result += ':'; + } else { + result += '?:'; + } break; case 'lookahead': result += '?='; diff --git a/tests/equiv.js b/tests/equiv.js index cf1240d..6947540 100644 --- a/tests/equiv.js +++ b/tests/equiv.js @@ -54,6 +54,10 @@ function astNodesAreEquivalent(a, b) { var bNames = Object.keys(b).filter(function(name) { return name != "range" && name != "raw"; }); var aNameCount = aNames.length; + if(a.type == "quantifier" && b.type == "quantifier" && a.symbol == null && b.symbol == "+"){ + b.symbol = undefined; + } + if (aNameCount == bNames.length) { for (var i = 0; i < aNameCount; ++i) { var name = aNames[i]; diff --git a/tests/test-data-modifiers-group.json b/tests/test-data-modifiers-group.json new file mode 100644 index 0000000..b43daef --- /dev/null +++ b/tests/test-data-modifiers-group.json @@ -0,0 +1,514 @@ +{ + "^[a-z](?-i:[a-z])$": { + "type": "alternative", + "body": [ + { + "type": "anchor", + "kind": "start", + "range": [ + 0, + 1 + ], + "raw": "^" + }, + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 2, + 3 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 4, + 5 + ], + "raw": "z" + }, + "range": [ + 2, + 5 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 1, + 6 + ], + "raw": "[a-z]" + }, + { + "type": "group", + "behavior": "ignore", + "body": [ + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 12, + 13 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 14, + 15 + ], + "raw": "z" + }, + "range": [ + 12, + 15 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 11, + 16 + ], + "raw": "[a-z]" + } + ], + "range": [ + 6, + 17 + ], + "raw": "(?-i:[a-z])", + "modifierFlags": { + "enabling": "", + "disabling": "i" + } + }, + { + "type": "anchor", + "kind": "end", + "range": [ + 17, + 18 + ], + "raw": "$" + } + ], + "range": [ + 0, + 18 + ], + "raw": "^[a-z](?-i:[a-z])$" + }, + "^(?i:[a-z])[a-z]$": { + "type": "alternative", + "body": [ + { + "type": "anchor", + "kind": "start", + "range": [ + 0, + 1 + ], + "raw": "^" + }, + { + "type": "group", + "behavior": "ignore", + "body": [ + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 6, + 7 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 8, + 9 + ], + "raw": "z" + }, + "range": [ + 6, + 9 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 5, + 10 + ], + "raw": "[a-z]" + } + ], + "range": [ + 1, + 11 + ], + "raw": "(?i:[a-z])", + "modifierFlags": { + "enabling": "i", + "disabling": "" + } + }, + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 12, + 13 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 14, + 15 + ], + "raw": "z" + }, + "range": [ + 12, + 15 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 11, + 16 + ], + "raw": "[a-z]" + }, + { + "type": "anchor", + "kind": "end", + "range": [ + 16, + 17 + ], + "raw": "$" + } + ], + "range": [ + 0, + 17 + ], + "raw": "^(?i:[a-z])[a-z]$" + }, + "^(?i-s:[a-z])[a-z]$": { + "type": "alternative", + "body": [ + { + "type": "anchor", + "kind": "start", + "range": [ + 0, + 1 + ], + "raw": "^" + }, + { + "type": "group", + "behavior": "ignore", + "body": [ + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 8, + 9 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 10, + 11 + ], + "raw": "z" + }, + "range": [ + 8, + 11 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 7, + 12 + ], + "raw": "[a-z]" + } + ], + "range": [ + 1, + 13 + ], + "raw": "(?i-s:[a-z])", + "modifierFlags": { + "enabling": "i", + "disabling": "s" + } + }, + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 14, + 15 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 16, + 17 + ], + "raw": "z" + }, + "range": [ + 14, + 17 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 13, + 18 + ], + "raw": "[a-z]" + }, + { + "type": "anchor", + "kind": "end", + "range": [ + 18, + 19 + ], + "raw": "$" + } + ], + "range": [ + 0, + 19 + ], + "raw": "^(?i-s:[a-z])[a-z]$" + }, + "^[a-z](?:[a-z])$": { + "type": "alternative", + "body": [ + { + "type": "anchor", + "kind": "start", + "range": [ + 0, + 1 + ], + "raw": "^" + }, + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 2, + 3 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 4, + 5 + ], + "raw": "z" + }, + "range": [ + 2, + 5 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 1, + 6 + ], + "raw": "[a-z]" + }, + { + "type": "group", + "behavior": "ignore", + "body": [ + { + "type": "characterClass", + "kind": "union", + "body": [ + { + "type": "characterClassRange", + "min": { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 10, + 11 + ], + "raw": "a" + }, + "max": { + "type": "value", + "kind": "symbol", + "codePoint": 122, + "range": [ + 12, + 13 + ], + "raw": "z" + }, + "range": [ + 10, + 13 + ], + "raw": "a-z" + } + ], + "negative": false, + "range": [ + 9, + 14 + ], + "raw": "[a-z]" + } + ], + "range": [ + 6, + 15 + ], + "raw": "(?:[a-z])" + }, + { + "type": "anchor", + "kind": "end", + "range": [ + 15, + 16 + ], + "raw": "$" + } + ], + "range": [ + 0, + 16 + ], + "raw": "^[a-z](?:[a-z])$" + }, + "^[a-z](?imi:[a-z])$": { + "type": "error", + "name": "SyntaxError", + "message": "flags cannot be duplicated for modifiers group at position 11\n [a-z](?imi:[a-z])$\n ^", + "input": "^[a-z](?imi:[a-z])$" + }, + "^[a-z](?i-mi:[a-z])$": { + "type": "error", + "name": "SyntaxError", + "message": "flags cannot be duplicated for modifiers group at position 12\n a-z](?i-mi:[a-z])$\n ^", + "input": "^[a-z](?i-mi:[a-z])$" + }, + "^[a-z](?-mim:[a-z])$": { + "type": "error", + "name": "SyntaxError", + "message": "flags cannot be duplicated for modifiers group at position 12\n a-z](?-mim:[a-z])$\n ^", + "input": "^[a-z](?-mim:[a-z])$" + }, + "^[a-z](?-:[a-z])$": { + "type": "error", + "name": "SyntaxError", + "message": "Invalid flags for modifiers group at position 9\n ^[a-z](?-:[a-z])$\n ^", + "input": "^[a-z](?-:[a-z])$" + } +} diff --git a/tests/test-data.json b/tests/test-data.json index 53ca0ed..e6ec676 100644 --- a/tests/test-data.json +++ b/tests/test-data.json @@ -38409,5 +38409,85 @@ 6 ], "raw": "([\\1])" + }, + "a{1,,2}": { + "type": "alternative", + "body": [ + { + "type": "value", + "kind": "symbol", + "codePoint": 97, + "range": [ + 0, + 1 + ], + "raw": "a" + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 123, + "range": [ + 1, + 2 + ], + "raw": "{" + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 49, + "range": [ + 2, + 3 + ], + "raw": "1" + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 44, + "range": [ + 3, + 4 + ], + "raw": "," + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 44, + "range": [ + 4, + 5 + ], + "raw": "," + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 50, + "range": [ + 5, + 6 + ], + "raw": "2" + }, + { + "type": "value", + "kind": "symbol", + "codePoint": 125, + "range": [ + 6, + 7 + ], + "raw": "}" + } + ], + "range": [ + 0, + 7 + ], + "raw": "a{1,,2}" } } diff --git a/tests/tests.js b/tests/tests.js index 8729529..0c2b489 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -101,3 +101,7 @@ runTests(require('./test-data-unicode-set.json'), { 'flags': 'v', 'features': { 'unicodePropertyEscape': true, 'unicodeSet': true } }); +runTests(require('./test-data-modifiers-group.json'), { + 'flags': '', + 'features': { 'modifiers': true } +}); diff --git a/tests/update-fixtures.js b/tests/update-fixtures.js index 46419c1..387e44b 100644 --- a/tests/update-fixtures.js +++ b/tests/update-fixtures.js @@ -26,3 +26,4 @@ saveFile('https://raw.githubusercontent.com/jviereck/regjsparser/gh-pages/test/t saveFile('https://raw.githubusercontent.com/jviereck/regjsparser/gh-pages/test/test-data-unicode.json'); saveFile('https://raw.githubusercontent.com/jviereck/regjsparser/gh-pages/test/test-data-unicode-properties.json'); saveFile('https://raw.githubusercontent.com/jviereck/regjsparser/gh-pages/test/test-data-unicode-set.json'); +saveFile('https://raw.githubusercontent.com/jviereck/regjsparser/gh-pages/test/test-data-modifiers-group.json');