57 lines
1.1 KiB
Ruby
57 lines
1.1 KiB
Ruby
#!/usr/bin/ruby
|
|
|
|
module ANTLR3
|
|
module Template
|
|
Parameter = Struct.new( :name, :default )
|
|
class Parameter
|
|
def to_s
|
|
if block then "&#{ name }"
|
|
elsif splat then "*#{ name }"
|
|
elsif default then "#{ name } = #{ default }"
|
|
else name.dup
|
|
end
|
|
end
|
|
end
|
|
|
|
class ParameterList < ::Array
|
|
attr_accessor :splat, :block
|
|
|
|
def self.default
|
|
new.add( :values ) do | p |
|
|
p.default = '{}'
|
|
end
|
|
end
|
|
|
|
def names
|
|
names = map { | param | param.name.to_s }
|
|
@splat and names << @splat.to_s
|
|
@block and names << @block.to_s
|
|
return( names )
|
|
end
|
|
|
|
def add( name, default = nil )
|
|
param =
|
|
case name
|
|
when Parameter then name
|
|
else Parameter.new( name.to_s )
|
|
end
|
|
if options
|
|
default = options[ :default ] and param.default = default
|
|
param.splat = options.fetch( :splat, false )
|
|
param.block = options.fetch( :block, false )
|
|
end
|
|
block_given? and yield( param )
|
|
push( param )
|
|
return( self )
|
|
end
|
|
|
|
def to_s
|
|
signature = join( ', ' )
|
|
@splat and signature << ", *" << @splat.to_s
|
|
@block and signature << ", &" << @block.to_s
|
|
return( signature )
|
|
end
|
|
end
|
|
end
|
|
end
|