steep 1.0.2 → 1.1.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +5 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +22 -3
  5. data/Gemfile +6 -3
  6. data/Gemfile.lock +12 -16
  7. data/Gemfile.steep +3 -0
  8. data/Gemfile.steep.lock +49 -0
  9. data/Rakefile +5 -0
  10. data/Steepfile +6 -1
  11. data/bin/setup +2 -0
  12. data/bin/steep +19 -0
  13. data/lib/steep/ast/types/factory.rb +1 -1
  14. data/lib/steep/diagnostic/ruby.rb +49 -3
  15. data/lib/steep/diagnostic/signature.rb +18 -0
  16. data/lib/steep/drivers/watch.rb +3 -1
  17. data/lib/steep/method_name.rb +9 -3
  18. data/lib/steep/node_helper.rb +49 -0
  19. data/lib/steep/services/completion_provider.rb +22 -15
  20. data/lib/steep/services/hover_provider/ruby.rb +30 -12
  21. data/lib/steep/services/type_check_service.rb +12 -12
  22. data/lib/steep/shims/symbol_start_with.rb +18 -0
  23. data/lib/steep/signature/validator.rb +19 -0
  24. data/lib/steep/subtyping/constraints.rb +43 -14
  25. data/lib/steep/type_construction.rb +666 -746
  26. data/lib/steep/type_inference/constant_env.rb +0 -2
  27. data/lib/steep/type_inference/context.rb +23 -17
  28. data/lib/steep/type_inference/logic_type_interpreter.rb +210 -119
  29. data/lib/steep/type_inference/method_call.rb +80 -6
  30. data/lib/steep/type_inference/multiple_assignment.rb +189 -0
  31. data/lib/steep/type_inference/type_env.rb +271 -120
  32. data/lib/steep/type_inference/type_env_builder.rb +138 -0
  33. data/lib/steep/typing.rb +2 -0
  34. data/lib/steep/version.rb +1 -1
  35. data/lib/steep.rb +4 -3
  36. data/rbs_collection.steep.lock.yaml +112 -0
  37. data/rbs_collection.steep.yaml +19 -0
  38. data/sample/sig/conference.rbs +8 -0
  39. data/sig/shims/parser/source/map.rbs +146 -0
  40. data/sig/shims/parser/source/range.rbs +237 -0
  41. data/sig/shims/parser.rbs +17 -0
  42. data/sig/steep/ast/annotation/collection.rbs +75 -0
  43. data/sig/steep/ast/annotation.rbs +126 -0
  44. data/sig/steep/ast/builtin.rbs +69 -0
  45. data/sig/steep/ast/type_params.rbs +11 -0
  46. data/sig/steep/ast/types/any.rbs +29 -0
  47. data/sig/steep/ast/types/boolean.rbs +31 -0
  48. data/sig/steep/ast/types/bot.rbs +29 -0
  49. data/sig/steep/ast/types/class.rbs +29 -0
  50. data/sig/steep/ast/types/factory.rbs +76 -0
  51. data/sig/steep/ast/types/helper.rbs +19 -0
  52. data/sig/steep/ast/types/instance.rbs +29 -0
  53. data/sig/steep/ast/types/intersection.rbs +35 -0
  54. data/sig/steep/ast/types/literal.rbs +33 -0
  55. data/sig/steep/ast/types/logic.rbs +78 -0
  56. data/sig/steep/ast/types/name.rbs +71 -0
  57. data/sig/steep/ast/types/nil.rbs +31 -0
  58. data/sig/steep/ast/types/proc.rbs +46 -0
  59. data/sig/steep/ast/types/record.rbs +38 -0
  60. data/sig/steep/ast/types/self.rbs +29 -0
  61. data/sig/steep/ast/types/top.rbs +29 -0
  62. data/sig/steep/ast/types/tuple.rbs +34 -0
  63. data/sig/steep/ast/types/union.rbs +38 -0
  64. data/sig/steep/ast/types/var.rbs +37 -0
  65. data/sig/steep/ast/types/void.rbs +29 -0
  66. data/sig/steep/ast/types.rbs +37 -0
  67. data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +15 -0
  68. data/sig/steep/diagnostic/helper.rbs +9 -0
  69. data/sig/steep/diagnostic/lsp_formatter.rbs +29 -0
  70. data/sig/steep/diagnostic/ruby.rbs +494 -0
  71. data/sig/steep/diagnostic/signature.rbs +215 -0
  72. data/sig/steep/interface/block.rbs +35 -0
  73. data/sig/steep/interface/function.rbs +253 -0
  74. data/sig/steep/interface/interface.rbs +23 -0
  75. data/sig/steep/interface/method_type.rbs +55 -0
  76. data/sig/steep/interface/substitution.rbs +53 -0
  77. data/sig/steep/interface/type_param.rbs +35 -0
  78. data/sig/steep/method_name.rbs +26 -0
  79. data/sig/steep/module_helper.rbs +7 -0
  80. data/sig/steep/node_helper.rbs +11 -0
  81. data/sig/steep/project/dsl.rbs +94 -0
  82. data/sig/steep/project/options.rbs +15 -0
  83. data/sig/steep/project/pattern.rbs +25 -0
  84. data/sig/steep/project/target.rbs +25 -0
  85. data/sig/steep/project.rbs +19 -0
  86. data/sig/steep/services/completion_provider.rbs +123 -0
  87. data/sig/steep/services/content_change.rbs +35 -0
  88. data/sig/steep/services/file_loader.rbs +13 -0
  89. data/sig/steep/services/goto_service.rbs +45 -0
  90. data/sig/steep/services/hover_provider/rbs.rbs +21 -0
  91. data/sig/steep/services/hover_provider/ruby.rbs +109 -0
  92. data/sig/steep/services/hover_provider/singleton_methods.rbs +11 -0
  93. data/sig/steep/services/path_assignment.rbs +21 -0
  94. data/sig/steep/services/signature_service.rbs +91 -0
  95. data/sig/steep/services/stats_calculator.rbs +17 -0
  96. data/sig/steep/services/type_check_service.rbs +93 -0
  97. data/sig/steep/source.rbs +55 -0
  98. data/sig/steep/subtyping/cache.rbs +17 -0
  99. data/sig/steep/subtyping/check.rbs +93 -0
  100. data/sig/steep/subtyping/constraints.rbs +111 -0
  101. data/sig/steep/subtyping/relation.rbs +51 -0
  102. data/sig/steep/subtyping/result.rbs +157 -0
  103. data/sig/steep/subtyping/variable_variance.rbs +23 -0
  104. data/sig/steep/type_construction.rbs +285 -0
  105. data/sig/steep/type_inference/block_params.rbs +52 -0
  106. data/sig/steep/type_inference/constant_env.rbs +27 -0
  107. data/sig/steep/type_inference/context.rbs +137 -0
  108. data/sig/steep/type_inference/logic_type_interpreter.rbs +72 -0
  109. data/sig/steep/type_inference/method_call.rbs +124 -0
  110. data/sig/steep/type_inference/method_params.rbs +104 -0
  111. data/sig/steep/type_inference/multiple_assignment.rbs +76 -0
  112. data/sig/steep/type_inference/type_env.rbs +158 -0
  113. data/sig/steep/type_inference/type_env_builder.rbs +77 -0
  114. data/sig/steep/typing.rbs +68 -0
  115. data/sig/steep.rbs +31 -0
  116. data/smoke/class/f.rb +1 -0
  117. data/smoke/class/test_expectations.yml +2 -2
  118. data/smoke/diagnostics/test_expectations.yml +4 -2
  119. metadata +90 -6
  120. data/lib/steep/type_inference/local_variable_type_env.rb +0 -249
  121. data/lib/steep/type_inference/logic.rb +0 -161
@@ -0,0 +1,138 @@
1
+ module Steep
2
+ module TypeInference
3
+ class TypeEnvBuilder
4
+ module Command
5
+ class AnnotationsBase
6
+ attr_reader :annotations
7
+
8
+ def initialize(annotations)
9
+ @annotations = annotations
10
+ end
11
+ end
12
+
13
+ class RBSBase
14
+ attr_reader :factory
15
+
16
+ attr_reader :environment
17
+
18
+ def initialize(factory)
19
+ @factory = factory
20
+ @environment = factory.env
21
+ end
22
+ end
23
+
24
+ class ImportLocalVariableAnnotations < AnnotationsBase
25
+ attr_reader :on_duplicate
26
+
27
+ def initialize(annotations)
28
+ super
29
+ @merge = false
30
+ @on_duplicate = nil
31
+ end
32
+
33
+ def merge!(merge = true)
34
+ @merge = merge
35
+ self
36
+ end
37
+
38
+ def on_duplicate!(&block)
39
+ @on_duplicate = block
40
+ self
41
+ end
42
+
43
+ def call(env)
44
+ local_variable_types = annotations.var_type_annotations.each.with_object({}) do |pair, hash|
45
+ name, annotation = pair
46
+ annotation_type = annotations.absolute_type(annotation.type) || annotation.type
47
+
48
+ if current_type = env[name]
49
+ on_duplicate&.call(name, current_type, annotation_type)
50
+ hash[name] = [annotation_type, annotation_type]
51
+ else
52
+ hash[name] = [annotation_type, annotation_type]
53
+ end
54
+ end
55
+
56
+ if @merge
57
+ env.merge(local_variable_types: local_variable_types)
58
+ else
59
+ env.update(local_variable_types: local_variable_types)
60
+ end
61
+ end
62
+ end
63
+
64
+ class ImportInstanceVariableAnnotations < AnnotationsBase
65
+ def call(env)
66
+ ivar_types = annotations.ivar_type_annotations.transform_values do |annotation|
67
+ annotations.absolute_type(annotation.type) || annotation.type
68
+ end
69
+
70
+ if @merge
71
+ env.merge(instance_variable_types: ivar_types)
72
+ else
73
+ env.update(instance_variable_types: ivar_types)
74
+ end
75
+ end
76
+
77
+ def merge!(merge = true)
78
+ @merge = merge
79
+ self
80
+ end
81
+ end
82
+
83
+ class ImportGlobalDeclarations < RBSBase
84
+ def call(env)
85
+ global_types = environment.global_decls.transform_values do |decl|
86
+ factory.type(decl.decl.type)
87
+ end
88
+
89
+ env.update(global_types: global_types)
90
+ end
91
+ end
92
+
93
+ class ImportInstanceVariableDefinition
94
+ attr_reader :definition
95
+
96
+ attr_reader :factory
97
+
98
+ def initialize(definition, factory)
99
+ @definition = definition
100
+ @factory = factory
101
+ end
102
+
103
+ def call(env)
104
+ return env unless definition
105
+
106
+ instance_variable_types = definition.instance_variables.transform_values do |ivar|
107
+ factory.type(ivar.type)
108
+ end
109
+
110
+ env.update(instance_variable_types: instance_variable_types)
111
+ end
112
+ end
113
+
114
+ class ImportConstantAnnotations < AnnotationsBase
115
+ def call(env)
116
+ constant_types = annotations.const_type_annotations.transform_values do |const|
117
+ annotations.absolute_type(const.type) || const.type
118
+ end
119
+
120
+ env.update(constant_types: constant_types)
121
+ end
122
+ end
123
+ end
124
+
125
+ attr_reader :commands
126
+
127
+ def initialize(*commands)
128
+ @commands = commands
129
+ end
130
+
131
+ def build(type_env)
132
+ commands.inject(type_env) do |env, command|
133
+ command.call(env)
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
data/lib/steep/typing.rb CHANGED
@@ -67,6 +67,8 @@ module Steep
67
67
  end
68
68
 
69
69
  def type_of(node:)
70
+ raise "`nil` given to `Typing#type_of(node:)`" unless node
71
+
70
72
  type = typing[node]
71
73
 
72
74
  if type
data/lib/steep/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0.pre.1"
3
3
  end
data/lib/steep.rb CHANGED
@@ -24,9 +24,11 @@ require "rbs"
24
24
  require "steep/path_helper"
25
25
 
26
26
  require "steep/shims/filter_map"
27
+ require "steep/shims/symbol_start_with"
27
28
 
28
29
  require "steep/equatable"
29
30
  require "steep/method_name"
31
+ require "steep/node_helper"
30
32
  require "steep/ast/types/helper"
31
33
  require "steep/ast/types/any"
32
34
  require "steep/ast/types/instance"
@@ -46,7 +48,6 @@ require "steep/ast/types/tuple"
46
48
  require "steep/ast/types/proc"
47
49
  require "steep/ast/types/record"
48
50
  require "steep/ast/types/logic"
49
- require "steep/ast/type_params"
50
51
  require "steep/ast/annotation"
51
52
  require "steep/ast/annotation/collection"
52
53
  require "steep/ast/builtin"
@@ -85,9 +86,9 @@ require "steep/type_inference/block_params"
85
86
  require "steep/type_inference/method_params"
86
87
  require "steep/type_inference/constant_env"
87
88
  require "steep/type_inference/type_env"
88
- require "steep/type_inference/local_variable_type_env"
89
- require "steep/type_inference/logic"
89
+ require "steep/type_inference/type_env_builder"
90
90
  require "steep/type_inference/logic_type_interpreter"
91
+ require "steep/type_inference/multiple_assignment"
91
92
  require "steep/type_inference/method_call"
92
93
  require "steep/ast/types"
93
94
 
@@ -0,0 +1,112 @@
1
+ ---
2
+ sources:
3
+ - name: ruby/gem_rbs_collection
4
+ remote: https://github.com/ruby/gem_rbs_collection.git
5
+ revision: main
6
+ repo_dir: gems
7
+ path: ".gem_rbs_collection"
8
+ gems:
9
+ - name: set
10
+ version: '0'
11
+ source:
12
+ type: stdlib
13
+ - name: rbs
14
+ version: 2.6.0
15
+ source:
16
+ type: rubygems
17
+ - name: activesupport
18
+ version: '6.0'
19
+ source:
20
+ type: git
21
+ name: ruby/gem_rbs_collection
22
+ revision: cd6db41310b911e1df3476246257510673f01b8a
23
+ remote: https://github.com/ruby/gem_rbs_collection.git
24
+ repo_dir: gems
25
+ - name: ast
26
+ version: '2.4'
27
+ source:
28
+ type: git
29
+ name: ruby/gem_rbs_collection
30
+ revision: cd6db41310b911e1df3476246257510673f01b8a
31
+ remote: https://github.com/ruby/gem_rbs_collection.git
32
+ repo_dir: gems
33
+ - name: i18n
34
+ version: '1.10'
35
+ source:
36
+ type: git
37
+ name: ruby/gem_rbs_collection
38
+ revision: cd6db41310b911e1df3476246257510673f01b8a
39
+ remote: https://github.com/ruby/gem_rbs_collection.git
40
+ repo_dir: gems
41
+ - name: listen
42
+ version: '3.2'
43
+ source:
44
+ type: git
45
+ name: ruby/gem_rbs_collection
46
+ revision: cd6db41310b911e1df3476246257510673f01b8a
47
+ remote: https://github.com/ruby/gem_rbs_collection.git
48
+ repo_dir: gems
49
+ - name: minitest
50
+ version: '0'
51
+ source:
52
+ type: stdlib
53
+ - name: parallel
54
+ version: '1.20'
55
+ source:
56
+ type: git
57
+ name: ruby/gem_rbs_collection
58
+ revision: cd6db41310b911e1df3476246257510673f01b8a
59
+ remote: https://github.com/ruby/gem_rbs_collection.git
60
+ repo_dir: gems
61
+ - name: rainbow
62
+ version: '3.0'
63
+ source:
64
+ type: git
65
+ name: ruby/gem_rbs_collection
66
+ revision: cd6db41310b911e1df3476246257510673f01b8a
67
+ remote: https://github.com/ruby/gem_rbs_collection.git
68
+ repo_dir: gems
69
+ - name: logger
70
+ version: '0'
71
+ source:
72
+ type: stdlib
73
+ - name: pathname
74
+ version: '0'
75
+ source:
76
+ type: stdlib
77
+ - name: json
78
+ version: '0'
79
+ source:
80
+ type: stdlib
81
+ - name: optparse
82
+ version: '0'
83
+ source:
84
+ type: stdlib
85
+ - name: rubygems
86
+ version: '0'
87
+ source:
88
+ type: stdlib
89
+ - name: tsort
90
+ version: '0'
91
+ source:
92
+ type: stdlib
93
+ - name: monitor
94
+ version: '0'
95
+ source:
96
+ type: stdlib
97
+ - name: date
98
+ version: '0'
99
+ source:
100
+ type: stdlib
101
+ - name: singleton
102
+ version: '0'
103
+ source:
104
+ type: stdlib
105
+ - name: mutex_m
106
+ version: '0'
107
+ source:
108
+ type: stdlib
109
+ - name: time
110
+ version: '0'
111
+ source:
112
+ type: stdlib
@@ -0,0 +1,19 @@
1
+ # Download sources
2
+ sources:
3
+ - name: ruby/gem_rbs_collection
4
+ remote: https://github.com/ruby/gem_rbs_collection.git
5
+ revision: main
6
+ repo_dir: gems
7
+
8
+ # A directory to install the downloaded RBSs
9
+ path: .gem_rbs_collection
10
+
11
+ gems:
12
+ # Skip loading rbs gem's RBS.
13
+ # It's unnecessary if you don't use rbs as a library.
14
+ - name: steep
15
+ ignore: true
16
+ - name: set
17
+ - name: rbs
18
+ - name: with_steep_types
19
+ ignore: true
@@ -4,3 +4,11 @@ class Conference
4
4
 
5
5
  def initialize: (title: String, year: Integer) -> void
6
6
  end
7
+
8
+ class NilClass
9
+ def must: () -> bot
10
+ end
11
+
12
+ class Object
13
+ def must: () -> self
14
+ end
@@ -0,0 +1,146 @@
1
+ module Parser
2
+ module Source
3
+ #
4
+ # {Map} relates AST nodes to the source code they were parsed from.
5
+ # More specifically, a {Map} or its subclass contains a set of ranges:
6
+ #
7
+ # * `expression`: smallest range which includes all source corresponding
8
+ # to the node and all `expression` ranges of its children.
9
+ # * other ranges (`begin`, `end`, `operator`, ...): node-specific ranges
10
+ # pointing to various interesting tokens corresponding to the node.
11
+ #
12
+ # Note that the {Map::Heredoc} map is the only one whose `expression` does
13
+ # not include other ranges. It only covers the heredoc marker (`<<HERE`),
14
+ # not the here document itself.
15
+ #
16
+ # All ranges except `expression` are defined by {Map} subclasses.
17
+ #
18
+ # Ranges (except `expression`) can be `nil` if the corresponding token is
19
+ # not present in source. For example, a hash may not have opening/closing
20
+ # braces, and so would its source map.
21
+ #
22
+ # p Parser::CurrentRuby.parse('[1 => 2]').children[0].loc
23
+ # # => <Parser::Source::Map::Collection:0x007f5492b547d8
24
+ # # @end=nil, @begin=nil,
25
+ # # @expression=#<Source::Range (string) 1...7>>
26
+ #
27
+ # The {file:doc/AST_FORMAT.md} document describes how ranges associated to source
28
+ # code tokens. For example, the entry
29
+ #
30
+ # (array (int 1) (int 2))
31
+ #
32
+ # "[1, 2]"
33
+ # ^ begin
34
+ # ^ end
35
+ # ~~~~~~ expression
36
+ #
37
+ # means that if `node` is an {Parser::AST::Node} `(array (int 1) (int 2))`,
38
+ # then `node.loc` responds to `begin`, `end` and `expression`, and
39
+ # `node.loc.begin` returns a range pointing at the opening bracket, and so on.
40
+ #
41
+ # If you want to write code polymorphic by the source map (i.e. accepting
42
+ # several subclasses of {Map}), use `respond_to?` instead of `is_a?` to
43
+ # check whether the map features the range you need. Concrete {Map}
44
+ # subclasses may not be preserved between versions, but their interfaces
45
+ # will be kept compatible.
46
+ #
47
+ # You can visualize the source maps with `ruby-parse -E` command-line tool.
48
+ #
49
+ # @example
50
+ # require 'parser/current'
51
+ #
52
+ # p Parser::CurrentRuby.parse('[1, 2]').loc
53
+ # # => #<Parser::Source::Map::Collection:0x007f14b80eccd8
54
+ # # @end=#<Source::Range (string) 5...6>,
55
+ # # @begin=#<Source::Range (string) 0...1>,
56
+ # # @expression=#<Source::Range (string) 0...6>>
57
+ #
58
+ # @!attribute [r] node
59
+ # The node that is described by this map. Nodes and maps have 1:1 correspondence.
60
+ # @return [Parser::AST::Node]
61
+ #
62
+ # @!attribute [r] expression
63
+ # @return [Range]
64
+ #
65
+ # @api public
66
+ #
67
+ class Map
68
+ attr_reader node: AST::Node
69
+
70
+ attr_reader expression: Range
71
+
72
+ #
73
+ # @param [Range] expression
74
+ def initialize: (untyped expression) -> void
75
+
76
+ #
77
+ # @api private
78
+ def initialize_copy: (untyped other) -> untyped
79
+
80
+ #
81
+ # @api private
82
+ def node=: (untyped node) -> untyped
83
+
84
+ #
85
+ # A shortcut for `self.expression.line`.
86
+ # @return [Integer]
87
+ #
88
+ def line: () -> Integer
89
+
90
+ alias first_line line
91
+
92
+ #
93
+ # A shortcut for `self.expression.column`.
94
+ # @return [Integer]
95
+ #
96
+ def column: () -> Integer
97
+
98
+ #
99
+ # A shortcut for `self.expression.last_line`.
100
+ # @return [Integer]
101
+ #
102
+ def last_line: () -> Integer
103
+
104
+ #
105
+ # A shortcut for `self.expression.last_column`.
106
+ # @return [Integer]
107
+ #
108
+ def last_column: () -> Integer
109
+
110
+ #
111
+ # @api private
112
+ #
113
+ def with_expression: (untyped expression_l) -> untyped
114
+
115
+ #
116
+ # Compares source maps.
117
+ # @return [Boolean]
118
+ #
119
+ def ==: (untyped other) -> bool
120
+
121
+ #
122
+ # Converts this source map to a hash with keys corresponding to
123
+ # ranges. For example, if called on an instance of {Collection},
124
+ # which adds the `begin` and `end` ranges, the resulting hash
125
+ # will contain keys `:expression`, `:begin` and `:end`.
126
+ #
127
+ # @example
128
+ # require 'parser/current'
129
+ #
130
+ # p Parser::CurrentRuby.parse('[1, 2]').loc.to_hash
131
+ # # => {
132
+ # # :begin => #<Source::Range (string) 0...1>,
133
+ # # :end => #<Source::Range (string) 5...6>,
134
+ # # :expression => #<Source::Range (string) 0...6>
135
+ # # }
136
+ #
137
+ # @return [Hash<Symbol, Parser::Source::Range>]
138
+ #
139
+ def to_hash: () -> Hash[Symbol, Range]
140
+
141
+ def with: () ?{ () -> untyped } -> untyped
142
+
143
+ def update_expression: (untyped expression_l) -> untyped
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,237 @@
1
+ module Parser
2
+ module Source
3
+ #
4
+ # A range of characters in a particular source buffer.
5
+ #
6
+ # The range is always exclusive, i.e. a range with `begin_pos` of 3 and
7
+ # `end_pos` of 5 will contain the following characters:
8
+ #
9
+ # example
10
+ # ^^
11
+ #
12
+ # @!attribute [r] source_buffer
13
+ # @return [Parser::Source::Buffer]
14
+ #
15
+ # @!attribute [r] begin_pos
16
+ # @return [Integer] index of the first character in the range
17
+ #
18
+ # @!attribute [r] end_pos
19
+ # @return [Integer] index of the character after the last character in the range
20
+ #
21
+ # @api public
22
+ #
23
+ class Range
24
+ include Comparable
25
+
26
+ attr_reader source_buffer: untyped
27
+
28
+ attr_reader begin_pos: Integer
29
+
30
+ attr_reader end_pos: Integer
31
+
32
+ #
33
+ # @param [Buffer] source_buffer
34
+ # @param [Integer] begin_pos
35
+ # @param [Integer] end_pos
36
+ #
37
+ def initialize: (untyped source_buffer, untyped begin_pos, untyped end_pos) -> void
38
+
39
+ #
40
+ # @return [Range] a zero-length range located just before the beginning
41
+ # of this range.
42
+ #
43
+ def begin: () -> Range
44
+
45
+ #
46
+ # @return [Range] a zero-length range located just after the end
47
+ # of this range.
48
+ #
49
+ def end: () -> Range
50
+
51
+ #
52
+ # @return [Integer] amount of characters included in this range.
53
+ #
54
+ def size: () -> Integer
55
+
56
+ alias length size
57
+
58
+ #
59
+ # Line number of the beginning of this range. By default, the first line
60
+ # of a buffer is 1; as such, line numbers are most commonly one-based.
61
+ #
62
+ # @see Buffer
63
+ # @return [Integer] line number of the beginning of this range.
64
+ #
65
+ def line: () -> Integer
66
+
67
+ alias first_line line
68
+
69
+ #
70
+ # @return [Integer] zero-based column number of the beginning of this range.
71
+ #
72
+ def column: () -> Integer
73
+
74
+ #
75
+ # @return [Integer] line number of the end of this range.
76
+ #
77
+ def last_line: () -> Integer
78
+
79
+ #
80
+ # @return [Integer] zero-based column number of the end of this range.
81
+ #
82
+ def last_column: () -> Integer
83
+
84
+ #
85
+ # @return [::Range] a range of columns spanned by this range.
86
+ # @raise RangeError
87
+ #
88
+ def column_range: () -> ::Range[Integer]
89
+
90
+ #
91
+ # @return [String] a line of source code containing the beginning of this range.
92
+ #
93
+ def source_line: () -> String
94
+
95
+ #
96
+ # @return [String] all source code covered by this range.
97
+ #
98
+ def source: () -> String
99
+
100
+ #
101
+ # `is?` provides a concise way to compare the source corresponding to this range.
102
+ # For example, `r.source == '(' || r.source == 'begin'` is equivalent to
103
+ # `r.is?('(', 'begin')`.
104
+ #
105
+ def is?: (*untyped what) -> untyped
106
+
107
+ #
108
+ # @return [Array<Integer>] a set of character indexes contained in this range.
109
+ #
110
+ def to_a: () -> Array[Integer]
111
+
112
+ #
113
+ # @return [Range] a Ruby range with the same `begin_pos` and `end_pos`
114
+ #
115
+ def to_range: () -> ::Range[Integer]
116
+
117
+ #
118
+ # Composes a GNU/Clang-style string representation of the beginning of this
119
+ # range.
120
+ #
121
+ # For example, for the following range in file `foo.rb`,
122
+ #
123
+ # def foo
124
+ # ^^^
125
+ #
126
+ # `to_s` will return `foo.rb:1:5`.
127
+ # Note that the column index is one-based.
128
+ #
129
+ # @return [String]
130
+ #
131
+ def to_s: () -> String
132
+
133
+ #
134
+ # @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos
135
+ # @return [Range] the same range as this range but with the given end point(s) changed
136
+ # to the given value(s).
137
+ #
138
+ def with: (?begin_pos: untyped, ?end_pos: untyped) -> untyped
139
+
140
+ #
141
+ # @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos
142
+ # @return [Range] the same range as this range but with the given end point(s) adjusted
143
+ # by the given amount(s)
144
+ #
145
+ def adjust: (?begin_pos: ::Integer, ?end_pos: ::Integer) -> untyped
146
+
147
+ #
148
+ # @param [Integer] new_size
149
+ # @return [Range] a range beginning at the same point as this range and length `new_size`.
150
+ #
151
+ def resize: (untyped new_size) -> untyped
152
+
153
+ #
154
+ # @param [Range] other
155
+ # @return [Range] smallest possible range spanning both this range and `other`.
156
+ #
157
+ def join: (untyped other) -> untyped
158
+
159
+ #
160
+ # @param [Range] other
161
+ # @return [Range] overlapping region of this range and `other`, or `nil`
162
+ # if they do not overlap
163
+ #
164
+ def intersect: (untyped other) -> (untyped | nil)
165
+
166
+ #
167
+ # Return `true` iff this range and `other` are disjoint.
168
+ #
169
+ # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
170
+ #
171
+ # @param [Range] other
172
+ # @return [Boolean]
173
+ #
174
+ def disjoint?: (untyped other) -> untyped
175
+
176
+ #
177
+ # Return `true` iff this range is not disjoint from `other`.
178
+ #
179
+ # @param [Range] other
180
+ # @return [Boolean] `true` if this range and `other` overlap
181
+ #
182
+ def overlaps?: (untyped other) -> untyped
183
+
184
+ #
185
+ # Returns true iff this range contains (strictly) `other`.
186
+ #
187
+ # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
188
+ #
189
+ # @param [Range] other
190
+ # @return [Boolean]
191
+ #
192
+ def contains?: (untyped other) -> untyped
193
+
194
+ #
195
+ # Return `other.contains?(self)`
196
+ #
197
+ # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
198
+ #
199
+ # @param [Range] other
200
+ # @return [Boolean]
201
+ #
202
+ def contained?: (untyped other) -> untyped
203
+
204
+ #
205
+ # Returns true iff both ranges intersect and also have different elements from one another.
206
+ #
207
+ # Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
208
+ #
209
+ # @param [Range] other
210
+ # @return [Boolean]
211
+ #
212
+ def crossing?: (untyped other) -> (false | untyped)
213
+
214
+ #
215
+ # Checks if a range is empty; if it contains no characters
216
+ # @return [Boolean]
217
+ def empty?: () -> untyped
218
+
219
+ #
220
+ # Compare ranges, first by begin_pos, then by end_pos.
221
+ #
222
+ def <=>: (untyped other) -> (nil | untyped)
223
+
224
+ alias eql? ==
225
+
226
+ #
227
+ # Support for Ranges be used in as Hash indices and in Sets.
228
+ #
229
+ def hash: () -> untyped
230
+
231
+ #
232
+ # @return [String] a human-readable representation of this range.
233
+ #
234
+ def inspect: () -> ::String
235
+ end
236
+ end
237
+ end