xref: /aosp_15_r20/external/antlr/runtime/Ruby/lib/antlr3/util.rb (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot#!/usr/bin/ruby
2*16467b97STreehugger Robot# encoding: utf-8
3*16467b97STreehugger Robot
4*16467b97STreehugger Robotmodule ANTLR3
5*16467b97STreehugger Robotmodule Util
6*16467b97STreehugger Robot
7*16467b97STreehugger Robotmodule_function
8*16467b97STreehugger Robot
9*16467b97STreehugger Robot  def snake_case( str )
10*16467b97STreehugger Robot    str = str.to_s.gsub( /([A-Z]+)([A-Z][a-z])/,'\1_\2' )
11*16467b97STreehugger Robot    str.gsub!( /([a-z\d])([A-Z])/,'\1_\2' )
12*16467b97STreehugger Robot    str.tr!( "-", "_" )
13*16467b97STreehugger Robot    str.downcase!
14*16467b97STreehugger Robot    str
15*16467b97STreehugger Robot  end
16*16467b97STreehugger Robot
17*16467b97STreehugger Robot  def parse_version( version_string )
18*16467b97STreehugger Robot    version_string.split( '.' ).map! do | segment |
19*16467b97STreehugger Robot      segment.to_i
20*16467b97STreehugger Robot    end.freeze
21*16467b97STreehugger Robot  end
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot  def tidy( here_doc, flow = false )
24*16467b97STreehugger Robot    here_doc.gsub!( /^ *\| ?/, '' )
25*16467b97STreehugger Robot    if flow
26*16467b97STreehugger Robot      here_doc.strip!
27*16467b97STreehugger Robot      here_doc.gsub!( /\s+/, ' ' )
28*16467b97STreehugger Robot    end
29*16467b97STreehugger Robot    return here_doc
30*16467b97STreehugger Robot  end
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot  def silence_warnings
33*16467b97STreehugger Robot    verbosity, $VERBOSE = $VERBOSE, nil
34*16467b97STreehugger Robot    return yield
35*16467b97STreehugger Robot  ensure
36*16467b97STreehugger Robot    $VERBOSE = verbosity
37*16467b97STreehugger Robot  end
38*16467b97STreehugger Robot
39*16467b97STreehugger Robotend
40*16467b97STreehugger Robot
41*16467b97STreehugger Robotmodule ClassMacros
42*16467b97STreehugger Robot
43*16467b97STreehugger Robotprivate
44*16467b97STreehugger Robot
45*16467b97STreehugger Robot  def shared_attribute( name, *additional_members )
46*16467b97STreehugger Robot    attr_reader name
47*16467b97STreehugger Robot
48*16467b97STreehugger Robot    additional_writers = additional_members.inject( '' ) do |src, attr|
49*16467b97STreehugger Robot      src << "@#{ attr } = value if @#{ attr }\n"
50*16467b97STreehugger Robot    end
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot    file, line, = caller[ 1 ].split( ':', 3 )
53*16467b97STreehugger Robot    class_eval( <<-END, file, line.to_i )
54*16467b97STreehugger Robot      def #{ name }= value
55*16467b97STreehugger Robot        @#{ name } = value
56*16467b97STreehugger Robot
57*16467b97STreehugger Robot        each_delegate do |del|
58*16467b97STreehugger Robot          del.#{ name } = value
59*16467b97STreehugger Robot        end
60*16467b97STreehugger Robot
61*16467b97STreehugger Robot        #{ additional_writers }
62*16467b97STreehugger Robot      end
63*16467b97STreehugger Robot    END
64*16467b97STreehugger Robot  end
65*16467b97STreehugger Robot
66*16467b97STreehugger Robot  def abstract( name, message = nil )
67*16467b97STreehugger Robot    message ||= "abstract method -- #{ self.class }::#{ name } has not been implemented"
68*16467b97STreehugger Robot    file, line, = caller[ 1 ].split( ':', 3 )
69*16467b97STreehugger Robot    class_eval( <<-END, file, line.to_i )
70*16467b97STreehugger Robot      def #{ name }( * )
71*16467b97STreehugger Robot        raise TypeError, #{ message.to_s.inspect }
72*16467b97STreehugger Robot      end
73*16467b97STreehugger Robot    END
74*16467b97STreehugger Robot  end
75*16467b97STreehugger Robot
76*16467b97STreehugger Robot  def deprecate( name, extra_message = nil )
77*16467b97STreehugger Robot    hidden_name = "deprecated_#{ name }"
78*16467b97STreehugger Robot    method_defined?( hidden_name ) and return
79*16467b97STreehugger Robot
80*16467b97STreehugger Robot    alias_method( hidden_name, name )
81*16467b97STreehugger Robot    private( hidden_name )
82*16467b97STreehugger Robot
83*16467b97STreehugger Robot    message = "warning: method #{ self }##{ name } is deprecated"
84*16467b97STreehugger Robot    extra_message and message << '; ' << extra_message.to_s
85*16467b97STreehugger Robot
86*16467b97STreehugger Robot    class_eval( <<-END )
87*16467b97STreehugger Robot      def #{ name }( *args, &block )
88*16467b97STreehugger Robot        warn( #{ message.inspect } )
89*16467b97STreehugger Robot        #{ hidden_name }( *args, &block )
90*16467b97STreehugger Robot      end
91*16467b97STreehugger Robot    END
92*16467b97STreehugger Robot  end
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot  def alias_accessor( alias_name, attr_name )
95*16467b97STreehugger Robot    alias_method( alias_name, attr_name )
96*16467b97STreehugger Robot    alias_method( :"#{ alias_name }=", :"#{ attr_name }=" )
97*16467b97STreehugger Robot  end
98*16467b97STreehugger Robot
99*16467b97STreehugger Robotend
100*16467b97STreehugger Robot
101*16467b97STreehugger Robotend
102*16467b97STreehugger Robot
103*16467b97STreehugger Robotclass Integer
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot  # Returns the lower of self or x.
106*16467b97STreehugger Robot  #
107*16467b97STreehugger Robot  #   4.at_least(5)  #=> 5
108*16467b97STreehugger Robot  #   6.at_least(5)  #=> 6
109*16467b97STreehugger Robot  #
110*16467b97STreehugger Robot  #   CREDIT Florian Gross
111*16467b97STreehugger Robot
112*16467b97STreehugger Robot  def at_least( x )
113*16467b97STreehugger Robot    ( self >= x ) ? self : x
114*16467b97STreehugger Robot  end
115*16467b97STreehugger Robot
116*16467b97STreehugger Robot  # Returns the greater of self or x.
117*16467b97STreehugger Robot  #
118*16467b97STreehugger Robot  #   4.at_most(5)  #=> 4
119*16467b97STreehugger Robot  #   6.at_most(5)  #=> 5
120*16467b97STreehugger Robot  #
121*16467b97STreehugger Robot  #   CREDIT Florian Gross
122*16467b97STreehugger Robot
123*16467b97STreehugger Robot  def at_most( x )
124*16467b97STreehugger Robot    ( self <= x ) ? self : x
125*16467b97STreehugger Robot  end
126*16467b97STreehugger Robot
127*16467b97STreehugger Robot  # Returns self if above the given lower bound, or
128*16467b97STreehugger Robot  # within the given lower and upper bounds,
129*16467b97STreehugger Robot  # otherwise returns the the bound of which the
130*16467b97STreehugger Robot  # value falls outside.
131*16467b97STreehugger Robot  #
132*16467b97STreehugger Robot  #   4.bound(3)    #=> 4
133*16467b97STreehugger Robot  #   4.bound(5)    #=> 5
134*16467b97STreehugger Robot  #   4.bound(2,7)  #=> 4
135*16467b97STreehugger Robot  #   9.bound(2,7)  #=> 7
136*16467b97STreehugger Robot  #   1.bound(2,7)  #=> 2
137*16467b97STreehugger Robot  #
138*16467b97STreehugger Robot  #   CREDIT Trans
139*16467b97STreehugger Robot
140*16467b97STreehugger Robot  def bound( lower, upper=nil )
141*16467b97STreehugger Robot    return lower if self < lower
142*16467b97STreehugger Robot    return self unless upper
143*16467b97STreehugger Robot    return upper if self > upper
144*16467b97STreehugger Robot    return self
145*16467b97STreehugger Robot  end
146*16467b97STreehugger Robot
147*16467b97STreehugger Robotend
148*16467b97STreehugger Robot
149*16467b97STreehugger Robot
150*16467b97STreehugger Robotclass Range
151*16467b97STreehugger Robot  def covers?( range )
152*16467b97STreehugger Robot    range.first >= first or return false
153*16467b97STreehugger Robot    if exclude_end?
154*16467b97STreehugger Robot      range.exclude_end? ? last >= range.last : last > range.last
155*16467b97STreehugger Robot    else
156*16467b97STreehugger Robot      range.exclude_end? ? last.succ >= range.last : last >= range.last
157*16467b97STreehugger Robot    end
158*16467b97STreehugger Robot  end
159*16467b97STreehugger Robot
160*16467b97STreehugger Robot  def covered_by?( range )
161*16467b97STreehugger Robot    range.covers?( self )
162*16467b97STreehugger Robot  end
163*16467b97STreehugger Robot
164*16467b97STreehugger Robot  def overlaps?( range )
165*16467b97STreehugger Robot    range.include?( first ) or include?( range.first )
166*16467b97STreehugger Robot  end
167*16467b97STreehugger Robot
168*16467b97STreehugger Robot  def disjoint?( range )
169*16467b97STreehugger Robot    not overlaps?( range )
170*16467b97STreehugger Robot  end
171*16467b97STreehugger Robot
172*16467b97STreehugger Robotend
173