Skip to content

Commit

Permalink
feat: add additional string prototype methods (#4299)
Browse files Browse the repository at this point in the history
* fix: add missing string prototype methods

* fix string.prototype.match + .matchAll

* fix string.prototype.at + .codePointAt

* add remaining deprecated string prototype methods

* add string prototype toString (not inherited from object)

* remove deprecated comments
  • Loading branch information
dnalborczyk committed Dec 21, 2021
1 parent a37e6ad commit 83af3aa
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 5 deletions.
31 changes: 29 additions & 2 deletions src/ast/values.ts
Expand Up @@ -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,
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions test/form/samples/builtin-prototypes/literal/_expected.js
Expand Up @@ -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;
Expand Down
31 changes: 28 additions & 3 deletions test/form/samples/builtin-prototypes/literal/main.js
Expand Up @@ -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();
Expand Down

0 comments on commit 83af3aa

Please sign in to comment.