Class: Puppet::Pops::Parser::Locator::AbstractLocator
- Inherits:
-
Puppet::Pops::Parser::Locator
- Object
- Puppet::Pops::Parser::Locator
- Puppet::Pops::Parser::Locator::AbstractLocator
- Defined in:
- lib/puppet/pops/parser/locator.rb
Direct Known Subclasses
Instance Attribute Summary collapse
- #file ⇒ Object readonly
- #line_index ⇒ Object
- #prev_line ⇒ Object
- #prev_offset ⇒ Object
- #string ⇒ Object
Instance Method Summary collapse
-
#ary_bsearch_i(ary, value) ⇒ Object
Returns the index of the smallest item for which the item > the given value This is a min binary search.
-
#compute_line_index ⇒ Object
Common impl for 18 and 19 since scanner is byte based.
-
#eql?(o) ⇒ Boolean
Equal method needed by serializer to perform tabulation.
- #hash ⇒ Object
-
#initialize(string, file, line_index = nil) ⇒ AbstractLocator
constructor
Create a locator based on a content string, and a boolean indicating if ruby version support multi-byte strings or not.
-
#line_for_offset(offset) ⇒ Object
Returns the line number (first line is 1) for the given offset.
-
#pos_on_line(offset) ⇒ Object
Returns the position on line (first position on a line is 1).
- #to_location_hash(reported_offset, end_offset) ⇒ Object
Methods inherited from Puppet::Pops::Parser::Locator
#char_length, #char_offset, #extract_text, #extract_tree_text, locator, #offset_on_line, #to_s, #to_uri
Constructor Details
#initialize(string, file, line_index = nil) ⇒ AbstractLocator
Create a locator based on a content string, and a boolean indicating if ruby version support multi-byte strings or not.
175 176 177 178 179 180 181 182 |
# File 'lib/puppet/pops/parser/locator.rb', line 175 def initialize(string, file, line_index = nil) @string = string.freeze @file = file.freeze @prev_offset = nil @prev_line = nil @line_index = line_index compute_line_index if line_index.nil? end |
Instance Attribute Details
#file ⇒ Object (readonly)
170 171 172 |
# File 'lib/puppet/pops/parser/locator.rb', line 170 def file @file end |
#line_index ⇒ Object
165 166 167 |
# File 'lib/puppet/pops/parser/locator.rb', line 165 def line_index @line_index end |
#prev_line ⇒ Object
168 169 170 |
# File 'lib/puppet/pops/parser/locator.rb', line 168 def prev_line @prev_line end |
#prev_offset ⇒ Object
167 168 169 |
# File 'lib/puppet/pops/parser/locator.rb', line 167 def prev_offset @prev_offset end |
#string ⇒ Object
166 167 168 |
# File 'lib/puppet/pops/parser/locator.rb', line 166 def string @string end |
Instance Method Details
#ary_bsearch_i(ary, value) ⇒ Object
Returns the index of the smallest item for which the item > the given value This is a min binary search. Although written in Ruby it is only slightly slower than the corresponding method in C in Ruby 2.0.0 - the main benefit to use this method over the Ruby C version is that it returns the index (not the value) which means there is not need to have an additional structure to get the index (or record the index in the structure). This saves both memory and CPU. It also does not require passing a block that is called since this method is specialized to search the line index.
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/puppet/pops/parser/locator.rb', line 205 def ary_bsearch_i(ary, value) low = 0 high = ary.length mid = nil smaller = false satisfied = false v = nil while low < high do mid = low + ((high - low) / 2) v = (ary[mid] > value) if v == true satisfied = true smaller = true elsif !v smaller = false else raise TypeError, "wrong argument, must be boolean or nil, got '#{v.class}'" end if smaller high = mid else low = mid + 1; end end return nil if low == ary.length return nil if !satisfied return low end |
#compute_line_index ⇒ Object
Common impl for 18 and 19 since scanner is byte based
247 248 249 250 251 252 253 254 |
# File 'lib/puppet/pops/parser/locator.rb', line 247 def compute_line_index scanner = StringScanner.new(string) result = [0] # first line starts at 0 while scanner.scan_until(/\n/) result << scanner.pos end self.line_index = result.freeze end |
#eql?(o) ⇒ Boolean
Equal method needed by serializer to perform tabulation
242 243 244 |
# File 'lib/puppet/pops/parser/locator.rb', line 242 def eql?(o) self.class == o.class && string == o.string && file == o.file && line_index == o.line_index end |
#hash ⇒ Object
237 238 239 |
# File 'lib/puppet/pops/parser/locator.rb', line 237 def hash [string, file, line_index].hash end |
#line_for_offset(offset) ⇒ Object
Returns the line number (first line is 1) for the given offset
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
# File 'lib/puppet/pops/parser/locator.rb', line 257 def line_for_offset(offset) if prev_offset == offset # use cache return prev_line end if line_nbr = ary_bsearch_i(line_index, offset) # cache prev_offset = offset prev_line = line_nbr return line_nbr end # If not found it is after last # clear cache prev_offset = prev_line = nil return line_index.size end |
#pos_on_line(offset) ⇒ Object
Returns the position on line (first position on a line is 1)
185 186 187 |
# File 'lib/puppet/pops/parser/locator.rb', line 185 def pos_on_line(offset) offset_on_line(offset) +1 end |
#to_location_hash(reported_offset, end_offset) ⇒ Object
189 190 191 192 193 194 195 |
# File 'lib/puppet/pops/parser/locator.rb', line 189 def to_location_hash(reported_offset, end_offset) pos = pos_on_line(reported_offset) offset = char_offset(reported_offset) length = char_length(reported_offset, end_offset) start_line = line_for_offset(reported_offset) { :line => start_line, :pos => pos, :offset => offset, :length => length} end |