class Opal::Nodes::RegexpNode
def compile
def compile flags.select! do |flag| if SUPPORTED_FLAGS =~ flag true else compiler.warning "Skipping the '#{flag}' Regexp flag as it's not widely supported by JavaScript vendors." false end end if value.type == :str compile_static_regexp else compile_dynamic_regexp end end
def compile_dynamic_regexp
def compile_dynamic_regexp push 'Opal.regexp([' value.children.each_with_index do |v, index| push ', ' unless index.zero? push expr(v) end push ']' push ", '#{flags.join}'" if flags.any? push ")" end
def compile_static_regexp
def compile_static_regexp value = self.value.children[0] case value when '' push('/(?:)/') when %r{\?<\w+\>} message = "named captures are not supported in javascript: #{value.inspect}" push "self.$raise(new SyntaxError('#{message}'))" else push "#{Regexp.new(value).inspect}#{flags.join}" end end
def extract_flags_and_value
def extract_flags_and_value *values, flags_sexp = *children self.flags = flags_sexp.children.map(&:to_s) self.value = case values.length when 0 # empty regexp, we can process it inline s(:str, '') when 1 # simple plain regexp, we can put it inline values[0] else s(:dstr, *values) end # trimming when //x provided # required by parser gem, but JS doesn't support 'x' flag if flags.include?('x') parts = value.children.map do |part| if part.is_a?(::Opal::AST::Node) && part.type == :str trimmed_value = part.children[0].gsub(/\A\s*\#.*/, '').gsub(/\s/, '') s(:str, trimmed_value) else part end end self.value = value.updated(nil, parts) flags.delete('x') end if value.type == :str # Replacing \A -> ^, \z -> $, required for the parser gem self.value = s(:str, value.children[0].gsub('\A', '^').gsub('\z', '$')) end end
def initialize(*)
def initialize(*) super extract_flags_and_value end
def raw_value
def raw_value self.value = @sexp.loc.expression.source end