/* * Copyright (c) 2020, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace JS { ThrowCompletionOr regexp_create(GlobalObject&, Value pattern, Value flags); Result, String> regex_flags_from_string(StringView flags); String parse_regex_pattern(StringView pattern, bool unicode); class RegExpObject : public Object { JS_OBJECT(RegExpObject, Object); public: // JS regexps are all 'global' by default as per our definition, but the "global" flag enables "stateful". // FIXME: Enable 'BrowserExtended' only if in a browser context. static constexpr regex::RegexOptions default_flags { (regex::ECMAScriptFlags)regex::AllFlags::SingleMatch | (regex::ECMAScriptFlags)regex::AllFlags::Global | (regex::ECMAScriptFlags)regex::AllFlags::SkipTrimEmptyMatches | regex::ECMAScriptFlags::BrowserExtended }; static RegExpObject* create(GlobalObject&); static RegExpObject* create(GlobalObject&, Regex regex, String pattern, String flags); RegExpObject(Object& prototype); RegExpObject(Regex regex, String pattern, String flags, Object& prototype); ThrowCompletionOr regexp_initialize(GlobalObject&, Value pattern, Value flags); String escape_regexp_pattern() const; virtual void initialize(GlobalObject&) override; virtual ~RegExpObject() override; const String& pattern() const { return m_pattern; } const String& flags() const { return m_flags; } const Regex& regex() { return *m_regex; } const Regex& regex() const { return *m_regex; } private: String m_pattern; String m_flags; Optional> m_regex; }; }