diff --git a/src/ast/values.ts b/src/ast/values.ts index 08bf62f4cde..cd3e753c8b4 100644 --- a/src/ast/values.ts +++ b/src/ast/values.ts @@ -163,16 +163,28 @@ const literalNumberMembers: MemberDescriptions = assembleMemberDescriptions( const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( { + anchor: returnsString, + + at: returnsUnknown, + big: returnsString, + blink: returnsString, + bold: returnsString, charAt: returnsString, charCodeAt: returnsNumber, - codePointAt: returnsNumber, + codePointAt: returnsUnknown, concat: returnsString, endsWith: returnsBoolean, + fixed: returnsString, + fontcolor: returnsString, + fontsize: returnsString, includes: returnsBoolean, indexOf: returnsNumber, + italics: returnsString, lastIndexOf: returnsNumber, + link: returnsString, localeCompare: returnsNumber, - match: returnsBoolean, + match: returnsUnknown, + matchAll: returnsUnknown, normalize: returnsString, padEnd: returnsString, padStart: returnsString, @@ -183,17 +195,32 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions( returns: UNKNOWN_LITERAL_STRING } }, + replaceAll: { + value: { + callsArgs: [1], + returns: UNKNOWN_LITERAL_STRING + } + }, search: returnsNumber, slice: returnsString, + small: returnsString, split: returnsUnknown, startsWith: returnsBoolean, + strike: returnsString, + sub: returnsString, substr: returnsString, substring: returnsString, + sup: returnsString, 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, + trimLeft: returnsString, + trimRight: returnsString, + 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..4e8e734a7ce 100644 --- a/test/form/samples/builtin-prototypes/literal/main.js +++ b/test/form/samples/builtin-prototypes/literal/main.js @@ -29,34 +29,59 @@ const _numberToLocaleString = (1).toLocaleString().trim(); const _numberToString = (1).toString().trim(); // string prototype +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(); 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 _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(); 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' ); 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(); const _toLowerCase = 'ab'.toLowerCase().trim(); +const _toString = 'ab'.trim(); const _toUpperCase = 'ab'.toUpperCase().trim(); const _trim = 'ab'.trim().trim(); +const _trimEnd = 'ab'.trimEnd().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();