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