class ParameterList

Attributes

end_index[R]
errors[R]
start_index[R]

Public Class Methods

new(tokens, start_index, end_index) click to toggle source
# File lib/model/parameter_list.rb, line 6
def initialize(tokens, start_index, end_index)
  @tokens, @start_index, @end_index = tokens, start_index, end_index
  @errors = []
end

Public Instance Methods

each() { |parameter| ... } click to toggle source
# File lib/model/parameter_list.rb, line 15
def each(&block)
  parameters.each do |parameter|
    yield parameter
  end
end
optional_parameters() click to toggle source
# File lib/model/parameter_list.rb, line 21
def optional_parameters
  parameters.select(&:is_optional?)
end
required_parameters() click to toggle source
# File lib/model/parameter_list.rb, line 25
def required_parameters
  parameters.select(&:is_required?)
end
sort() click to toggle source
# File lib/model/parameter_list.rb, line 11
def sort
  parameters.sort
end
validate() click to toggle source
# File lib/model/parameter_list.rb, line 29
def validate
  optional_parameter_found = false

  parameters.each do |parameter|
    if parameter.is_required? && optional_parameter_found
      errors << {
        :message => "Required parameter #{parameter.name} should be specified before optional parameters",
        :line    => parameter.line,
        :column  => parameter.column
      }
    elsif parameter.is_optional?
      optional_parameter_found = true
    end
  end

  validate_alphabetical_order(required_parameters)
  validate_alphabetical_order(optional_parameters)

  errors.empty?
end

Private Instance Methods

parameters() click to toggle source
# File lib/model/parameter_list.rb, line 52
def parameters
  parameter = Parameter.new
  stack = []

  @tokens.inject([]) do |memo, token|
    if [:LBRACK, :LPAREN].include?(token.type)
      stack.push(true)
    elsif [:RBRACK, :RPAREN].include?(token.type)
      stack.pop
    end

    if (token.type == :COMMA || token == @tokens.last) && stack.empty? && parameter.tokens.any?
      unless [:COMMA, :NEWLINE, :WHITESPACE, :INDENT].include?(token.type)
        parameter.add(token)
      end

      memo << parameter
      parameter = Parameter.new
    else
      parameter.add(token)
    end
    memo
  end
end
validate_alphabetical_order(params) click to toggle source
# File lib/model/parameter_list.rb, line 77
def validate_alphabetical_order(params)
  if params != params.sort
    errors << {
      :message => "Parameter list not in alphabetical order",
      :line    => params.first.line,
      :column  => params.first.column
    }
  end
end