class ActionDispatch::Journey::Path::Pattern

:nodoc:
:nodoc:
:nodoc:

def self.build(path, requirements, separators, anchored)

def self.build(path, requirements, separators, anchored)
  parser = Journey::Parser.new
  ast = parser.parse path
  new ast, requirements, separators, anchored
end

def self.from_string string

def self.from_string string
  build(string, {}, "/.?", true)
end

def ast

def ast
  @spec.find_all(&:symbol?).each do |node|
    re = @requirements[node.to_sym]
    node.regexp = re if re
  end
  @spec.find_all(&:star?).each do |node|
    node = node.left
    node.regexp = @requirements[node.to_sym] || /(.+)/
  end
  @spec
end

def build_formatter

def build_formatter
  Visitors::FormatBuilder.new.accept(spec)
end

def initialize(ast, requirements, separators, anchored)

def initialize(ast, requirements, separators, anchored)
  @spec         = ast
  @requirements = requirements
  @separators   = separators
  @anchored     = anchored
  @names          = nil
  @optional_names = nil
  @required_names = nil
  @re             = nil
  @offsets        = nil
end

def match(other)

def match(other)
  return unless match = to_regexp.match(other)
  MatchData.new(names, offsets, match)
end

def names

def names
  @names ||= spec.find_all(&:symbol?).map(&:name)
end

def offsets

def offsets
  return @offsets if @offsets
  @offsets = [0]
  spec.find_all(&:symbol?).each do |node|
    node = node.to_sym
    if @requirements.key?(node)
      re = /#{@requirements[node]}|/
      @offsets.push((re.match('').length - 1) + @offsets.last)
    else
      @offsets << @offsets.last
    end
  end
  @offsets
end

def optional_names

def optional_names
  @optional_names ||= spec.find_all(&:group?).flat_map { |group|
    group.find_all(&:symbol?)
  }.map(&:name).uniq
end

def regexp_visitor

def regexp_visitor
  @anchored ? AnchoredRegexp : UnanchoredRegexp
end

def required_names

def required_names
  @required_names ||= names - optional_names
end

def source

def source
  to_regexp.source
end

def to_regexp

def to_regexp
  @re ||= regexp_visitor.new(@separators, @requirements).accept spec
end