steep 1.3.0 → 1.4.0.dev.2

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-windows.yml +1 -0
  3. data/.github/workflows/ruby.yml +1 -5
  4. data/Gemfile +3 -1
  5. data/Gemfile.lock +22 -19
  6. data/Gemfile.steep +2 -1
  7. data/Gemfile.steep.lock +18 -14
  8. data/Steepfile +16 -0
  9. data/bin/rbs +21 -0
  10. data/bin/setup +1 -1
  11. data/lib/steep/annotation_parser.rb +40 -20
  12. data/lib/steep/ast/types/factory.rb +56 -10
  13. data/lib/steep/ast/types/name.rb +10 -0
  14. data/lib/steep/diagnostic/ruby.rb +1 -1
  15. data/lib/steep/diagnostic/signature.rb +40 -0
  16. data/lib/steep/index/rbs_index.rb +25 -9
  17. data/lib/steep/index/signature_symbol_provider.rb +1 -1
  18. data/lib/steep/project/dsl.rb +12 -4
  19. data/lib/steep/project/options.rb +3 -1
  20. data/lib/steep/project/target.rb +1 -3
  21. data/lib/steep/server/interaction_worker.rb +37 -20
  22. data/lib/steep/server/lsp_formatter.rb +14 -5
  23. data/lib/steep/services/completion_provider.rb +10 -12
  24. data/lib/steep/services/goto_service.rb +15 -14
  25. data/lib/steep/services/hover_provider/rbs.rb +29 -9
  26. data/lib/steep/services/hover_provider/ruby.rb +16 -10
  27. data/lib/steep/services/signature_service.rb +36 -39
  28. data/lib/steep/signature/validator.rb +28 -6
  29. data/lib/steep/subtyping/check.rb +1 -1
  30. data/lib/steep/type_construction.rb +16 -14
  31. data/lib/steep/type_inference/constant_env.rb +7 -3
  32. data/lib/steep/version.rb +1 -1
  33. data/rbs_collection.steep.lock.yaml +48 -51
  34. data/rbs_collection.steep.yaml +3 -1
  35. data/sample/lib/conference.rb +10 -0
  36. data/sample/sig/conference.rbs +23 -0
  37. data/sig/steep/annotation_parser.rbs +3 -2
  38. data/sig/steep/ast/annotation/collection.rbs +1 -1
  39. data/sig/steep/ast/types/factory.rbs +2 -0
  40. data/sig/steep/ast/types/name.rbs +4 -0
  41. data/sig/steep/diagnostic/signature.rbs +18 -14
  42. data/sig/steep/index/rbs_index.rbs +92 -42
  43. data/sig/steep/project/dsl.rbs +35 -30
  44. data/sig/steep/project/options.rbs +16 -4
  45. data/sig/steep/project/target.rbs +7 -7
  46. data/sig/steep/server/interaction_worker.rbs +2 -2
  47. data/sig/steep/server/lsp_formatter.rbs +4 -2
  48. data/sig/steep/services/completion_provider.rbs +6 -0
  49. data/sig/steep/services/hover_provider/rbs.rbs +6 -4
  50. data/sig/steep/services/hover_provider/ruby.rbs +8 -4
  51. data/sig/steep/services/signature_service.rbs +27 -3
  52. data/sig/steep/signature/validator.rbs +9 -5
  53. data/sig/steep/type_construction.rbs +1 -1
  54. data/sig/steep/type_inference/constant_env.rbs +2 -0
  55. data/smoke/diagnostics-rbs/test_expectations.yml +1 -1
  56. data/smoke/regexp/a.rb +2 -2
  57. data/steep.gemspec +2 -1
  58. metadata +21 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f878620b37610ff6bb38ba9f71c8275ebebf1a119969acca92dae226e9e82371
4
- data.tar.gz: e5cfe0950b4cfe16d3ac2aeb0992601b5a0b43315736b637cae05792b0774bb9
3
+ metadata.gz: 14e9c57b89791ad6d989bddd6439f1ce792ceccf8e17034a1f2ab56c85f2ca41
4
+ data.tar.gz: dfbe3445dcc72a84a2d4d4e608eb5d74e9da4e1cef03f4979a44e377bf65a917
5
5
  SHA512:
6
- metadata.gz: c81207ff4dd7893ccc4680b4d6bc1c74b36a59badbfac8c08f02f7ecb6e17f887bc440f40c2dcfe840f219df003c384d0365f54b55340c2ddce771492945b232
7
- data.tar.gz: bca9c65b22080f4d8e4f8cf162146a7868f520f4f13e34c22e79a95e5ba81f186b914f422afb89918c6d095d896badcd07832a731d8dd0cd152a908a6f7a71ad
6
+ metadata.gz: c14673012d5db258399c4f5d7bda6e3fb6aaca0dbc5c241efca52f8c4e947a5a4fd1a60a42ce6a45e87642926b6e44f65d6058bb241581e5a143251a158f383f
7
+ data.tar.gz: '0889651d16f198063b243aef34cb300325fb04dcbb7165f0d8c972d7f0f2076d86af77393c8c3f0f216d1a42f6fa8bd2c4cbf78d3e0c106d8c7f883d96099839'
@@ -14,6 +14,7 @@ jobs:
14
14
  - "2.7"
15
15
  - "3.0"
16
16
  - "3.1"
17
+ - "3.2"
17
18
  task:
18
19
  - test
19
20
  # - test:output Ignored because the order of diagnostics changes somehow
@@ -11,10 +11,10 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  container_tag:
14
- - "2.6"
15
14
  - "2.7"
16
15
  - "3.0"
17
16
  - "3.1"
17
+ - "3.2"
18
18
  - "master-nightly-focal"
19
19
  task:
20
20
  - test
@@ -25,10 +25,6 @@ jobs:
25
25
  image: rubylang/ruby:${{ matrix.container_tag }}
26
26
  steps:
27
27
  - uses: actions/checkout@v3
28
- - name: Reset bundler
29
- run: |
30
- rm Gemfile.lock Gemfile.steep.lock
31
- if: contains(matrix.container_tag, '2.6')
32
28
  - name: Run test
33
29
  run: |
34
30
  git config --global --add safe.directory /__w/steep/steep
data/Gemfile CHANGED
@@ -3,8 +3,10 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in steep.gemspec
4
4
  gemspec
5
5
 
6
+ gem "rbs", "~> 3.0.0"
7
+
6
8
  gem "rake"
7
- gem "minitest", "~> 5.16"
9
+ gem "minitest", "~> 5.17"
8
10
  gem "minitest-hooks"
9
11
  group :stackprof, optional: true do
10
12
  gem "stackprof"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- steep (1.3.0)
4
+ steep (1.4.0.dev.2)
5
5
  activesupport (>= 5.1)
6
6
  csv (>= 3.0.9)
7
7
  fileutils (>= 1.1.0)
@@ -11,6 +11,7 @@ PATH
11
11
  logger (>= 1.3.0)
12
12
  parallel (>= 1.0.0)
13
13
  parser (>= 3.1)
14
+ pathname (>= 0.2.1)
14
15
  rainbow (>= 2.2.2, < 4.0)
15
16
  rbs (>= 2.8.0)
16
17
  securerandom (>= 0.1)
@@ -20,61 +21,63 @@ PATH
20
21
  GEM
21
22
  remote: https://rubygems.org/
22
23
  specs:
23
- activesupport (7.0.4)
24
+ activesupport (7.0.4.2)
24
25
  concurrent-ruby (~> 1.0, >= 1.0.2)
25
26
  i18n (>= 1.6, < 2)
26
27
  minitest (>= 5.1)
27
28
  tzinfo (~> 2.0)
28
29
  ast (2.4.2)
29
- concurrent-ruby (1.1.10)
30
- csv (3.2.5)
30
+ concurrent-ruby (1.2.2)
31
+ csv (3.2.6)
31
32
  debase (0.2.5.beta2)
32
33
  debase-ruby_core_source (>= 0.10.12)
33
- debase-ruby_core_source (0.10.16)
34
+ debase-ruby_core_source (3.2.0)
34
35
  ffi (1.15.5)
35
- fileutils (1.6.0)
36
+ fileutils (1.7.0)
36
37
  i18n (1.12.0)
37
38
  concurrent-ruby (~> 1.0)
38
- json (2.6.2)
39
- language_server-protocol (3.17.0.1)
40
- listen (3.7.1)
39
+ json (2.6.3)
40
+ language_server-protocol (3.17.0.3)
41
+ listen (3.8.0)
41
42
  rb-fsevent (~> 0.10, >= 0.10.3)
42
43
  rb-inotify (~> 0.9, >= 0.9.10)
43
- logger (1.5.1)
44
- minitest (5.16.3)
44
+ logger (1.5.3)
45
+ minitest (5.17.0)
45
46
  minitest-hooks (1.5.0)
46
47
  minitest (> 5.3)
47
48
  minitest-slow_test (0.2.0)
48
49
  minitest (>= 5.0)
49
50
  parallel (1.22.1)
50
- parser (3.1.2.1)
51
+ parser (3.2.1.0)
51
52
  ast (~> 2.4.1)
53
+ pathname (0.2.1)
52
54
  rainbow (3.1.1)
53
55
  rake (13.0.6)
54
56
  rb-fsevent (0.11.2)
55
57
  rb-inotify (0.10.1)
56
58
  ffi (~> 1.0)
57
- rbs (2.8.0)
59
+ rbs (3.0.1)
58
60
  ruby-debug-ide (0.7.3)
59
61
  rake (>= 0.8.1)
60
- securerandom (0.2.0)
61
- stackprof (0.2.22)
62
- strscan (3.0.4)
62
+ securerandom (0.2.2)
63
+ stackprof (0.2.23)
64
+ strscan (3.0.6)
63
65
  terminal-table (3.0.2)
64
66
  unicode-display_width (>= 1.1.1, < 3)
65
- tzinfo (2.0.5)
67
+ tzinfo (2.0.6)
66
68
  concurrent-ruby (~> 1.0)
67
- unicode-display_width (2.3.0)
69
+ unicode-display_width (2.4.2)
68
70
 
69
71
  PLATFORMS
70
72
  ruby
71
73
 
72
74
  DEPENDENCIES
73
75
  debase (>= 0.2.5.beta2)
74
- minitest (~> 5.16)
76
+ minitest (~> 5.17)
75
77
  minitest-hooks
76
78
  minitest-slow_test
77
79
  rake
80
+ rbs (~> 3.0.0)
78
81
  ruby-debug-ide
79
82
  stackprof
80
83
  steep!
data/Gemfile.steep CHANGED
@@ -1,3 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'steep', '~> 1.3.0.pre'
3
+ gem 'steep', '~> 1.4.0.dev'
4
+ gem "rbs", "~> 3.0.0.dev"
data/Gemfile.steep.lock CHANGED
@@ -8,28 +8,29 @@ 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
+ csv (3.2.6)
12
12
  ffi (1.15.5)
13
- fileutils (1.6.0)
13
+ fileutils (1.7.0)
14
14
  i18n (1.12.0)
15
15
  concurrent-ruby (~> 1.0)
16
- json (2.6.2)
17
- language_server-protocol (3.17.0.1)
16
+ json (2.6.3)
17
+ language_server-protocol (3.17.0.2)
18
18
  listen (3.7.1)
19
19
  rb-fsevent (~> 0.10, >= 0.10.3)
20
20
  rb-inotify (~> 0.9, >= 0.9.10)
21
- logger (1.5.1)
22
- minitest (5.16.3)
21
+ logger (1.5.3)
22
+ minitest (5.17.0)
23
23
  parallel (1.22.1)
24
- parser (3.1.2.1)
24
+ parser (3.2.0.0)
25
25
  ast (~> 2.4.1)
26
+ pathname (0.2.1)
26
27
  rainbow (3.1.1)
27
28
  rb-fsevent (0.11.2)
28
29
  rb-inotify (0.10.1)
29
30
  ffi (~> 1.0)
30
- rbs (2.8.0)
31
- securerandom (0.2.0)
32
- steep (1.3.0.pre.2)
31
+ rbs (3.0.0.dev.1)
32
+ securerandom (0.2.2)
33
+ steep (1.4.0.dev.1)
33
34
  activesupport (>= 5.1)
34
35
  csv (>= 3.0.9)
35
36
  fileutils (>= 1.1.0)
@@ -39,23 +40,26 @@ GEM
39
40
  logger (>= 1.3.0)
40
41
  parallel (>= 1.0.0)
41
42
  parser (>= 3.1)
43
+ pathname (>= 0.2.1)
42
44
  rainbow (>= 2.2.2, < 4.0)
43
- rbs (>= 2.8.0.pre)
45
+ rbs (>= 2.8.0)
44
46
  securerandom (>= 0.1)
45
47
  strscan (>= 1.0.0)
46
48
  terminal-table (>= 2, < 4)
47
- strscan (3.0.4)
49
+ strscan (3.0.5)
48
50
  terminal-table (3.0.2)
49
51
  unicode-display_width (>= 1.1.1, < 3)
50
52
  tzinfo (2.0.5)
51
53
  concurrent-ruby (~> 1.0)
52
- unicode-display_width (2.3.0)
54
+ unicode-display_width (2.4.2)
53
55
 
54
56
  PLATFORMS
55
57
  arm64-darwin-21
58
+ arm64-darwin-22
56
59
 
57
60
  DEPENDENCIES
58
- steep (~> 1.3.0.pre)
61
+ rbs (~> 3.0.0.dev)
62
+ steep (~> 1.4.0.dev)
59
63
 
60
64
  BUNDLED WITH
61
65
  2.3.15
data/Steepfile CHANGED
@@ -10,7 +10,23 @@ target :app do
10
10
  hash[D::Ruby::MethodDefinitionMissing] = :hint
11
11
  end
12
12
 
13
+ FileUtils.mkpath("tmp")
14
+ tmp_rbs_dir = File.join("tmp", "rbs-sig")
15
+
16
+ definition = Bundler::Definition.build(Pathname("Gemfile"), Pathname("Gemfile.lock"), nil)
17
+ rbs_dep = definition.dependencies.find {|dep| dep.name == "rbs" }
18
+ if (source = rbs_dep.source).is_a?(Bundler::Source::Path)
19
+ unless Pathname(tmp_rbs_dir).exist?
20
+ FileUtils.ln_s(Pathname.pwd + source.path + "sig", tmp_rbs_dir, force: true)
21
+ end
22
+ signature tmp_rbs_dir
23
+ else
24
+ FileUtils.rm_f(tmp_rbs_dir)
25
+ library "rbs"
26
+ end
27
+
13
28
  library(
29
+ "rdoc",
14
30
  "set",
15
31
  "pathname",
16
32
  "monitor",
data/bin/rbs ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ BINSTUB_DIR=$(cd $(dirname $0); pwd)
4
+ GEMFILE=$(readlink -f ${BINSTUB_DIR}/../Gemfile.steep)
5
+ COLLECTION=$(readlink -f ${BINSTUB_DIR}/../rbs_collection.steep.yaml)
6
+ ROOT_DIR=$(readlink -f ${BINSTUB_DIR}/..)
7
+
8
+ RBS="bundle exec --gemfile=${GEMFILE} rbs --collection=${COLLECTION}"
9
+
10
+ if type "rbenv" > /dev/null 2>&1; then
11
+ RBS="rbenv exec ${RBS}"
12
+ else
13
+ if type "rvm" > /dev/null 2>&1; then
14
+ if [ -e ${ROOT_DIR}/.ruby-version ]; then
15
+ RBS="rvm ${ROOT_DIR} do ${RBS}"
16
+ fi
17
+ fi
18
+ fi
19
+
20
+ exec $RBS $@
21
+
data/bin/setup CHANGED
@@ -6,4 +6,4 @@ set -vx
6
6
  bundle install
7
7
 
8
8
  bundle install --gemfile=Gemfile.steep
9
- bundle exec --gemfile=Gemfile.steep rbs --collection=rbs_collection.steep.yaml collection install
9
+ bin/rbs collection install
@@ -20,16 +20,19 @@ module Steep
20
20
  attr_reader :source
21
21
  attr_reader :location
22
22
 
23
- def initialize(source:, location:, exn: nil)
23
+ def initialize(source:, location:, exn: nil, message: nil)
24
24
  @source = source
25
25
  @location = location
26
26
 
27
- message = case exn
28
- when RBS::ParsingError
29
- Diagnostic::Signature::SyntaxError.parser_syntax_error_message(exn)
30
- when Exception
31
- exn.message
32
- end
27
+ if exn
28
+ message =
29
+ case exn
30
+ when RBS::ParsingError
31
+ Diagnostic::Signature::SyntaxError.parser_syntax_error_message(exn)
32
+ else
33
+ exn.message
34
+ end
35
+ end
33
36
 
34
37
  super message
35
38
  end
@@ -41,8 +44,25 @@ module Steep
41
44
  PARAM = /[A-Z][A-Za-z0-9_]*/
42
45
  TYPE_PARAMS = /(\[(?<params>#{PARAM}(,\s*#{PARAM})*)\])?/
43
46
 
44
- def parse_type(string)
45
- factory.type(RBS::Parser.parse_type(string))
47
+ def parse_type(match, name = :type, location:)
48
+ string = match[name] or raise
49
+ st, en = match.offset(name)
50
+ st or raise
51
+ en or raise
52
+ loc = RBS::Location.new(location.buffer, location.start_pos + st, location.start_pos + en)
53
+
54
+ type =
55
+ begin
56
+ RBS::Parser.parse_type(string)
57
+ rescue RBS::ParsingError => exn
58
+ raise SyntaxError.new(source: string, location: loc, exn: exn)
59
+ end or raise
60
+
61
+ unless (type.location || raise).source == string.strip
62
+ raise SyntaxError.new(source: string, location: loc, message: "Failed to parse a type in annotation")
63
+ end
64
+
65
+ factory.type(type)
46
66
  end
47
67
 
48
68
  def keyword_subject_type(keyword, name)
@@ -59,10 +79,9 @@ module Steep
59
79
  Regexp.last_match.yield_self do |match|
60
80
  match or raise
61
81
  name = match[:name] or raise
62
- type = match[:type] or raise
63
82
 
64
83
  AST::Annotation::VarType.new(name: name.to_sym,
65
- type: parse_type(type),
84
+ type: parse_type(match, location: location),
66
85
  location: location)
67
86
  end
68
87
 
@@ -72,7 +91,7 @@ module Steep
72
91
  name = match[:name] or raise
73
92
  type = match[:type] or raise
74
93
 
75
- method_type = factory.method_type(RBS::Parser.parse_method_type(type), method_decls: Set[])
94
+ method_type = factory.method_type(RBS::Parser.parse_method_type(type) || raise, method_decls: Set[])
76
95
 
77
96
  AST::Annotation::MethodType.new(name: name.to_sym,
78
97
  type: method_type,
@@ -83,7 +102,7 @@ module Steep
83
102
  Regexp.last_match.yield_self do |match|
84
103
  match or raise
85
104
  name = match[:name] or raise
86
- type = parse_type(match[:type] || raise)
105
+ type = parse_type(match, location: location)
87
106
 
88
107
  AST::Annotation::ConstType.new(name: TypeName(name), type: type, location: location)
89
108
  end
@@ -92,7 +111,7 @@ module Steep
92
111
  Regexp.last_match.yield_self do |match|
93
112
  match or raise
94
113
  name = match[:name] or raise
95
- type = parse_type(match[:type] || raise)
114
+ type = parse_type(match, location: location)
96
115
 
97
116
  AST::Annotation::IvarType.new(name: name.to_sym,
98
117
  type: type,
@@ -102,42 +121,43 @@ module Steep
102
121
  when keyword_and_type("return")
103
122
  Regexp.last_match.yield_self do |match|
104
123
  match or raise
105
- type = parse_type(match[:type] || raise)
124
+ type = parse_type(match, location: location)
106
125
  AST::Annotation::ReturnType.new(type: type, location: location)
107
126
  end
108
127
 
109
128
  when keyword_and_type("block")
110
129
  Regexp.last_match.yield_self do |match|
111
130
  match or raise
112
- type = parse_type(match[:type] || raise)
131
+ type = parse_type(match, location: location)
113
132
  AST::Annotation::BlockType.new(type: type, location: location)
114
133
  end
115
134
 
116
135
  when keyword_and_type("self")
117
136
  Regexp.last_match.yield_self do |match|
118
137
  match or raise
119
- type = parse_type(match[:type] || raise)
138
+ type = parse_type(match, location: location)
120
139
  AST::Annotation::SelfType.new(type: type, location: location)
121
140
  end
122
141
 
123
142
  when keyword_and_type("instance")
124
143
  Regexp.last_match.yield_self do |match|
125
144
  match or raise
126
- type = parse_type(match[:type] || raise)
145
+ type = parse_type(match, location: location)
127
146
  AST::Annotation::InstanceType.new(type: type, location: location)
128
147
  end
129
148
 
130
149
  when keyword_and_type("module")
131
150
  Regexp.last_match.yield_self do |match|
132
151
  match or raise
133
- type = parse_type(match[:type] || raise)
152
+ type = parse_type(match, location: location)
134
153
  AST::Annotation::ModuleType.new(type: type, location: location)
135
154
  end
136
155
 
137
156
  when keyword_and_type("break")
138
157
  Regexp.last_match.yield_self do |match|
139
158
  match or raise
140
- type = parse_type(match[:type] || raise)
159
+ type = parse_type(match, location: location)
160
+
141
161
  AST::Annotation::BreakType.new(type: type, location: location)
142
162
  end
143
163
 
@@ -370,19 +370,11 @@ module Steep
370
370
  end
371
371
 
372
372
  def module_name?(type_name)
373
- if entry = env.class_decls[type_name]
374
- entry.is_a?(RBS::Environment::ModuleEntry)
375
- else
376
- false
377
- end
373
+ env.module_entry(type_name) ? true : false
378
374
  end
379
375
 
380
376
  def class_name?(type_name)
381
- if entry = env.class_decls[type_name]
382
- entry.is_a?(RBS::Environment::ClassEntry)
383
- else
384
- false
385
- end
377
+ env.class_entry(type_name) ? true : false
386
378
  end
387
379
 
388
380
  def env
@@ -434,6 +426,60 @@ module Steep
434
426
  nil
435
427
  end
436
428
  end
429
+
430
+ def normalize_type(type)
431
+ case type
432
+ when AST::Types::Name::Instance
433
+ AST::Types::Name::Instance.new(
434
+ name: env.normalize_module_name(type.name),
435
+ args: type.args.map {|ty| normalize_type(ty) },
436
+ location: type.location
437
+ )
438
+ when AST::Types::Name::Singleton
439
+ AST::Types::Name::Singleton.new(
440
+ name: env.normalize_module_name(type.name),
441
+ location: type.location
442
+ )
443
+ when AST::Types::Any, AST::Types::Boolean, AST::Types::Bot, AST::Types::Nil,
444
+ AST::Types::Top, AST::Types::Void, AST::Types::Literal, AST::Types::Class, AST::Types::Instance,
445
+ AST::Types::Self, AST::Types::Var, AST::Types::Logic::Base
446
+ type
447
+ when AST::Types::Intersection
448
+ AST::Types::Intersection.build(
449
+ types: type.types.map {|type| normalize_type(type) },
450
+ location: type.location
451
+ )
452
+ when AST::Types::Union
453
+ AST::Types::Union.build(
454
+ types: type.types.map {|type| normalize_type(type) },
455
+ location: type.location
456
+ )
457
+ when AST::Types::Record
458
+ AST::Types::Record.new(
459
+ elements: type.elements.transform_values {|type| normalize_type(type) },
460
+ location: type.location
461
+ )
462
+ when AST::Types::Tuple
463
+ AST::Types::Tuple.new(
464
+ types: type.types.map {|type| normalize_type(type) },
465
+ location: type.location
466
+ )
467
+ when AST::Types::Proc
468
+ type.map_type {|type| normalize_type(type) }
469
+ when AST::Types::Name::Alias
470
+ AST::Types::Name::Alias.new(
471
+ name: type.name,
472
+ args: type.args.map {|ty| normalize_type(ty) },
473
+ location: type.location
474
+ )
475
+ when AST::Types::Name::Interface
476
+ AST::Types::Name::Interface.new(
477
+ name: type.name,
478
+ args: type.args.map {|ty| normalize_type(ty) },
479
+ location: type.location
480
+ )
481
+ end
482
+ end
437
483
  end
438
484
  end
439
485
  end
@@ -20,6 +20,10 @@ module Steep
20
20
  def level
21
21
  [0]
22
22
  end
23
+
24
+ def map_type(&block)
25
+ self
26
+ end
23
27
  end
24
28
 
25
29
  class Applying < Base
@@ -87,6 +91,12 @@ module Steep
87
91
  def level
88
92
  [0] + level_of_children(args)
89
93
  end
94
+
95
+ def map_type(&block)
96
+ args = self.args.map(&block)
97
+
98
+ _ = self.class.new(name: self.name, args: self.args, location: self.location)
99
+ end
90
100
  end
91
101
 
92
102
  class Singleton < Base
@@ -783,7 +783,7 @@ module Steep
783
783
  end
784
784
 
785
785
  def header_line
786
- "Assertion cannot hold: no relationship between infered type (`#{node_type.to_s}`) and asserted type (`#{assertion_type.to_s}`)"
786
+ "Assertion cannot hold: no relationship between inferred type (`#{node_type.to_s}`) and asserted type (`#{assertion_type.to_s}`)"
787
787
  end
788
788
  end
789
789
 
@@ -381,6 +381,42 @@ module Steep
381
381
  end
382
382
  end
383
383
 
384
+ class InconsistentClassModuleAliasError < Base
385
+ attr_reader :decl
386
+
387
+ def initialize(decl:)
388
+ @decl = decl
389
+ super(location: decl.location&.[](:old_name))
390
+ end
391
+
392
+ def header_line
393
+ expected_kind =
394
+ case decl
395
+ when RBS::AST::Declarations::ModuleAlias
396
+ "module"
397
+ when RBS::AST::Declarations::ClassAlias
398
+ "class"
399
+ else
400
+ raise
401
+ end
402
+
403
+ "A #{expected_kind} `#{decl.new_name}` cannot be an alias of `#{decl.old_name}`"
404
+ end
405
+ end
406
+
407
+ class CyclicClassAliasDefinitionError < Base
408
+ attr_reader :decl
409
+
410
+ def initialize(decl:)
411
+ @decl = decl
412
+ super(location: decl.location&.[](:new_name))
413
+ end
414
+
415
+ def header_line
416
+ "#{decl.new_name} is a cyclic definition"
417
+ end
418
+ end
419
+
384
420
  def self.from_rbs_error(error, factory:)
385
421
  case error
386
422
  when RBS::ParsingError
@@ -475,6 +511,10 @@ module Steep
475
511
  )
476
512
  when RBS::InheritModuleError
477
513
  Diagnostic::Signature::InheritModuleError.new(error.super_decl)
514
+ when RBS::InconsistentClassModuleAliasError
515
+ Diagnostic::Signature::InconsistentClassModuleAliasError.new(decl: error.alias_entry.decl)
516
+ when RBS::CyclicClassAliasDefinitionError
517
+ Diagnostic::Signature::CyclicClassAliasDefinitionError.new(decl: error.alias_entry.decl)
478
518
  else
479
519
  raise error
480
520
  end