You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
'use strict';
|
|
|
|
// var Construct = require('es-abstract/2019/Construct');
|
|
var Get = require('es-abstract/2019/Get');
|
|
var Set = require('es-abstract/2019/Set');
|
|
var SpeciesConstructor = require('es-abstract/2019/SpeciesConstructor');
|
|
var ToLength = require('es-abstract/2019/ToLength');
|
|
var ToString = require('es-abstract/2019/ToString');
|
|
var Type = require('es-abstract/2019/Type');
|
|
var flagsGetter = require('regexp.prototype.flags');
|
|
|
|
var RegExpStringIterator = require('./helpers/RegExpStringIterator');
|
|
var OrigRegExp = RegExp;
|
|
|
|
var CreateRegExpStringIterator = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
|
|
if (Type(S) !== 'String') {
|
|
throw new TypeError('"S" value must be a String');
|
|
}
|
|
if (Type(global) !== 'Boolean') {
|
|
throw new TypeError('"global" value must be a Boolean');
|
|
}
|
|
if (Type(fullUnicode) !== 'Boolean') {
|
|
throw new TypeError('"fullUnicode" value must be a Boolean');
|
|
}
|
|
|
|
var iterator = new RegExpStringIterator(R, S, global, fullUnicode);
|
|
return iterator;
|
|
};
|
|
|
|
var supportsConstructingWithFlags = 'flags' in RegExp.prototype;
|
|
|
|
var constructRegexWithFlags = function constructRegex(C, R) {
|
|
var matcher;
|
|
// workaround for older engines that lack RegExp.prototype.flags
|
|
var flags = 'flags' in R ? Get(R, 'flags') : ToString(flagsGetter(R));
|
|
if (supportsConstructingWithFlags && typeof flags === 'string') {
|
|
matcher = new C(R, flags);
|
|
} else if (C === OrigRegExp) {
|
|
// workaround for older engines that can not construct a RegExp with flags
|
|
matcher = new C(R.source, flags);
|
|
} else {
|
|
matcher = new C(R, flags);
|
|
}
|
|
return { flags: flags, matcher: matcher };
|
|
};
|
|
|
|
var regexMatchAll = function SymbolMatchAll(string) {
|
|
var R = this;
|
|
if (Type(R) !== 'Object') {
|
|
throw new TypeError('"this" value must be an Object');
|
|
}
|
|
var S = ToString(string);
|
|
var C = SpeciesConstructor(R, OrigRegExp);
|
|
|
|
var tmp = constructRegexWithFlags(C, R);
|
|
// var flags = ToString(Get(R, 'flags'));
|
|
var flags = tmp.flags;
|
|
// var matcher = Construct(C, [R, flags]);
|
|
var matcher = tmp.matcher;
|
|
|
|
var lastIndex = ToLength(Get(R, 'lastIndex'));
|
|
Set(matcher, 'lastIndex', lastIndex, true);
|
|
var global = flags.indexOf('g') > -1;
|
|
var fullUnicode = flags.indexOf('u') > -1;
|
|
return CreateRegExpStringIterator(matcher, S, global, fullUnicode);
|
|
};
|
|
|
|
var defineP = Object.defineProperty;
|
|
var gOPD = Object.getOwnPropertyDescriptor;
|
|
|
|
if (defineP && gOPD) {
|
|
var desc = gOPD(regexMatchAll, 'name');
|
|
if (desc && desc.configurable) {
|
|
defineP(regexMatchAll, 'name', { value: '[Symbol.matchAll]' });
|
|
}
|
|
}
|
|
|
|
module.exports = regexMatchAll;
|
|
|