steep 1.2.0 → 1.3.0.pre.1

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -2
  3. data/Gemfile.lock +14 -4
  4. data/Gemfile.steep +2 -2
  5. data/Gemfile.steep.lock +17 -5
  6. data/Steepfile +7 -9
  7. data/lib/steep/annotation_parser.rb +34 -28
  8. data/lib/steep/ast/annotation.rb +16 -5
  9. data/lib/steep/ast/node/type_application.rb +74 -0
  10. data/lib/steep/ast/node/type_assertion.rb +56 -0
  11. data/lib/steep/ast/types/factory.rb +5 -1
  12. data/lib/steep/diagnostic/helper.rb +2 -1
  13. data/lib/steep/diagnostic/lsp_formatter.rb +3 -1
  14. data/lib/steep/diagnostic/ruby.rb +70 -5
  15. data/lib/steep/diagnostic/signature.rb +21 -8
  16. data/lib/steep/drivers/check.rb +1 -1
  17. data/lib/steep/drivers/checkfile.rb +1 -1
  18. data/lib/steep/drivers/langserver.rb +2 -2
  19. data/lib/steep/drivers/stats.rb +1 -1
  20. data/lib/steep/drivers/watch.rb +1 -1
  21. data/lib/steep/drivers/worker.rb +0 -1
  22. data/lib/steep/server/lsp_formatter.rb +13 -3
  23. data/lib/steep/server/master.rb +4 -1
  24. data/lib/steep/server/worker_process.rb +86 -14
  25. data/lib/steep/services/hover_provider/rbs.rb +7 -7
  26. data/lib/steep/services/hover_provider/ruby.rb +19 -4
  27. data/lib/steep/services/signature_service.rb +7 -4
  28. data/lib/steep/signature/validator.rb +36 -13
  29. data/lib/steep/source.rb +189 -71
  30. data/lib/steep/type_construction.rb +232 -126
  31. data/lib/steep/type_inference/logic_type_interpreter.rb +31 -5
  32. data/lib/steep/version.rb +1 -1
  33. data/lib/steep.rb +2 -0
  34. data/rbs_collection.steep.lock.yaml +52 -11
  35. data/rbs_collection.steep.yaml +1 -1
  36. data/sig/shims/exception.rbs +4 -0
  37. data/sig/shims/parser/comment.rbs +33 -0
  38. data/sig/shims/parser.rbs +30 -2
  39. data/sig/steep/annotation_parser.rbs +59 -0
  40. data/sig/steep/ast/annotation.rbs +21 -26
  41. data/sig/steep/ast/node/type_application.rbs +31 -0
  42. data/sig/steep/ast/node/type_assertion.rbs +26 -0
  43. data/sig/steep/ast/types/factory.rbs +0 -2
  44. data/sig/steep/diagnostic/helper.rbs +9 -3
  45. data/sig/steep/diagnostic/lsp_formatter.rbs +12 -8
  46. data/sig/steep/diagnostic/ruby.rbs +62 -8
  47. data/sig/steep/diagnostic/signature.rbs +118 -85
  48. data/sig/steep/drivers/worker.rbs +11 -13
  49. data/sig/steep/range_extension.rbs +7 -0
  50. data/sig/steep/server/lsp_formatter.rbs +14 -7
  51. data/sig/steep/server/worker_process.rbs +74 -12
  52. data/sig/steep/services/hover_provider/rbs.rbs +27 -7
  53. data/sig/steep/services/hover_provider/ruby.rbs +18 -4
  54. data/sig/steep/services/hover_provider/singleton_methods.rbs +1 -1
  55. data/sig/steep/signature/validator.rbs +76 -0
  56. data/sig/steep/source.rbs +54 -30
  57. data/sig/steep/type_construction.rbs +85 -27
  58. data/sig/steep/type_inference/method_call.rbs +1 -1
  59. data/smoke/diagnostics-rbs/inherit-module.rbs +2 -0
  60. data/smoke/diagnostics-rbs/test_expectations.yml +12 -0
  61. data/steep.gemspec +6 -1
  62. metadata +86 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93e3e37cfc8107518827a5b5e7126618c6189fae7804456e706b8ee810941ad7
4
- data.tar.gz: c80ef32b93abb3f0c1f6f77eba1a675c993a2eb94632825f9057f76a39edb0ce
3
+ metadata.gz: f43e7d3a3abaa803d24bb2ef587d495e1d000380e9a4de2318d6371403a70238
4
+ data.tar.gz: d5fd761223ef4dcc6dcc4e76f3eb952a5dab19a5713e73e024871043ae6fbab8
5
5
  SHA512:
6
- metadata.gz: 72d8aadb1ea9454f47f4ab98dbd353c8372aa676096923c05d13d87f3b226fc7102c573bf02d563a5adbb2a072747ff5e9ea282e33cf0654ad3d3f562ebe81a5
7
- data.tar.gz: 15fe6ea35cb298337440074e188178c6fdf73a03b5104fbca92863f8863862bfbb9d8e942e0b2482394307a19061185335da442af29d878c7d98f904ee52d2ab
6
+ metadata.gz: 243b110b292f2da9dbde2f348aa9dd23353da8dc0854776cb10f74f21e97103af23f868eff56b48a78c9e400399858062b2d07a72ddb78493abcc33f8bd2fe1d
7
+ data.tar.gz: 36e71cdf0113ff3b4d3946cf44befd945e8304b0deb16478762f90aa4f7f6a58bca28cc0f09f70155196fc116ea39164543b254a870b4e8c81cb203b6980cbfd
data/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.3.0.pre.1 (2022-11-22)
6
+
7
+ ### Type checker core
8
+
9
+ * Add type assertion syntax ([#665](https://github.com/soutaro/steep/pull/665))
10
+ * Add type application syntax ([#670](https://github.com/soutaro/steep/pull/670))
11
+
12
+ ### Commandline tool
13
+
14
+ * Fork when available for quicker startup ([#664](https://github.com/soutaro/steep/pull/664))
15
+
16
+ ### Miscellaneous
17
+
18
+ * Fixes for some RBS errors within steep gem ([#668](https://github.com/soutaro/steep/pull/668))
19
+ * Upgrade to RBS 2.8 (pre) ([#669](https://github.com/soutaro/steep/pull/669))
20
+
21
+ ## 1.2.1 (2022-10-22)
22
+
23
+ ### Type checker core
24
+
25
+ * Fix type narrowing on case-when ([#662](https://github.com/soutaro/steep/pull/662))
26
+
5
27
  ## 1.2.0 (2022-10-08)
6
28
 
7
29
  ### Commandline tool
@@ -20,8 +42,7 @@
20
42
  * Support type checking block/proc self type binding ([#637](https://github.com/soutaro/steep/pull/637))
21
43
  * Type check multiple assignment on block parameters ([#641](https://github.com/soutaro/steep/pull/641), [#643](https://github.com/soutaro/steep/pull/643))
22
44
  * Make more multiple assignments type check ([#630](https://github.com/soutaro/steep/pull/630))
23
- * Refactor *shape* calculation ([#635](https://github.com/soutaro/steep/pull/635), [#649
24
- ](https://github.com/soutaro/steep/pull/649))
45
+ * Refactor *shape* calculation ([#635](https://github.com/soutaro/steep/pull/635), [#649](https://github.com/soutaro/steep/pull/649))
25
46
  * Report type errors if argument mismatch on yield ([#640](https://github.com/soutaro/steep/pull/640))
26
47
  * Relax caching requirements to cache more results ([#651](https://github.com/soutaro/steep/pull/651))
27
48
 
data/Gemfile.lock CHANGED
@@ -1,15 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- steep (1.2.0)
4
+ steep (1.3.0.pre.1)
5
5
  activesupport (>= 5.1)
6
+ csv (>= 3.0.9)
7
+ fileutils (>= 1.1.0)
8
+ json (>= 2.1.0)
6
9
  language_server-protocol (>= 3.15, < 4.0)
7
10
  listen (~> 3.0)
11
+ logger (>= 1.3.0)
8
12
  parallel (>= 1.0.0)
9
13
  parser (>= 3.1)
10
14
  rainbow (>= 2.2.2, < 4.0)
11
- rbs (>= 2.7.0)
15
+ rbs (>= 2.8.0.pre)
12
16
  securerandom (>= 0.1)
17
+ strscan (>= 1.0.0)
13
18
  terminal-table (>= 2, < 4)
14
19
 
15
20
  GEM
@@ -22,16 +27,20 @@ GEM
22
27
  tzinfo (~> 2.0)
23
28
  ast (2.4.2)
24
29
  concurrent-ruby (1.1.10)
30
+ csv (3.2.5)
25
31
  debase (0.2.5.beta2)
26
32
  debase-ruby_core_source (>= 0.10.12)
27
33
  debase-ruby_core_source (0.10.16)
28
34
  ffi (1.15.5)
35
+ fileutils (1.6.0)
29
36
  i18n (1.12.0)
30
37
  concurrent-ruby (~> 1.0)
38
+ json (2.6.2)
31
39
  language_server-protocol (3.17.0.1)
32
40
  listen (3.7.1)
33
41
  rb-fsevent (~> 0.10, >= 0.10.3)
34
42
  rb-inotify (~> 0.9, >= 0.9.10)
43
+ logger (1.5.1)
35
44
  minitest (5.16.3)
36
45
  minitest-hooks (1.5.0)
37
46
  minitest (> 5.3)
@@ -45,11 +54,12 @@ GEM
45
54
  rb-fsevent (0.11.2)
46
55
  rb-inotify (0.10.1)
47
56
  ffi (~> 1.0)
48
- rbs (2.7.0)
57
+ rbs (2.8.0.pre.1)
49
58
  ruby-debug-ide (0.7.3)
50
59
  rake (>= 0.8.1)
51
60
  securerandom (0.2.0)
52
- stackprof (0.2.21)
61
+ stackprof (0.2.22)
62
+ strscan (3.0.4)
53
63
  terminal-table (3.0.2)
54
64
  unicode-display_width (>= 1.1.1, < 3)
55
65
  tzinfo (2.0.5)
data/Gemfile.steep CHANGED
@@ -1,4 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'steep', '~> 1.1.0'
4
- gem "rbs", "~> 2.7.pre"
3
+ gem 'steep', '~> 1.2.0'
4
+ gem "rbs", '~> 2.8.0.pre'
data/Gemfile.steep.lock CHANGED
@@ -8,13 +8,17 @@ GEM
8
8
  tzinfo (~> 2.0)
9
9
  ast (2.4.2)
10
10
  concurrent-ruby (1.1.10)
11
+ csv (3.2.5)
11
12
  ffi (1.15.5)
13
+ fileutils (1.6.0)
12
14
  i18n (1.12.0)
13
15
  concurrent-ruby (~> 1.0)
16
+ json (2.6.2)
14
17
  language_server-protocol (3.17.0.1)
15
18
  listen (3.7.1)
16
19
  rb-fsevent (~> 0.10, >= 0.10.3)
17
20
  rb-inotify (~> 0.9, >= 0.9.10)
21
+ logger (1.5.1)
18
22
  minitest (5.16.3)
19
23
  parallel (1.22.1)
20
24
  parser (3.1.2.1)
@@ -23,16 +27,24 @@ GEM
23
27
  rb-fsevent (0.11.2)
24
28
  rb-inotify (0.10.1)
25
29
  ffi (~> 1.0)
26
- rbs (2.7.0.pre.2)
27
- steep (1.1.1)
30
+ rbs (2.8.0.pre.1)
31
+ securerandom (0.2.0)
32
+ steep (1.2.1)
28
33
  activesupport (>= 5.1)
34
+ csv (>= 3.0.9)
35
+ fileutils (>= 1.1.0)
36
+ json (>= 2.1.0)
29
37
  language_server-protocol (>= 3.15, < 4.0)
30
38
  listen (~> 3.0)
39
+ logger (>= 1.3.0)
31
40
  parallel (>= 1.0.0)
32
41
  parser (>= 3.1)
33
42
  rainbow (>= 2.2.2, < 4.0)
34
- rbs (>= 2.3.2)
43
+ rbs (>= 2.7.0)
44
+ securerandom (>= 0.1)
45
+ strscan (>= 1.0.0)
35
46
  terminal-table (>= 2, < 4)
47
+ strscan (3.0.4)
36
48
  terminal-table (3.0.2)
37
49
  unicode-display_width (>= 1.1.1, < 3)
38
50
  tzinfo (2.0.5)
@@ -43,8 +55,8 @@ PLATFORMS
43
55
  arm64-darwin-21
44
56
 
45
57
  DEPENDENCIES
46
- rbs (~> 2.7.pre)
47
- steep (~> 1.1.0)
58
+ rbs (~> 2.8.0.pre)
59
+ steep (~> 1.2.0)
48
60
 
49
61
  BUNDLED WITH
50
62
  2.3.15
data/Steepfile CHANGED
@@ -1,30 +1,28 @@
1
+ D = Steep::Diagnostic
2
+
1
3
  target :app do
2
4
  check "lib"
3
5
  signature "sig"
4
6
 
5
7
  collection_config "rbs_collection.steep.yaml"
6
8
 
7
- signature "../rbs/sig", "../rbs/stdlib/rdoc/0"
9
+ configure_code_diagnostics do |hash| # You can setup everything yourself
10
+ hash[D::Ruby::MethodDefinitionMissing] = :hint
11
+ end
12
+
8
13
  library(
9
14
  "set",
10
15
  "pathname",
11
- "json",
12
- "logger",
13
16
  "monitor",
14
17
  "tsort",
15
18
  "uri",
16
19
  'yaml',
17
- 'dbm',
18
20
  'pstore',
19
21
  'singleton',
20
22
  'shellwords',
21
- 'fileutils',
22
23
  'find',
23
24
  'digest',
24
- "strscan",
25
- "rubygems",
26
25
  "optparse",
27
- "securerandom",
28
- "csv"
26
+ "securerandom"
29
27
  )
30
28
  end
@@ -27,7 +27,7 @@ module Steep
27
27
  message = case exn
28
28
  when RBS::ParsingError
29
29
  Diagnostic::Signature::SyntaxError.parser_syntax_error_message(exn)
30
- else
30
+ when Exception
31
31
  exn.message
32
32
  end
33
33
 
@@ -45,16 +45,10 @@ module Steep
45
45
  factory.type(RBS::Parser.parse_type(string))
46
46
  end
47
47
 
48
- # @type ${keyword} ${name}: ${type}
49
- # Example: @type const Foo::Bar: String
50
- # @type var xyzzy: Array[String]
51
48
  def keyword_subject_type(keyword, name)
52
49
  /@type\s+#{keyword}\s+(?<name>#{name})#{COLON}#{TYPE}/
53
50
  end
54
51
 
55
- # @type ${keyword}: ${type}
56
- # Example: @type break: String
57
- # @type self: Foo
58
52
  def keyword_and_type(keyword)
59
53
  /@type\s+#{keyword}#{COLON}#{TYPE}/
60
54
  end
@@ -63,8 +57,9 @@ module Steep
63
57
  case src
64
58
  when keyword_subject_type("var", VAR_NAME)
65
59
  Regexp.last_match.yield_self do |match|
66
- name = match[:name]
67
- type = match[:type]
60
+ match or raise
61
+ name = match[:name] or raise
62
+ type = match[:type] or raise
68
63
 
69
64
  AST::Annotation::VarType.new(name: name.to_sym,
70
65
  type: parse_type(type),
@@ -73,8 +68,9 @@ module Steep
73
68
 
74
69
  when keyword_subject_type("method", METHOD_NAME)
75
70
  Regexp.last_match.yield_self do |match|
76
- name = match[:name]
77
- type = match[:type]
71
+ match or raise
72
+ name = match[:name] or raise
73
+ type = match[:type] or raise
78
74
 
79
75
  method_type = factory.method_type(RBS::Parser.parse_method_type(type), method_decls: Set[])
80
76
 
@@ -85,16 +81,18 @@ module Steep
85
81
 
86
82
  when keyword_subject_type("const", CONST_NAME)
87
83
  Regexp.last_match.yield_self do |match|
88
- name = match[:name]
89
- type = parse_type(match[:type])
84
+ match or raise
85
+ name = match[:name] or raise
86
+ type = parse_type(match[:type] || raise)
90
87
 
91
88
  AST::Annotation::ConstType.new(name: TypeName(name), type: type, location: location)
92
89
  end
93
90
 
94
91
  when keyword_subject_type("ivar", IVAR_NAME)
95
92
  Regexp.last_match.yield_self do |match|
96
- name = match[:name]
97
- type = parse_type(match[:type])
93
+ match or raise
94
+ name = match[:name] or raise
95
+ type = parse_type(match[:type] || raise)
98
96
 
99
97
  AST::Annotation::IvarType.new(name: name.to_sym,
100
98
  type: type,
@@ -103,51 +101,58 @@ module Steep
103
101
 
104
102
  when keyword_and_type("return")
105
103
  Regexp.last_match.yield_self do |match|
106
- type = parse_type(match[:type])
104
+ match or raise
105
+ type = parse_type(match[:type] || raise)
107
106
  AST::Annotation::ReturnType.new(type: type, location: location)
108
107
  end
109
108
 
110
109
  when keyword_and_type("block")
111
110
  Regexp.last_match.yield_self do |match|
112
- type = parse_type(match[:type])
111
+ match or raise
112
+ type = parse_type(match[:type] || raise)
113
113
  AST::Annotation::BlockType.new(type: type, location: location)
114
114
  end
115
115
 
116
116
  when keyword_and_type("self")
117
117
  Regexp.last_match.yield_self do |match|
118
- type = parse_type(match[:type])
118
+ match or raise
119
+ type = parse_type(match[:type] || raise)
119
120
  AST::Annotation::SelfType.new(type: type, location: location)
120
121
  end
121
122
 
122
123
  when keyword_and_type("instance")
123
124
  Regexp.last_match.yield_self do |match|
124
- type = parse_type(match[:type])
125
+ match or raise
126
+ type = parse_type(match[:type] || raise)
125
127
  AST::Annotation::InstanceType.new(type: type, location: location)
126
128
  end
127
129
 
128
130
  when keyword_and_type("module")
129
131
  Regexp.last_match.yield_self do |match|
130
- type = parse_type(match[:type])
132
+ match or raise
133
+ type = parse_type(match[:type] || raise)
131
134
  AST::Annotation::ModuleType.new(type: type, location: location)
132
135
  end
133
136
 
134
137
  when keyword_and_type("break")
135
138
  Regexp.last_match.yield_self do |match|
136
- type = parse_type(match[:type])
139
+ match or raise
140
+ type = parse_type(match[:type] || raise)
137
141
  AST::Annotation::BreakType.new(type: type, location: location)
138
142
  end
139
143
 
140
144
  when /@dynamic\s+(?<names>(#{DYNAMIC_NAME}\s*,\s*)*#{DYNAMIC_NAME})/
141
145
  Regexp.last_match.yield_self do |match|
142
- names = match[:names].split(/\s*,\s*/)
146
+ match or raise
147
+ names = (match[:names] || raise).split(/\s*,\s*/)
143
148
 
144
149
  AST::Annotation::Dynamic.new(
145
150
  names: names.map {|name|
146
- case name
147
- when /^self\./
148
- AST::Annotation::Dynamic::Name.new(name: name[5..].to_sym, kind: :module)
149
- when /^self\?\./
150
- AST::Annotation::Dynamic::Name.new(name: name[6..].to_sym, kind: :module_instance)
151
+ case
152
+ when name.delete_prefix!("self.")
153
+ AST::Annotation::Dynamic::Name.new(name: name.to_sym, kind: :module)
154
+ when name.delete_prefix!("self?.")
155
+ AST::Annotation::Dynamic::Name.new(name: name.to_sym, kind: :module_instance)
151
156
  else
152
157
  AST::Annotation::Dynamic::Name.new(name: name.to_sym, kind: :instance)
153
158
  end
@@ -158,7 +163,8 @@ module Steep
158
163
 
159
164
  when /@implements\s+(?<name>#{CONST_NAME})#{TYPE_PARAMS}$/
160
165
  Regexp.last_match.yield_self do |match|
161
- type_name = TypeName(match[:name])
166
+ match or raise
167
+ type_name = TypeName(match[:name] || raise)
162
168
  params = match[:params]&.yield_self {|params| params.split(/,/).map {|param| param.strip.to_sym } } || []
163
169
 
164
170
  name = AST::Annotation::Implements::Module.new(name: type_name, args: params)
@@ -1,10 +1,19 @@
1
1
  module Steep
2
2
  module AST
3
3
  module Annotation
4
+ module Located
5
+ attr_reader :location
6
+
7
+ def line
8
+ location&.start_line
9
+ end
10
+ end
11
+
4
12
  class Named
13
+ include Located
14
+
5
15
  attr_reader :name
6
16
  attr_reader :type
7
- attr_reader :location
8
17
 
9
18
  def initialize(name:, type:, location: nil)
10
19
  @name = name
@@ -20,9 +29,9 @@ module Steep
20
29
  end
21
30
 
22
31
  class Typed
32
+ include Located
33
+
23
34
  attr_reader :type
24
- attr_reader :annotation
25
- attr_reader :location
26
35
 
27
36
  def initialize(type:, location: nil)
28
37
  @type = type
@@ -68,7 +77,8 @@ module Steep
68
77
  end
69
78
  end
70
79
 
71
- attr_reader :location
80
+ include Located
81
+
72
82
  attr_reader :name
73
83
 
74
84
  def initialize(name:, location: nil)
@@ -108,7 +118,8 @@ module Steep
108
118
  end
109
119
  end
110
120
 
111
- attr_reader :location
121
+ include Located
122
+
112
123
  attr_reader :names
113
124
 
114
125
  def initialize(names:, location: nil)
@@ -0,0 +1,74 @@
1
+ module Steep
2
+ module AST
3
+ module Node
4
+ class TypeApplication
5
+ attr_reader :location
6
+
7
+ def initialize(location)
8
+ @location = location
9
+ end
10
+
11
+ def node
12
+ @node || raise
13
+ end
14
+
15
+ def set_node(node)
16
+ @node = node
17
+ end
18
+
19
+ def line
20
+ location.start_line
21
+ end
22
+
23
+ def source
24
+ location.source
25
+ end
26
+
27
+ def types(context, factory, type_vars)
28
+ # @type var types: Array[Types::t]
29
+ types = []
30
+
31
+ loc = type_location
32
+
33
+ while true
34
+ ty = RBS::Parser.parse_type(loc.buffer, range: loc.range, variables: type_vars) or break
35
+ ty = factory.type(ty)
36
+ types << factory.absolute_type(ty, context: context)
37
+
38
+ match = RBS::Location.new(loc.buffer, ty.location.end_pos, type_location.end_pos).source.match(/\A\s*,\s*/) or break
39
+ offset = match.length
40
+ loc = RBS::Location.new(loc.buffer, ty.location.end_pos + offset, type_location.end_pos)
41
+ end
42
+
43
+ types
44
+ rescue ::RBS::ParsingError => exn
45
+ exn
46
+ end
47
+
48
+ def types?(context, factory, type_vars)
49
+ case types = types(context, factory, type_vars)
50
+ when RBS::ParsingError
51
+ nil
52
+ else
53
+ types
54
+ end
55
+ end
56
+
57
+ def type_str
58
+ @type_str ||= source.delete_prefix("$").lstrip
59
+ end
60
+
61
+ def type_location
62
+ offset = source.size - type_str.size
63
+ RBS::Location.new(location.buffer, location.start_pos + offset, location.end_pos)
64
+ end
65
+
66
+ def self.parse(location)
67
+ if location.source =~/\A\$\s*(.+)/
68
+ TypeApplication.new(location)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,56 @@
1
+ module Steep
2
+ module AST
3
+ module Node
4
+ class TypeAssertion
5
+ attr_reader :location
6
+
7
+ def initialize(location)
8
+ @location = location
9
+ end
10
+
11
+ def source
12
+ location.source
13
+ end
14
+
15
+ def line
16
+ location.start_line
17
+ end
18
+
19
+ def type(context, factory, type_vars)
20
+ if ty = RBS::Parser.parse_type(type_location.buffer, range: type_location.range, variables: type_vars)
21
+ ty = factory.type(ty)
22
+ factory.absolute_type(ty, context: context)
23
+ else
24
+ nil
25
+ end
26
+ rescue ::RBS::ParsingError => exn
27
+ exn
28
+ end
29
+
30
+ def type?(context, factory, type_vars)
31
+ case type = type(context, factory, type_vars)
32
+ when RBS::ParsingError
33
+ nil
34
+ else
35
+ type
36
+ end
37
+ end
38
+
39
+ def type_str
40
+ @type_str ||= source.delete_prefix(":").lstrip
41
+ end
42
+
43
+ def type_location
44
+ offset = source.size - type_str.size
45
+ RBS::Location.new(location.buffer, location.start_pos + offset, location.end_pos)
46
+ end
47
+
48
+ def self.parse(location)
49
+ if location.source =~/\A:\s*(.+)/
50
+ TypeAssertion.new(location)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -37,7 +37,11 @@ module Steep
37
37
  end
38
38
 
39
39
  def type(type)
40
- ty = type_cache[type] and return ty
40
+ unless type.location
41
+ if ty = type_cache[type]
42
+ return ty
43
+ end
44
+ end
41
45
 
42
46
  type_cache[type] =
43
47
  case type
@@ -2,7 +2,8 @@ module Steep
2
2
  module Diagnostic
3
3
  module Helper
4
4
  def error_name
5
- self.class.name.split(/::/).last
5
+ name = self.class.name or raise
6
+ name.split(/::/).last or raise
6
7
  end
7
8
 
8
9
  def full_message
@@ -41,11 +41,13 @@ module Steep
41
41
  severity = severity_for(diagnostic)
42
42
 
43
43
  if severity
44
+ range = diagnostic.location&.as_lsp_range or raise
45
+
44
46
  LSP::Interface::Diagnostic.new(
45
47
  message: diagnostic.full_message,
46
48
  code: diagnostic.diagnostic_code,
47
49
  severity: severity,
48
- range: diagnostic.location.as_lsp_range
50
+ range: range
49
51
  ).to_hash
50
52
  end
51
53
  end