class Cucumber::CucumberExpressions::CucumberExpressionGenerator

def create_parameter_type_matchers(text)

def create_parameter_type_matchers(text)
  parameter_matchers = []
  @parameter_type_registry.parameter_types.each do |parameter_type|
    parameter_matchers += create_parameter_type_matchers2(parameter_type, text) if parameter_type.use_for_snippets
  end
  parameter_matchers
end

def create_parameter_type_matchers2(parameter_type, text)

def create_parameter_type_matchers2(parameter_type, text)
  regexps = parameter_type.regexps
  regexps.map do |regexp|
    regexp = Regexp.new("(#{regexp})")
    ParameterTypeMatcher.new(parameter_type, regexp, text, 0)
  end
end

def escape(s)

def escape(s)
  s.gsub(/%/, '%%')
   .gsub(/\(/, '\\(')
   .gsub(/{/, '\\{')
   .gsub(/\//, '\\/')
end

def generate_expressions(text)

def generate_expressions(text)
  parameter_type_combinations = []
  parameter_type_matchers = create_parameter_type_matchers(text)
  expression_template = +''
  pos = 0
  loop do
    matching_parameter_type_matchers = []
    parameter_type_matchers.each do |parameter_type_matcher|
      advanced_parameter_type_matcher = parameter_type_matcher.advance_to(pos)
      matching_parameter_type_matchers.push(advanced_parameter_type_matcher) if advanced_parameter_type_matcher.find
    end
    if matching_parameter_type_matchers.any?
      matching_parameter_type_matchers = matching_parameter_type_matchers.sort
      best_parameter_type_matcher = matching_parameter_type_matchers[0]
      best_parameter_type_matchers = matching_parameter_type_matchers.select do |m|
        (m <=> best_parameter_type_matcher).zero?
      end
      # Build a list of parameter types without duplicates. The reason there
      # might be duplicates is that some parameter types have more than one regexp,
      # which means multiple ParameterTypeMatcher objects will have a reference to the
      # same ParameterType.
      # We're sorting the list so prefer_for_regexp_match parameter types are listed first.
      # Users are most likely to want these, so they should be listed at the top.
      parameter_types = []
      best_parameter_type_matchers.each do |parameter_type_matcher|
        parameter_types.push(parameter_type_matcher.parameter_type) unless parameter_types.include?(parameter_type_matcher.parameter_type)
      end
      parameter_types.sort!
      parameter_type_combinations.push(parameter_types)
      expression_template += escape(text.slice(pos...best_parameter_type_matcher.start))
      expression_template += '{%s}'
      pos = best_parameter_type_matcher.start + best_parameter_type_matcher.group.length
    else
      break
    end
    break if pos >= text.length
  end
  expression_template += escape(text.slice(pos..-1))
  CombinatorialGeneratedExpressionFactory.new(
    expression_template,
    parameter_type_combinations
  ).generate_expressions
end

def initialize(parameter_type_registry)

def initialize(parameter_type_registry)
  @parameter_type_registry = parameter_type_registry
end