123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 'use strict';
- var GetIntrinsic = require('get-intrinsic');
- var hasSymbols = require('has-symbols')();
- var $TypeError = GetIntrinsic('%TypeError%');
- var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true);
- var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
- var AdvanceStringIndex = require('./AdvanceStringIndex');
- var CreateIterResultObject = require('./CreateIterResultObject');
- var CreateMethodProperty = require('./CreateMethodProperty');
- var Get = require('./Get');
- var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
- var RegExpExec = require('./RegExpExec');
- var Set = require('./Set');
- var ToLength = require('./ToLength');
- var ToString = require('./ToString');
- var Type = require('./Type');
- var SLOT = require('internal-slot');
- var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) {
- if (Type(S) !== 'String') {
- throw new $TypeError('`S` must be a string');
- }
- if (Type(global) !== 'Boolean') {
- throw new $TypeError('`global` must be a boolean');
- }
- if (Type(fullUnicode) !== 'Boolean') {
- throw new $TypeError('`fullUnicode` must be a boolean');
- }
- SLOT.set(this, '[[IteratingRegExp]]', R);
- SLOT.set(this, '[[IteratedString]]', S);
- SLOT.set(this, '[[Global]]', global);
- SLOT.set(this, '[[Unicode]]', fullUnicode);
- SLOT.set(this, '[[Done]]', false);
- };
- if (IteratorPrototype) {
- RegExpStringIterator.prototype = OrdinaryObjectCreate(IteratorPrototype);
- }
- var RegExpStringIteratorNext = function next() {
- var O = this; // eslint-disable-line no-invalid-this
- if (Type(O) !== 'Object') {
- throw new $TypeError('receiver must be an object');
- }
- if (
- !(O instanceof RegExpStringIterator)
- || !SLOT.has(O, '[[IteratingRegExp]]')
- || !SLOT.has(O, '[[IteratedString]]')
- || !SLOT.has(O, '[[Global]]')
- || !SLOT.has(O, '[[Unicode]]')
- || !SLOT.has(O, '[[Done]]')
- ) {
- throw new $TypeError('"this" value must be a RegExpStringIterator instance');
- }
- if (SLOT.get(O, '[[Done]]')) {
- return CreateIterResultObject(undefined, true);
- }
- var R = SLOT.get(O, '[[IteratingRegExp]]');
- var S = SLOT.get(O, '[[IteratedString]]');
- var global = SLOT.get(O, '[[Global]]');
- var fullUnicode = SLOT.get(O, '[[Unicode]]');
- var match = RegExpExec(R, S);
- if (match === null) {
- SLOT.set(O, '[[Done]]', true);
- return CreateIterResultObject(undefined, true);
- }
- if (global) {
- var matchStr = ToString(Get(match, '0'));
- if (matchStr === '') {
- var thisIndex = ToLength(Get(R, 'lastIndex'));
- var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode);
- Set(R, 'lastIndex', nextIndex, true);
- }
- return CreateIterResultObject(match, false);
- }
- SLOT.set(O, '[[Done]]', true);
- return CreateIterResultObject(match, false);
- };
- CreateMethodProperty(RegExpStringIterator.prototype, 'next', RegExpStringIteratorNext);
- if (hasSymbols) {
- if (Symbol.toStringTag) {
- if ($defineProperty) {
- $defineProperty(RegExpStringIterator.prototype, Symbol.toStringTag, {
- configurable: true,
- enumerable: false,
- value: 'RegExp String Iterator',
- writable: false
- });
- } else {
- RegExpStringIterator.prototype[Symbol.toStringTag] = 'RegExp String Iterator';
- }
- }
- if (Symbol.iterator && typeof RegExpStringIterator.prototype[Symbol.iterator] !== 'function') {
- var iteratorFn = function SymbolIterator() {
- return this;
- };
- CreateMethodProperty(RegExpStringIterator.prototype, Symbol.iterator, iteratorFn);
- }
- }
- // https://262.ecma-international.org/11.0/#sec-createregexpstringiterator
- module.exports = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
- // assert R.global === global && R.unicode === fullUnicode?
- return new RegExpStringIterator(R, S, global, fullUnicode);
- };
|