steep 1.2.0 → 1.3.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
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