From 02b38d1e13c8aea745f04a377623fe9873729ee0 Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Sat, 11 Dec 2021 12:05:15 -0500 Subject: [PATCH 1/6] fix: add missing string prototype methods --- src/ast/values.ts | 14 +++++++++++++- .../builtin-prototypes/literal/_expected.js | 1 + .../samples/builtin-prototypes/literal/main.js | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ast/values.ts b/src/ast/values.ts index 08bf62f4cde..506bc17e547 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -163,6 +163,7 @@ const literalNumberMembers: MemberDescriptions = assembleMemberDescriptions( const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( { + at: returnsString, charAt: returnsString, charCodeAt: returnsNumber, codePointAt: returnsNumber, @@ -173,6 +174,7 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( lastIndexOf: returnsNumber, localeCompare: returnsNumber, match: returnsBoolean, + matchAll: returnsBoolean, normalize: returnsString, padEnd: returnsString, padStart: returnsString, @@ -183,17 +185,27 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( returns: UNKNOWN_LITERAL_STRING } }, + replaceAll: { + value: { + callsArgs: [1], + returns: UNKNOWN_LITERAL_STRING + } + }, search: returnsNumber, slice: returnsString, split: returnsUnknown, startsWith: returnsBoolean, - substr: returnsString, + substr: returnsString, // deprecated substring: returnsString, toLocaleLowerCase: returnsString, toLocaleUpperCase: returnsString, toLowerCase: returnsString, toUpperCase: returnsString, trim: returnsString, + trimEnd: returnsString, + trimLeft: returnsString, // deprecated, alias for trimStart + trimRight: returnsString, // deprecated, alias for trimEnd + trimStart: returnsString, valueOf: returnsString }, objectMembers diff --git a/test/form/samples/builtin-prototypes/literal/_expected.js b/test/form/samples/builtin-prototypes/literal/_expected.js index 75d80d652e5..52445d752cd 100644 --- a/test/form/samples/builtin-prototypes/literal/_expected.js +++ b/test/form/samples/builtin-prototypes/literal/_expected.js @@ -9,6 +9,7 @@ true.valueOf()(); 'ab'.charAt(1)(); null.unknown; 'ab'.replace( 'a', () => console.log( 1 ) || 'b' ); +'ab'.replaceAll( 'a', () => console.log( 1 ) || 'b' ); // deep property access is forbidden true.x.y; diff --git a/test/form/samples/builtin-prototypes/literal/main.js b/test/form/samples/builtin-prototypes/literal/main.js index e91c6a56144..ae28fc29e50 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -29,6 +29,7 @@ const _numberToLocaleString = (1).toLocaleString().trim(); const _numberToString = (1).toString().trim(); // string prototype +const _at = 'ab'.at( 1 ).trim(); const _charAt = 'ab'.charAt( 1 ).trim(); const _charCodeAt = 'ab'.charCodeAt( 1 ).toExponential( 2 ); const _codePointAt = 'ab'.codePointAt( 1 ).toExponential( 2 ); @@ -39,12 +40,15 @@ const _indexOf = 'ab'.indexOf( 'a' ).toExponential( 2 ); const _lastIndexOf = 'ab'.lastIndexOf( 'a' ).toExponential( 2 ); const _localeCompare = 'ab'.localeCompare( 'a' ).toExponential( 2 ); const _match = 'ab'.match( /a/ ).valueOf(); +const _matchAll = 'ab'.matchAll( /a/ ).valueOf(); const _normalize = 'ab'.normalize().trim(); const _padEnd = 'ab'.padEnd( 4, 'a' ).trim(); const _padStart = 'ab'.padStart( 4, 'a' ).trim(); const _repeat = 'ab'.repeat( 2 ).trim(); const _replace = 'ab'.replace( 'a', () => 'b' ).trim(); const _replaceEffect = 'ab'.replace( 'a', () => console.log( 1 ) || 'b' ); +const _replaceAll = 'ab'.replaceAll( 'a', () => 'b' ).trim(); +const _replaceAllEffect = 'ab'.replaceAll( 'a', () => console.log( 1 ) || 'b' ); const _search = 'ab'.search( /a/ ).toExponential( 2 ); const _slice = 'ab'.slice( 0, 1 ).trim(); const _split = 'ab'.split( 'a' ); @@ -56,6 +60,10 @@ const _toLocaleUpperCase = 'ab'.toLocaleUpperCase().trim(); const _toLowerCase = 'ab'.toLowerCase().trim(); const _toUpperCase = 'ab'.toUpperCase().trim(); const _trim = 'ab'.trim().trim(); +const _trimEnd = 'ab'.trimEnd().trim(); +const _trimLeft = 'ab'.trimLeft().trim(); +const _trimRight = 'ab'.trimRight().trim(); +const _trimStart = 'ab'.trimStart().trim(); const _stringValueOf = 'ab'.valueOf().trim(); // inherited const _stringHasOwnProperty = 'ab'.hasOwnProperty( 'toString' ).valueOf(); From 82daa5cb57baf207f1c1e2740bcc23130cdd608a Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Sat, 18 Dec 2021 17:05:53 -0500 Subject: [PATCH 2/6] fix string.prototype.match + .matchAll --- src/ast/values.ts | 4 ++-- test/form/samples/builtin-prototypes/literal/main.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ast/values.ts b/src/ast/values.ts index 506bc17e547..caafcbb2be5 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -173,8 +173,8 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( indexOf: returnsNumber, lastIndexOf: returnsNumber, localeCompare: returnsNumber, - match: returnsBoolean, - matchAll: returnsBoolean, + match: returnsUnknown, + matchAll: returnsUnknown, normalize: returnsString, padEnd: returnsString, padStart: returnsString, diff --git a/test/form/samples/builtin-prototypes/literal/main.js b/test/form/samples/builtin-prototypes/literal/main.js index ae28fc29e50..6c1b5631a28 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -39,8 +39,8 @@ const _endsWith = 'ab'.endsWith( 'a' ).valueOf(); const _indexOf = 'ab'.indexOf( 'a' ).toExponential( 2 ); const _lastIndexOf = 'ab'.lastIndexOf( 'a' ).toExponential( 2 ); const _localeCompare = 'ab'.localeCompare( 'a' ).toExponential( 2 ); -const _match = 'ab'.match( /a/ ).valueOf(); -const _matchAll = 'ab'.matchAll( /a/ ).valueOf(); +const _match = 'ab'.match( /a/ ) +const _matchAll = 'ab'.matchAll( /a/ ) const _normalize = 'ab'.normalize().trim(); const _padEnd = 'ab'.padEnd( 4, 'a' ).trim(); const _padStart = 'ab'.padStart( 4, 'a' ).trim(); From 0835932d0322cd351739eade7ef7f10e6899388a Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Sat, 18 Dec 2021 19:59:45 -0500 Subject: [PATCH 3/6] fix string.prototype.at + .codePointAt --- src/ast/values.ts | 4 ++-- test/form/samples/builtin-prototypes/literal/main.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ast/values.ts b/src/ast/values.ts index caafcbb2be5..879e7fe7d30 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -163,10 +163,10 @@ const literalNumberMembers: MemberDescriptions = assembleMemberDescriptions( const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( { - at: returnsString, + at: returnsUnknown, charAt: returnsString, charCodeAt: returnsNumber, - codePointAt: returnsNumber, + codePointAt: returnsUnknown, concat: returnsString, endsWith: returnsBoolean, includes: returnsBoolean, diff --git a/test/form/samples/builtin-prototypes/literal/main.js b/test/form/samples/builtin-prototypes/literal/main.js index 6c1b5631a28..6a4534595fe 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -29,10 +29,10 @@ const _numberToLocaleString = (1).toLocaleString().trim(); const _numberToString = (1).toString().trim(); // string prototype -const _at = 'ab'.at( 1 ).trim(); +const _at = 'ab'.at( 1 ) const _charAt = 'ab'.charAt( 1 ).trim(); const _charCodeAt = 'ab'.charCodeAt( 1 ).toExponential( 2 ); -const _codePointAt = 'ab'.codePointAt( 1 ).toExponential( 2 ); +const _codePointAt = 'ab'.codePointAt( 1 ); const _concat = 'ab'.concat( 'c' ).trim(); const _includes = 'ab'.includes( 'a' ).valueOf(); const _endsWith = 'ab'.endsWith( 'a' ).valueOf(); From 961b84c1c433c7b276f640086dcefa8da871914a Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Sat, 18 Dec 2021 20:39:50 -0500 Subject: [PATCH 4/6] add remaining deprecated string prototype methods --- src/ast/values.ts | 21 +++++++++++++++--- .../builtin-prototypes/literal/main.js | 22 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/ast/values.ts b/src/ast/values.ts index 879e7fe7d30..e1074329b42 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -163,15 +163,26 @@ const literalNumberMembers: MemberDescriptions = assembleMemberDescriptions( const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( { + // note on DEPRECATED methods: + // we still have support until being removed from engines (if ever) + anchor: returnsString, // DEPRECATED at: returnsUnknown, + big: returnsString, // DEPRECATED + blink: returnsString, // DEPRECATED + bold: returnsString, // DEPRECATED charAt: returnsString, charCodeAt: returnsNumber, codePointAt: returnsUnknown, concat: returnsString, endsWith: returnsBoolean, + fixed: returnsString, // DEPRECATED + fontcolor: returnsString, // DEPRECATED + fontsize: returnsString, // DEPRECATED includes: returnsBoolean, indexOf: returnsNumber, + italics: returnsString, // DEPRECATED lastIndexOf: returnsNumber, + link: returnsString, // DEPRECATED localeCompare: returnsNumber, match: returnsUnknown, matchAll: returnsUnknown, @@ -193,18 +204,22 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( }, search: returnsNumber, slice: returnsString, + small: returnsString, // DEPRECATED split: returnsUnknown, startsWith: returnsBoolean, - substr: returnsString, // deprecated + strike: returnsString, // DEPRECATED + sub: returnsString, // DEPRECATED + substr: returnsString, // DEPRECATED substring: returnsString, + sup: returnsString, // DEPRECATED toLocaleLowerCase: returnsString, toLocaleUpperCase: returnsString, toLowerCase: returnsString, toUpperCase: returnsString, trim: returnsString, trimEnd: returnsString, - trimLeft: returnsString, // deprecated, alias for trimStart - trimRight: returnsString, // deprecated, alias for trimEnd + trimLeft: returnsString, // DEPRECATED, alias for trimStart + trimRight: returnsString, // DEPRECATED, alias for trimEnd trimStart: returnsString, valueOf: returnsString }, diff --git a/test/form/samples/builtin-prototypes/literal/main.js b/test/form/samples/builtin-prototypes/literal/main.js index 6a4534595fe..00e3c324b91 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -53,7 +53,6 @@ const _search = 'ab'.search( /a/ ).toExponential( 2 ); const _slice = 'ab'.slice( 0, 1 ).trim(); const _split = 'ab'.split( 'a' ); const _startsWith = 'ab'.startsWith( 'a' ).valueOf(); -const _substr = 'ab'.substr( 0, 1 ).trim(); const _substring = 'ab'.substring( 0, 1 ).trim(); const _toLocaleLowerCase = 'ab'.toLocaleLowerCase().trim(); const _toLocaleUpperCase = 'ab'.toLocaleUpperCase().trim(); @@ -61,10 +60,27 @@ const _toLowerCase = 'ab'.toLowerCase().trim(); const _toUpperCase = 'ab'.toUpperCase().trim(); const _trim = 'ab'.trim().trim(); const _trimEnd = 'ab'.trimEnd().trim(); -const _trimLeft = 'ab'.trimLeft().trim(); -const _trimRight = 'ab'.trimRight().trim(); const _trimStart = 'ab'.trimStart().trim(); const _stringValueOf = 'ab'.valueOf().trim(); + +// DEPRECATED prototype methods +const _anchor = 'ab'.anchor().trim(); +const _big = 'ab'.big().trim(); +const _blink = 'ab'.blink().trim(); +const _bold = 'ab'.bold().trim(); +const _fixed = 'ab'.fixed().trim(); +const _fontcolor = 'ab'.fontcolor().trim(); +const _fontsize = 'ab'.fontsize().trim(); +const _italics = 'ab'.italics().trim(); +const _link = 'ab'.link().trim(); +const _small = 'ab'.small().trim(); +const _strike = 'ab'.strike().trim(); +const _sub = 'ab'.sub().trim(); +const _substr = 'ab'.substr(0, 1).trim(); +const _sup = 'ab'.sup().trim(); +const _trimLeft = 'ab'.trimLeft().trim(); +const _trimRight = 'ab'.trimRight().trim(); + // inherited const _stringHasOwnProperty = 'ab'.hasOwnProperty( 'toString' ).valueOf(); const _stringIsPrototypeOf = 'ab'.isPrototypeOf( '' ).valueOf(); From 4e9a96465c36399c5a1039887d278606e85de20c Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Sat, 18 Dec 2021 20:40:13 -0500 Subject: [PATCH 5/6] add string prototype toString (not inherited from object) --- src/ast/values.ts | 1 + test/form/samples/builtin-prototypes/literal/main.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/ast/values.ts b/src/ast/values.ts index e1074329b42..953ebc40b06 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -215,6 +215,7 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( toLocaleLowerCase: returnsString, toLocaleUpperCase: returnsString, toLowerCase: returnsString, + toString: returnsString, // overrides the toString() method of the Object object; it does not inherit Object.prototype.toString() toUpperCase: returnsString, trim: returnsString, trimEnd: returnsString, diff --git a/test/form/samples/builtin-prototypes/literal/main.js b/test/form/samples/builtin-prototypes/literal/main.js index 00e3c324b91..4e8e734a7ce 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -57,6 +57,7 @@ const _substring = 'ab'.substring( 0, 1 ).trim(); const _toLocaleLowerCase = 'ab'.toLocaleLowerCase().trim(); const _toLocaleUpperCase = 'ab'.toLocaleUpperCase().trim(); const _toLowerCase = 'ab'.toLowerCase().trim(); +const _toString = 'ab'.trim(); const _toUpperCase = 'ab'.toUpperCase().trim(); const _trim = 'ab'.trim().trim(); const _trimEnd = 'ab'.trimEnd().trim(); From 20b154aa57538a3f9bf61ce15abd8c03428a9ae8 Mon Sep 17 00:00:00 2001 From: Daniel Nalborczyk Date: Mon, 20 Dec 2021 09:27:23 -0500 Subject: [PATCH 6/6] remove deprecated comments --- src/ast/values.ts | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/ast/values.ts b/src/ast/values.ts index 953ebc40b06..cd3e753c8b4 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -163,26 +163,25 @@ const literalNumberMembers: MemberDescriptions = assembleMemberDescriptions( const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( { - // note on DEPRECATED methods: - // we still have support until being removed from engines (if ever) - anchor: returnsString, // DEPRECATED + anchor: returnsString, + at: returnsUnknown, - big: returnsString, // DEPRECATED - blink: returnsString, // DEPRECATED - bold: returnsString, // DEPRECATED + big: returnsString, + blink: returnsString, + bold: returnsString, charAt: returnsString, charCodeAt: returnsNumber, codePointAt: returnsUnknown, concat: returnsString, endsWith: returnsBoolean, - fixed: returnsString, // DEPRECATED - fontcolor: returnsString, // DEPRECATED - fontsize: returnsString, // DEPRECATED + fixed: returnsString, + fontcolor: returnsString, + fontsize: returnsString, includes: returnsBoolean, indexOf: returnsNumber, - italics: returnsString, // DEPRECATED + italics: returnsString, lastIndexOf: returnsNumber, - link: returnsString, // DEPRECATED + link: returnsString, localeCompare: returnsNumber, match: returnsUnknown, matchAll: returnsUnknown, @@ -204,14 +203,14 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( }, search: returnsNumber, slice: returnsString, - small: returnsString, // DEPRECATED + small: returnsString, split: returnsUnknown, startsWith: returnsBoolean, - strike: returnsString, // DEPRECATED - sub: returnsString, // DEPRECATED - substr: returnsString, // DEPRECATED + strike: returnsString, + sub: returnsString, + substr: returnsString, substring: returnsString, - sup: returnsString, // DEPRECATED + sup: returnsString, toLocaleLowerCase: returnsString, toLocaleUpperCase: returnsString, toLowerCase: returnsString, @@ -219,8 +218,8 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( toUpperCase: returnsString, trim: returnsString, trimEnd: returnsString, - trimLeft: returnsString, // DEPRECATED, alias for trimStart - trimRight: returnsString, // DEPRECATED, alias for trimEnd + trimLeft: returnsString, + trimRight: returnsString, trimStart: returnsString, valueOf: returnsString },