steep 0.32.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +4 -0
 - data/lib/steep.rb +0 -2
 - data/lib/steep/ast/types/factory.rb +18 -18
 - data/lib/steep/server/utils.rb +1 -1
 - data/lib/steep/source.rb +2 -2
 - data/lib/steep/type_inference/context_array.rb +1 -1
 - data/lib/steep/version.rb +1 -1
 - data/smoke/regression/fun.rb +8 -0
 - data/smoke/regression/fun.rbs +4 -0
 - metadata +8 -8
 - data/lib/steep/ast/buffer.rb +0 -51
 - data/lib/steep/ast/location.rb +0 -86
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e93086efe3704ac8b59a1450fda301b7ab91f409c13c53a679a2ed3b3419ca84
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b00e2030a9ea2171b6f967c78f469204c903cb937d421e5dcab896021fce2919
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 06023d31b509f58efdea8c8f0e13c49b38f3a4936debbe3a0d88bfd84b356e7a761506a8f105c035bd454a4b2f39ae6af13d16b84d29e6d0050d9d58d7062e82
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: '0601459d31ad8ca758c95c29215eb237b5bc50490b5133e574057ec1836396d9189c3dd22628244c1d8d432e0f945a746c280ae96ca20b768c063fbae0c696af'
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/lib/steep.rb
    CHANGED
    
    | 
         @@ -16,7 +16,6 @@ require 'uri' 
     | 
|
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
            require "rbs"
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            require "steep/ast/location"
         
     | 
| 
       20 
19 
     | 
    
         
             
            require "steep/ast/types/helper"
         
     | 
| 
       21 
20 
     | 
    
         
             
            require "steep/ast/types/any"
         
     | 
| 
       22 
21 
     | 
    
         
             
            require "steep/ast/types/instance"
         
     | 
| 
         @@ -39,7 +38,6 @@ require "steep/ast/types/logic" 
     | 
|
| 
       39 
38 
     | 
    
         
             
            require "steep/ast/type_params"
         
     | 
| 
       40 
39 
     | 
    
         
             
            require "steep/ast/annotation"
         
     | 
| 
       41 
40 
     | 
    
         
             
            require "steep/ast/annotation/collection"
         
     | 
| 
       42 
     | 
    
         
            -
            require "steep/ast/buffer"
         
     | 
| 
       43 
41 
     | 
    
         
             
            require "steep/ast/builtin"
         
     | 
| 
       44 
42 
     | 
    
         
             
            require "steep/ast/types/factory"
         
     | 
| 
       45 
43 
     | 
    
         | 
| 
         @@ -342,44 +342,44 @@ module Steep 
     | 
|
| 
       342 
342 
     | 
    
         
             
                      end
         
     | 
| 
       343 
343 
     | 
    
         
             
                    end
         
     | 
| 
       344 
344 
     | 
    
         | 
| 
      
 345 
     | 
    
         
            +
                    NilClassName = TypeName("::NilClass")
         
     | 
| 
      
 346 
     | 
    
         
            +
             
     | 
| 
       345 
347 
     | 
    
         
             
                    def setup_primitives(method_name, method_type)
         
     | 
| 
       346 
348 
     | 
    
         
             
                      if method_def = method_type.method_def
         
     | 
| 
       347 
349 
     | 
    
         
             
                        defined_in = method_def.defined_in
         
     | 
| 
       348 
350 
     | 
    
         
             
                        member = method_def.member
         
     | 
| 
       349 
351 
     | 
    
         | 
| 
       350 
352 
     | 
    
         
             
                        if member.is_a?(RBS::AST::Members::MethodDefinition)
         
     | 
| 
       351 
     | 
    
         
            -
                          case
         
     | 
| 
       352 
     | 
    
         
            -
                          when  
     | 
| 
       353 
     | 
    
         
            -
                             
     | 
| 
       354 
     | 
    
         
            -
                            when :is_a?, :kind_of?, :instance_of?
         
     | 
| 
      
 353 
     | 
    
         
            +
                          case method_name
         
     | 
| 
      
 354 
     | 
    
         
            +
                          when :is_a?, :kind_of?, :instance_of?
         
     | 
| 
      
 355 
     | 
    
         
            +
                            if defined_in == RBS::BuiltinNames::Object.name && member.instance?
         
     | 
| 
       355 
356 
     | 
    
         
             
                              return method_type.with(
         
     | 
| 
       356 
357 
     | 
    
         
             
                                return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.return_type.location)
         
     | 
| 
       357 
358 
     | 
    
         
             
                              )
         
     | 
| 
       358 
     | 
    
         
            -
                            when :nil?
         
     | 
| 
       359 
     | 
    
         
            -
                              return method_type.with(
         
     | 
| 
       360 
     | 
    
         
            -
                                return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
         
     | 
| 
       361 
     | 
    
         
            -
                              )
         
     | 
| 
       362 
359 
     | 
    
         
             
                            end
         
     | 
| 
       363 
360 
     | 
    
         | 
| 
       364 
     | 
    
         
            -
                          when  
     | 
| 
       365 
     | 
    
         
            -
                            case  
     | 
| 
       366 
     | 
    
         
            -
                            when  
     | 
| 
      
 361 
     | 
    
         
            +
                          when :nil?
         
     | 
| 
      
 362 
     | 
    
         
            +
                            case defined_in
         
     | 
| 
      
 363 
     | 
    
         
            +
                            when RBS::BuiltinNames::Object.name,
         
     | 
| 
      
 364 
     | 
    
         
            +
                              NilClassName
         
     | 
| 
       367 
365 
     | 
    
         
             
                              return method_type.with(
         
     | 
| 
       368 
366 
     | 
    
         
             
                                return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
         
     | 
| 
       369 
367 
     | 
    
         
             
                              )
         
     | 
| 
       370 
368 
     | 
    
         
             
                            end
         
     | 
| 
       371 
369 
     | 
    
         | 
| 
       372 
     | 
    
         
            -
                          when  
     | 
| 
       373 
     | 
    
         
            -
                            case  
     | 
| 
       374 
     | 
    
         
            -
                            when  
     | 
| 
      
 370 
     | 
    
         
            +
                          when :!
         
     | 
| 
      
 371 
     | 
    
         
            +
                            case defined_in
         
     | 
| 
      
 372 
     | 
    
         
            +
                            when RBS::BuiltinNames::BasicObject.name,
         
     | 
| 
      
 373 
     | 
    
         
            +
                              RBS::BuiltinNames::TrueClass.name,
         
     | 
| 
      
 374 
     | 
    
         
            +
                              RBS::BuiltinNames::FalseClass.name
         
     | 
| 
       375 
375 
     | 
    
         
             
                              return method_type.with(
         
     | 
| 
       376 
376 
     | 
    
         
             
                                return_type: AST::Types::Logic::Not.new(location: method_type.return_type.location)
         
     | 
| 
       377 
377 
     | 
    
         
             
                              )
         
     | 
| 
       378 
378 
     | 
    
         
             
                            end
         
     | 
| 
       379 
379 
     | 
    
         | 
| 
       380 
     | 
    
         
            -
                          when  
     | 
| 
       381 
     | 
    
         
            -
                            case  
     | 
| 
       382 
     | 
    
         
            -
                            when  
     | 
| 
      
 380 
     | 
    
         
            +
                          when :===
         
     | 
| 
      
 381 
     | 
    
         
            +
                            case defined_in
         
     | 
| 
      
 382 
     | 
    
         
            +
                            when RBS::BuiltinNames::Module.name
         
     | 
| 
       383 
383 
     | 
    
         
             
                              return method_type.with(
         
     | 
| 
       384 
384 
     | 
    
         
             
                                return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.return_type.location)
         
     | 
| 
       385 
385 
     | 
    
         
             
                              )
         
     | 
| 
         @@ -409,7 +409,7 @@ module Steep 
     | 
|
| 
       409 
409 
     | 
    
         
             
                        else
         
     | 
| 
       410 
410 
     | 
    
         
             
                          raise "Unexpected `self` type interface"
         
     | 
| 
       411 
411 
     | 
    
         
             
                        end
         
     | 
| 
       412 
     | 
    
         
            -
             
     | 
| 
      
 412 
     | 
    
         
            +
             
     | 
| 
       413 
413 
     | 
    
         
             
                      when Name::Instance
         
     | 
| 
       414 
414 
     | 
    
         
             
                        Interface::Interface.new(type: self_type, private: private).tap do |interface|
         
     | 
| 
       415 
415 
     | 
    
         
             
                          definition = definition_builder.build_instance(type.name)
         
     | 
    
        data/lib/steep/server/utils.rb
    CHANGED
    
    | 
         @@ -13,7 +13,7 @@ module Steep 
     | 
|
| 
       13 
13 
     | 
    
         
             
                    if range
         
     | 
| 
       14 
14 
     | 
    
         
             
                      text = text.dup
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                      buf =  
     | 
| 
      
 16 
     | 
    
         
            +
                      buf = RBS::Buffer.new(name: :_, content: text)
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                      start_pos = buf.loc_to_pos(range[:start].yield_self {|pos| [pos[:line]+1, pos[:character]] })
         
     | 
| 
       19 
19 
     | 
    
         
             
                      end_pos = buf.loc_to_pos(range[:end].yield_self {|pos| [pos[:line]+1, pos[:character]] })
         
     | 
    
        data/lib/steep/source.rb
    CHANGED
    
    | 
         @@ -65,11 +65,11 @@ module Steep 
     | 
|
| 
       65 
65 
     | 
    
         
             
                    parser.tokenize(buffer)
         
     | 
| 
       66 
66 
     | 
    
         
             
                  end
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                  buffer =  
     | 
| 
      
 68 
     | 
    
         
            +
                  buffer = RBS::Buffer.new(name: path, content: source_code)
         
     | 
| 
       69 
69 
     | 
    
         | 
| 
       70 
70 
     | 
    
         
             
                  comments.each do |comment|
         
     | 
| 
       71 
71 
     | 
    
         
             
                    src = comment.text.gsub(/\A#\s*/, '')
         
     | 
| 
       72 
     | 
    
         
            -
                    location =  
     | 
| 
      
 72 
     | 
    
         
            +
                    location = RBS::Location.new(buffer: buffer,
         
     | 
| 
       73 
73 
     | 
    
         
             
                                                 start_pos: comment.location.expression.begin_pos + 1,
         
     | 
| 
       74 
74 
     | 
    
         
             
                                                 end_pos: comment.location.expression.end_pos)
         
     | 
| 
       75 
75 
     | 
    
         
             
                    annotation = AnnotationParser.new(factory: factory).parse(src, location: location)
         
     | 
    
        data/lib/steep/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: steep
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.33.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Soutaro Matsumoto
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire:
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-10-13 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: parser
         
     | 
| 
         @@ -140,9 +140,7 @@ files: 
     | 
|
| 
       140 
140 
     | 
    
         
             
            - lib/steep/annotation_parser.rb
         
     | 
| 
       141 
141 
     | 
    
         
             
            - lib/steep/ast/annotation.rb
         
     | 
| 
       142 
142 
     | 
    
         
             
            - lib/steep/ast/annotation/collection.rb
         
     | 
| 
       143 
     | 
    
         
            -
            - lib/steep/ast/buffer.rb
         
     | 
| 
       144 
143 
     | 
    
         
             
            - lib/steep/ast/builtin.rb
         
     | 
| 
       145 
     | 
    
         
            -
            - lib/steep/ast/location.rb
         
     | 
| 
       146 
144 
     | 
    
         
             
            - lib/steep/ast/type_params.rb
         
     | 
| 
       147 
145 
     | 
    
         
             
            - lib/steep/ast/types.rb
         
     | 
| 
       148 
146 
     | 
    
         
             
            - lib/steep/ast/types/any.rb
         
     | 
| 
         @@ -331,6 +329,8 @@ files: 
     | 
|
| 
       331 
329 
     | 
    
         
             
            - smoke/regexp/b.rb
         
     | 
| 
       332 
330 
     | 
    
         
             
            - smoke/regression/Steepfile
         
     | 
| 
       333 
331 
     | 
    
         
             
            - smoke/regression/array.rb
         
     | 
| 
      
 332 
     | 
    
         
            +
            - smoke/regression/fun.rb
         
     | 
| 
      
 333 
     | 
    
         
            +
            - smoke/regression/fun.rbs
         
     | 
| 
       334 
334 
     | 
    
         
             
            - smoke/regression/hash.rb
         
     | 
| 
       335 
335 
     | 
    
         
             
            - smoke/regression/poly_new.rb
         
     | 
| 
       336 
336 
     | 
    
         
             
            - smoke/regression/poly_new.rbs
         
     | 
| 
         @@ -363,7 +363,7 @@ metadata: 
     | 
|
| 
       363 
363 
     | 
    
         
             
              homepage_uri: https://github.com/soutaro/steep
         
     | 
| 
       364 
364 
     | 
    
         
             
              source_code_uri: https://github.com/soutaro/steep
         
     | 
| 
       365 
365 
     | 
    
         
             
              changelog_uri: https://github.com/soutaro/steep/blob/master/CHANGELOG.md
         
     | 
| 
       366 
     | 
    
         
            -
            post_install_message:
         
     | 
| 
      
 366 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
       367 
367 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       368 
368 
     | 
    
         
             
            require_paths:
         
     | 
| 
       369 
369 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -378,8 +378,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       378 
378 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       379 
379 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       380 
380 
     | 
    
         
             
            requirements: []
         
     | 
| 
       381 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
       382 
     | 
    
         
            -
            signing_key:
         
     | 
| 
      
 381 
     | 
    
         
            +
            rubygems_version: 3.1.2
         
     | 
| 
      
 382 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
       383 
383 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       384 
384 
     | 
    
         
             
            summary: Gradual Typing for Ruby
         
     | 
| 
       385 
385 
     | 
    
         
             
            test_files: []
         
     | 
    
        data/lib/steep/ast/buffer.rb
    DELETED
    
    | 
         @@ -1,51 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Steep
         
     | 
| 
       2 
     | 
    
         
            -
              module AST
         
     | 
| 
       3 
     | 
    
         
            -
                class Buffer
         
     | 
| 
       4 
     | 
    
         
            -
                  attr_reader :name
         
     | 
| 
       5 
     | 
    
         
            -
                  attr_reader :content
         
     | 
| 
       6 
     | 
    
         
            -
                  attr_reader :lines
         
     | 
| 
       7 
     | 
    
         
            -
                  attr_reader :ranges
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  def initialize(name:, content:)
         
     | 
| 
       10 
     | 
    
         
            -
                    @name = name
         
     | 
| 
       11 
     | 
    
         
            -
                    @content = content
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    @lines = content.split(/\n/, -1)
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    @ranges = []
         
     | 
| 
       16 
     | 
    
         
            -
                    offset = 0
         
     | 
| 
       17 
     | 
    
         
            -
                    lines.each.with_index do |line, index|
         
     | 
| 
       18 
     | 
    
         
            -
                      if index == lines.size - 1
         
     | 
| 
       19 
     | 
    
         
            -
                        ranges << (offset..offset)
         
     | 
| 
       20 
     | 
    
         
            -
                      else
         
     | 
| 
       21 
     | 
    
         
            -
                        size = line.size
         
     | 
| 
       22 
     | 
    
         
            -
                        range = offset..(offset+size)
         
     | 
| 
       23 
     | 
    
         
            -
                        ranges << range
         
     | 
| 
       24 
     | 
    
         
            -
                        offset += size+1
         
     | 
| 
       25 
     | 
    
         
            -
                      end
         
     | 
| 
       26 
     | 
    
         
            -
                    end
         
     | 
| 
       27 
     | 
    
         
            -
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                  def pos_to_loc(pos)
         
     | 
| 
       30 
     | 
    
         
            -
                    index = ranges.bsearch_index do |range|
         
     | 
| 
       31 
     | 
    
         
            -
                      pos <= range.end
         
     | 
| 
       32 
     | 
    
         
            -
                    end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                    if index
         
     | 
| 
       35 
     | 
    
         
            -
                      [index + 1, pos - ranges[index].begin]
         
     | 
| 
       36 
     | 
    
         
            -
                    else
         
     | 
| 
       37 
     | 
    
         
            -
                      [1, pos]
         
     | 
| 
       38 
     | 
    
         
            -
                    end
         
     | 
| 
       39 
     | 
    
         
            -
                  end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                  def loc_to_pos(loc)
         
     | 
| 
       42 
     | 
    
         
            -
                    line, column = loc
         
     | 
| 
       43 
     | 
    
         
            -
                    ranges[line - 1].begin + column
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                  def source(range)
         
     | 
| 
       47 
     | 
    
         
            -
                    content[range]
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
              end
         
     | 
| 
       51 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/steep/ast/location.rb
    DELETED
    
    | 
         @@ -1,86 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Steep
         
     | 
| 
       2 
     | 
    
         
            -
              module AST
         
     | 
| 
       3 
     | 
    
         
            -
                class Location
         
     | 
| 
       4 
     | 
    
         
            -
                  attr_reader :buffer
         
     | 
| 
       5 
     | 
    
         
            -
                  attr_reader :start_pos
         
     | 
| 
       6 
     | 
    
         
            -
                  attr_reader :end_pos
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                  def initialize(buffer:, start_pos:, end_pos:)
         
     | 
| 
       9 
     | 
    
         
            -
                    @buffer = buffer
         
     | 
| 
       10 
     | 
    
         
            -
                    @start_pos = start_pos
         
     | 
| 
       11 
     | 
    
         
            -
                    @end_pos = end_pos
         
     | 
| 
       12 
     | 
    
         
            -
                  end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  def inspect
         
     | 
| 
       15 
     | 
    
         
            -
                    "#<#{self.class}:#{self.__id__} @buffer=#{buffer.name}, @start_pos=#{start_pos}, @end_pos=#{end_pos}, source='#{source.lines.first}', start_line=#{start_line}, start_column=#{start_column}>"
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                  def name
         
     | 
| 
       19 
     | 
    
         
            -
                    buffer.name
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  def start_line
         
     | 
| 
       23 
     | 
    
         
            -
                    start_loc[0]
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  def start_column
         
     | 
| 
       27 
     | 
    
         
            -
                    start_loc[1]
         
     | 
| 
       28 
     | 
    
         
            -
                  end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                  def end_line
         
     | 
| 
       31 
     | 
    
         
            -
                    end_loc[0]
         
     | 
| 
       32 
     | 
    
         
            -
                  end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                  def end_column
         
     | 
| 
       35 
     | 
    
         
            -
                    end_loc[1]
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                  def start_loc
         
     | 
| 
       39 
     | 
    
         
            -
                    @start_loc ||= buffer.pos_to_loc(start_pos)
         
     | 
| 
       40 
     | 
    
         
            -
                  end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                  def end_loc
         
     | 
| 
       43 
     | 
    
         
            -
                    @end_loc ||= buffer.pos_to_loc(end_pos)
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                  def source
         
     | 
| 
       47 
     | 
    
         
            -
                    @source ||= buffer.source(start_pos...end_pos)
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                  def to_s
         
     | 
| 
       51 
     | 
    
         
            -
                    "#{start_line}:#{start_column}...#{end_line}:#{end_column}"
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                  def ==(other)
         
     | 
| 
       55 
     | 
    
         
            -
                    other.is_a?(Location) &&
         
     | 
| 
       56 
     | 
    
         
            -
                      other.buffer == buffer &&
         
     | 
| 
       57 
     | 
    
         
            -
                      other.start_pos == start_pos &&
         
     | 
| 
       58 
     | 
    
         
            -
                      other.end_pos == end_pos
         
     | 
| 
       59 
     | 
    
         
            -
                  end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                  def +(other)
         
     | 
| 
       62 
     | 
    
         
            -
                    if other
         
     | 
| 
       63 
     | 
    
         
            -
                      raise "Invalid concat: buffer=#{buffer.name}, other.buffer=#{other.buffer.name}" unless other.buffer == buffer
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
                      self.class.new(buffer: buffer,
         
     | 
| 
       66 
     | 
    
         
            -
                                     start_pos: start_pos,
         
     | 
| 
       67 
     | 
    
         
            -
                                     end_pos: other.end_pos)
         
     | 
| 
       68 
     | 
    
         
            -
                    else
         
     | 
| 
       69 
     | 
    
         
            -
                      self
         
     | 
| 
       70 
     | 
    
         
            -
                    end
         
     | 
| 
       71 
     | 
    
         
            -
                  end
         
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
                  def self.concat(*locations)
         
     | 
| 
       74 
     | 
    
         
            -
                    locations.inject {|l1, l2|
         
     | 
| 
       75 
     | 
    
         
            -
                      l1 + l2
         
     | 
| 
       76 
     | 
    
         
            -
                    }
         
     | 
| 
       77 
     | 
    
         
            -
                  end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                  def pred?(loc)
         
     | 
| 
       80 
     | 
    
         
            -
                    loc.is_a?(Location) &&
         
     | 
| 
       81 
     | 
    
         
            -
                      loc.name == name &&
         
     | 
| 
       82 
     | 
    
         
            -
                      loc.start_pos == end_pos
         
     | 
| 
       83 
     | 
    
         
            -
                  end
         
     | 
| 
       84 
     | 
    
         
            -
                end
         
     | 
| 
       85 
     | 
    
         
            -
              end
         
     | 
| 
       86 
     | 
    
         
            -
            end
         
     |