class Opal::Fragment

def source_map_name_for(sexp)

def source_map_name_for(sexp)
  case sexp.type
  when :top
    case sexp.meta[:kind]
    when :require
      '<top (required)>'
    when :eval
      '(eval)'
    when :main
      '<main>'
    end
  when :begin, :newline, :js_return
    source_map_name_for(@scope.sexp) if @scope
  when :iter
    scope = @scope
    iters = 1
    while scope
      if scope.class == Nodes::IterNode
        iters += 1
        scope = scope.parent
      else
        break
      end
    end
    level = " (#{iters} levels)" if iters > 1
    "block#{level} in #{source_map_name_for(scope.sexp)}"
  when :self
    'self'
  when :module
    const, = *sexp
    "<module:#{source_map_name_for(const)}>"
  when :class
    const, = *sexp
    "<class:#{source_map_name_for(const)}>"
  when :const
    scope, name = *sexp
    if !scope || scope.type == :cbase
      name.to_s
    else
      "#{source_map_name_for(scope)}::#{name}"
    end
  when :int
    sexp.children.first
  when :def
    sexp.children.first
  when :defs
    sexp.children[1]
  when :send
    sexp.children[1]
  when :lvar, :lvasgn, :lvdeclare, :ivar, :ivasgn, :gvar, :cvar, :cvasgn, :gvars, :gvasgn, :arg
    sexp.children.first
  when :str, :xstr # Inside xstr - JS calls
    source_map_name_for(@scope.sexp)
  else
    # nil
  end
end