diff --git a/packages/babel-plugin-transform-unicode-escapes/src/index.js b/packages/babel-plugin-transform-unicode-escapes/src/index.js index 65534e272925..bfb38422aaab 100644 --- a/packages/babel-plugin-transform-unicode-escapes/src/index.js +++ b/packages/babel-plugin-transform-unicode-escapes/src/index.js @@ -46,7 +46,9 @@ export default declare(api => { Identifier(path) { const { node, key } = path; const { name } = node; - const replaced = name.replace(surrogate, escape); + const replaced = name.replace(surrogate, c => { + return `_u${c.charCodeAt(0).toString(16)}`; + }); if (name === replaced) return; const str = t.inherits(t.stringLiteral(name), node); @@ -56,7 +58,7 @@ export default declare(api => { return; } - const { parentPath } = path; + const { parentPath, scope } = path; if ( parentPath.isMemberExpression({ property: node }) || parentPath.isOptionalMemberExpression({ property: node }) @@ -66,8 +68,14 @@ export default declare(api => { return; } + const binding = scope.getBinding(name); + if (binding) { + scope.rename(name, scope.generateUid(replaced)); + return; + } + throw path.buildCodeFrameError( - `Can't represent '${name}' as a bare identifier`, + `Can't reference '${name}' as a bare identifier`, ); }, diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/input.js new file mode 100644 index 000000000000..7bec60fe49cf --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/input.js @@ -0,0 +1 @@ +\u{1d49c}; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/options.json new file mode 100644 index 000000000000..a384cf47f03a --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier-global/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can't reference '𝒜' as a bare identifier" +} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/input.js index 7bec60fe49cf..050ec53d5f93 100644 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/input.js +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/input.js @@ -1 +1,2 @@ +var \u{1d49c} = 1; \u{1d49c}; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/options.json deleted file mode 100644 index 4f451723be87..000000000000 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Can't represent '𝒜' as a bare identifier" -} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/output.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/output.js new file mode 100644 index 000000000000..df3d39c48f46 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-bare-identifier/output.js @@ -0,0 +1,2 @@ +var _ud835_udc9c = 1; +_ud835_udc9c; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/input.js new file mode 100644 index 000000000000..b92d2671090f --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/input.js @@ -0,0 +1 @@ +var o = { \u{1d49c} }; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/options.json new file mode 100644 index 000000000000..a384cf47f03a --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand-global/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can't reference '𝒜' as a bare identifier" +} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/input.js index b92d2671090f..bcf5f451edbd 100644 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/input.js +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/input.js @@ -1 +1,2 @@ +var \u{1d49c} = 1; var o = { \u{1d49c} }; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/options.json deleted file mode 100644 index 4f451723be87..000000000000 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Can't represent '𝒜' as a bare identifier" -} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/output.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/output.js new file mode 100644 index 000000000000..3f94fa340781 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/escaped-object-property-shorthand/output.js @@ -0,0 +1,4 @@ +var _ud835_udc9c = 1; +var o = { + "\uD835\uDC9C": _ud835_udc9c +}; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/input.js new file mode 100644 index 000000000000..af52a87ea896 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/input.js @@ -0,0 +1 @@ +𝒜; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/options.json new file mode 100644 index 000000000000..a384cf47f03a --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier-global/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can't reference '𝒜' as a bare identifier" +} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/input.js index e9d2deec3e9f..d440017ddffb 100644 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/input.js +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/input.js @@ -1 +1,2 @@ -𝒜 ; +var 𝒜 = 1; +𝒜; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/options.json deleted file mode 100644 index 4f451723be87..000000000000 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Can't represent '𝒜' as a bare identifier" -} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/output.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/output.js new file mode 100644 index 000000000000..df3d39c48f46 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-bare-identifier/output.js @@ -0,0 +1,2 @@ +var _ud835_udc9c = 1; +_ud835_udc9c; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/input.js new file mode 100644 index 000000000000..8c17f84e1055 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/input.js @@ -0,0 +1 @@ +var o = { 𝒜 }; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/options.json new file mode 100644 index 000000000000..a384cf47f03a --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand-global/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Can't reference '𝒜' as a bare identifier" +} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/input.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/input.js index 8c17f84e1055..4b9a9fceb03a 100644 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/input.js +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/input.js @@ -1 +1,2 @@ +var 𝒜 = 1; var o = { 𝒜 }; diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/options.json b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/options.json deleted file mode 100644 index 4f451723be87..000000000000 --- a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Can't represent '𝒜' as a bare identifier" -} diff --git a/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/output.js b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/output.js new file mode 100644 index 000000000000..3f94fa340781 --- /dev/null +++ b/packages/babel-plugin-transform-unicode-escapes/test/fixtures/unicode-escapes/raw-object-property-shorthand/output.js @@ -0,0 +1,4 @@ +var _ud835_udc9c = 1; +var o = { + "\uD835\uDC9C": _ud835_udc9c +};