steep 1.10.0 → 2.0.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -1
  3. data/CLAUDE.md +114 -0
  4. data/README.md +1 -1
  5. data/Rakefile +15 -3
  6. data/Steepfile +13 -13
  7. data/lib/steep/annotation_parser.rb +5 -1
  8. data/lib/steep/annotations_helper.rb +12 -2
  9. data/lib/steep/ast/node/type_application.rb +22 -16
  10. data/lib/steep/ast/node/type_assertion.rb +7 -4
  11. data/lib/steep/ast/types/factory.rb +3 -2
  12. data/lib/steep/cli.rb +246 -2
  13. data/lib/steep/daemon/configuration.rb +19 -0
  14. data/lib/steep/daemon/server.rb +476 -0
  15. data/lib/steep/daemon.rb +201 -0
  16. data/lib/steep/diagnostic/ruby.rb +50 -8
  17. data/lib/steep/diagnostic/signature.rb +31 -8
  18. data/lib/steep/drivers/check.rb +301 -140
  19. data/lib/steep/drivers/print_project.rb +9 -10
  20. data/lib/steep/drivers/query.rb +102 -0
  21. data/lib/steep/drivers/start_server.rb +19 -0
  22. data/lib/steep/drivers/stop_server.rb +20 -0
  23. data/lib/steep/drivers/watch.rb +2 -2
  24. data/lib/steep/index/rbs_index.rb +38 -13
  25. data/lib/steep/index/signature_symbol_provider.rb +24 -3
  26. data/lib/steep/interface/builder.rb +48 -15
  27. data/lib/steep/interface/shape.rb +13 -5
  28. data/lib/steep/locator.rb +377 -0
  29. data/lib/steep/project/dsl.rb +26 -5
  30. data/lib/steep/project/group.rb +8 -2
  31. data/lib/steep/project/target.rb +16 -2
  32. data/lib/steep/project.rb +21 -2
  33. data/lib/steep/server/base_worker.rb +2 -2
  34. data/lib/steep/server/change_buffer.rb +2 -1
  35. data/lib/steep/server/custom_methods.rb +12 -0
  36. data/lib/steep/server/inline_source_change_detector.rb +94 -0
  37. data/lib/steep/server/interaction_worker.rb +51 -74
  38. data/lib/steep/server/lsp_formatter.rb +48 -12
  39. data/lib/steep/server/master.rb +100 -18
  40. data/lib/steep/server/target_group_files.rb +124 -151
  41. data/lib/steep/server/type_check_controller.rb +276 -123
  42. data/lib/steep/server/type_check_worker.rb +104 -3
  43. data/lib/steep/services/completion_provider/rbs.rb +74 -0
  44. data/lib/steep/services/completion_provider/ruby.rb +652 -0
  45. data/lib/steep/services/completion_provider/type_name.rb +243 -0
  46. data/lib/steep/services/completion_provider.rb +39 -662
  47. data/lib/steep/services/content_change.rb +14 -1
  48. data/lib/steep/services/file_loader.rb +4 -2
  49. data/lib/steep/services/goto_service.rb +271 -68
  50. data/lib/steep/services/hover_provider/content.rb +67 -0
  51. data/lib/steep/services/hover_provider/rbs.rb +8 -9
  52. data/lib/steep/services/hover_provider/ruby.rb +123 -64
  53. data/lib/steep/services/hover_provider/singleton_methods.rb +4 -0
  54. data/lib/steep/services/signature_service.rb +129 -54
  55. data/lib/steep/services/type_check_service.rb +72 -27
  56. data/lib/steep/signature/validator.rb +30 -18
  57. data/lib/steep/source/ignore_ranges.rb +14 -4
  58. data/lib/steep/source.rb +16 -2
  59. data/lib/steep/tagged_logging.rb +39 -0
  60. data/lib/steep/type_construction.rb +94 -21
  61. data/lib/steep/type_inference/block_params.rb +7 -7
  62. data/lib/steep/type_inference/context.rb +4 -2
  63. data/lib/steep/type_inference/logic_type_interpreter.rb +21 -3
  64. data/lib/steep/type_inference/method_call.rb +4 -0
  65. data/lib/steep/type_inference/type_env.rb +1 -1
  66. data/lib/steep/typing.rb +0 -2
  67. data/lib/steep/version.rb +1 -1
  68. data/lib/steep.rb +42 -32
  69. data/manual/ruby-diagnostics.md +67 -0
  70. data/sample/Steepfile +1 -0
  71. data/sample/lib/conference.rb +1 -0
  72. data/sample/lib/deprecated.rb +6 -0
  73. data/sample/lib/inline.rb +43 -0
  74. data/sample/sig/generics.rbs +3 -0
  75. data/steep.gemspec +4 -5
  76. metadata +26 -26
  77. data/lib/steep/services/type_name_completion.rb +0 -236
@@ -299,7 +299,7 @@ module Steep
299
299
  attr_reader :method_type
300
300
 
301
301
  def initialize(node:, method_type:)
302
- loc = node.loc.begin.join(node.loc.end)
302
+ loc = node.loc.begin.join(node.loc.end) # steep:ignore NoMethod
303
303
  super(node: node, location: loc)
304
304
  @method_type = method_type
305
305
  end
@@ -313,7 +313,7 @@ module Steep
313
313
  attr_reader :method_type
314
314
 
315
315
  def initialize(node:, method_type:)
316
- super(node: node, location: (node.type == :super || node.type == :zsuper) ? node.loc.keyword : node.loc.selector)
316
+ super(node: node, location: (node.type == :super || node.type == :zsuper) ? node.loc.keyword : node.loc.selector) # steep:ignore NoMethod
317
317
  @method_type = method_type
318
318
  end
319
319
 
@@ -349,7 +349,7 @@ module Steep
349
349
  include ResultPrinter
350
350
 
351
351
  def initialize(node:, expected:, actual:, result:)
352
- super(node: node, location: node.loc.begin.join(node.loc.end))
352
+ super(node: node, location: node.loc.begin.join(node.loc.end)) # steep:ignore NoMethod
353
353
  @expected = expected
354
354
  @actual = actual
355
355
  @result = result
@@ -419,7 +419,7 @@ module Steep
419
419
  else
420
420
  raise "Unexpected node: #{node.type}"
421
421
  end
422
- super(node: node, location: location) # steep:ignore NoMethod
422
+ super(node: node, location: location)
423
423
 
424
424
  @name = name
425
425
  end
@@ -446,7 +446,7 @@ module Steep
446
446
  when :defs
447
447
  node.children[2]
448
448
  end #: Parser::AST::Node?
449
- super(node: node, location: args&.loc&.expression || node.loc.name)
449
+ super(node: node, location: args&.loc&.expression || node.loc.name) # steep:ignore NoMethod
450
450
  @method_type = method_type
451
451
  end
452
452
 
@@ -512,7 +512,7 @@ module Steep
512
512
  include ResultPrinter
513
513
 
514
514
  def initialize(node:, expected:, actual:, result:)
515
- super(node: node, location: node.loc.name)
515
+ super(node: node, location: node.loc.name) # steep:ignore NoMethod
516
516
  @expected = expected
517
517
  @actual = actual
518
518
  @result = result
@@ -607,7 +607,7 @@ module Steep
607
607
  attr_reader :kind
608
608
 
609
609
  def initialize(node:, name:)
610
- super(node: node, location: node.loc.name)
610
+ super(node: node, location: node.loc.name) # steep:ignore NoMethod
611
611
  @name = name
612
612
  @kind = :constant
613
613
  end
@@ -647,7 +647,7 @@ module Steep
647
647
  attr_reader :name
648
648
 
649
649
  def initialize(node:, name:)
650
- super(node: node, location: node.loc.name)
650
+ super(node: node, location: node.loc.name) # steep:ignore NoMethod
651
651
  @name = name
652
652
  end
653
653
 
@@ -944,6 +944,33 @@ module Steep
944
944
  end
945
945
  end
946
946
 
947
+ class LibraryRBSError < Base
948
+ attr_reader :error
949
+
950
+ def initialize(error:, location:)
951
+ @error = error
952
+ super(node: nil, location: location)
953
+ end
954
+
955
+ def header_line
956
+ "Type checking failed due to error in library RBS file"
957
+ end
958
+
959
+ def detail_lines
960
+ lines = [] #: Array[String]
961
+ lines << error.header_line
962
+ if error.location
963
+ lines << "(#{error.location.buffer.name.to_s}:#{error.location.start_line}:#{error.location.start_column})"
964
+ end
965
+
966
+ if detail = error.detail_lines
967
+ lines << "" << detail
968
+ end
969
+
970
+ lines.join("\n")
971
+ end
972
+ end
973
+
947
974
  class InvalidIgnoreComment < Base
948
975
  attr_reader :comment
949
976
 
@@ -957,6 +984,16 @@ module Steep
957
984
  end
958
985
  end
959
986
 
987
+ class RedundantIgnoreComment < Base
988
+ def initialize(location:)
989
+ super(node: nil, location: location)
990
+ end
991
+
992
+ def header_line
993
+ "Redundant ignore comment"
994
+ end
995
+ end
996
+
960
997
  class UnannotatedEmptyCollection < Base
961
998
  def header_line
962
999
  node or raise
@@ -1075,6 +1112,7 @@ module Steep
1075
1112
  InsufficientPositionalArguments => :error,
1076
1113
  InsufficientTypeArgument => :hint,
1077
1114
  InvalidIgnoreComment => :warning,
1115
+ RedundantIgnoreComment => :warning,
1078
1116
  MethodArityMismatch => :error,
1079
1117
  MethodBodyTypeMismatch => :error,
1080
1118
  MethodDefinitionInUndeclaredModule => :information,
@@ -1082,6 +1120,7 @@ module Steep
1082
1120
  MethodParameterMismatch => :error,
1083
1121
  MethodReturnTypeAnnotationMismatch => :hint,
1084
1122
  MultipleAssignmentConversionError => :hint,
1123
+ LibraryRBSError => :error,
1085
1124
  NoMethod => :error,
1086
1125
  ProcHintIgnored => :hint,
1087
1126
  ProcTypeExpected => :hint,
@@ -1138,6 +1177,7 @@ module Steep
1138
1177
  InsufficientPositionalArguments => :error,
1139
1178
  InsufficientTypeArgument => :error,
1140
1179
  InvalidIgnoreComment => :warning,
1180
+ RedundantIgnoreComment => :warning,
1141
1181
  MethodArityMismatch => :error,
1142
1182
  MethodBodyTypeMismatch => :error,
1143
1183
  MethodDefinitionInUndeclaredModule => :warning,
@@ -1201,6 +1241,7 @@ module Steep
1201
1241
  InsufficientPositionalArguments => :information,
1202
1242
  InsufficientTypeArgument => nil,
1203
1243
  InvalidIgnoreComment => :warning,
1244
+ RedundantIgnoreComment => :hint,
1204
1245
  MethodArityMismatch => :information,
1205
1246
  MethodBodyTypeMismatch => :warning,
1206
1247
  MethodDefinitionInUndeclaredModule => :hint,
@@ -1208,6 +1249,7 @@ module Steep
1208
1249
  MethodParameterMismatch => :warning,
1209
1250
  MethodReturnTypeAnnotationMismatch => nil,
1210
1251
  MultipleAssignmentConversionError => nil,
1252
+ LibraryRBSError => :error,
1211
1253
  NoMethod => :information,
1212
1254
  ProcHintIgnored => nil,
1213
1255
  ProcTypeExpected => nil,
@@ -276,7 +276,6 @@ module Steep
276
276
  class VariableDuplicationError < Base
277
277
  attr_reader :type_name
278
278
  attr_reader :variable_name
279
- attr_reader :location
280
279
 
281
280
  def initialize(type_name:, variable_name:, location:)
282
281
  @type_name = type_name
@@ -344,19 +343,27 @@ module Steep
344
343
  end
345
344
 
346
345
  def header_line
347
- "Cannot #{mixin_name} a class `#{member.name}` in the definition of `#{type_name}`"
346
+ member_name = case member
347
+ when RBS::AST::Members::Include, RBS::AST::Members::Extend, RBS::AST::Members::Prepend
348
+ member.name
349
+ when RBS::AST::Ruby::Members::IncludeMember, RBS::AST::Ruby::Members::ExtendMember, RBS::AST::Ruby::Members::PrependMember
350
+ member.module_name
351
+ end
352
+ "Cannot #{mixin_name} a class `#{member_name}` in the definition of `#{type_name}`"
348
353
  end
349
354
 
350
355
  private
351
356
 
352
357
  def mixin_name
353
358
  case mem = member
354
- when RBS::AST::Members::Prepend
359
+ when RBS::AST::Members::Prepend, RBS::AST::Ruby::Members::PrependMember
355
360
  "prepend"
356
- when RBS::AST::Members::Include
361
+ when RBS::AST::Members::Include, RBS::AST::Ruby::Members::IncludeMember
357
362
  "include"
358
- when RBS::AST::Members::Extend
363
+ when RBS::AST::Members::Extend, RBS::AST::Ruby::Members::ExtendMember
359
364
  "extend"
365
+ else
366
+ raise "Unknown mixin type: #{mem.class}"
360
367
  end
361
368
  end
362
369
  end
@@ -430,8 +437,12 @@ module Steep
430
437
  "module"
431
438
  when RBS::AST::Declarations::ClassAlias
432
439
  "class"
433
- else
434
- raise
440
+ when RBS::AST::Ruby::Declarations::ClassModuleAliasDecl
441
+ if decl.annotation.is_a?(RBS::AST::Ruby::Annotations::ClassAliasAnnotation)
442
+ "class"
443
+ else
444
+ "module"
445
+ end
435
446
  end
436
447
 
437
448
  "A #{expected_kind} `#{decl.new_name}` cannot be an alias of `#{decl.old_name}`"
@@ -504,6 +515,18 @@ module Steep
504
515
  end
505
516
  end
506
517
 
518
+ class InlineDiagnostic < Base
519
+ attr_reader :diagnostic
520
+
521
+ def initialize(diagnostic)
522
+ super(location: diagnostic.location)
523
+ @diagnostic = diagnostic
524
+ end
525
+
526
+ def header_line
527
+ diagnostic.message
528
+ end
529
+ end
507
530
 
508
531
  def self.from_rbs_error(error, factory:)
509
532
  case error
@@ -572,7 +595,7 @@ module Steep
572
595
  when RBS::SuperclassMismatchError
573
596
  Diagnostic::Signature::SuperclassMismatch.new(
574
597
  name: error.name,
575
- location: error.entry.primary.decl.location
598
+ location: error.entry.primary_decl.location
576
599
  )
577
600
  when RBS::InvalidVarianceAnnotationError
578
601
  Diagnostic::Signature::InvalidVarianceAnnotation.new(