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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +84 -1
- data/CLAUDE.md +114 -0
- data/README.md +1 -1
- data/Rakefile +15 -3
- data/Steepfile +13 -13
- data/lib/steep/annotation_parser.rb +5 -1
- data/lib/steep/annotations_helper.rb +12 -2
- data/lib/steep/ast/node/type_application.rb +22 -16
- data/lib/steep/ast/node/type_assertion.rb +7 -4
- data/lib/steep/ast/types/factory.rb +3 -2
- data/lib/steep/cli.rb +246 -2
- data/lib/steep/daemon/configuration.rb +19 -0
- data/lib/steep/daemon/server.rb +476 -0
- data/lib/steep/daemon.rb +201 -0
- data/lib/steep/diagnostic/ruby.rb +50 -8
- data/lib/steep/diagnostic/signature.rb +31 -8
- data/lib/steep/drivers/check.rb +301 -140
- data/lib/steep/drivers/print_project.rb +9 -10
- data/lib/steep/drivers/query.rb +102 -0
- data/lib/steep/drivers/start_server.rb +19 -0
- data/lib/steep/drivers/stop_server.rb +20 -0
- data/lib/steep/drivers/watch.rb +2 -2
- data/lib/steep/index/rbs_index.rb +38 -13
- data/lib/steep/index/signature_symbol_provider.rb +24 -3
- data/lib/steep/interface/builder.rb +48 -15
- data/lib/steep/interface/shape.rb +13 -5
- data/lib/steep/locator.rb +377 -0
- data/lib/steep/project/dsl.rb +26 -5
- data/lib/steep/project/group.rb +8 -2
- data/lib/steep/project/target.rb +16 -2
- data/lib/steep/project.rb +21 -2
- data/lib/steep/server/base_worker.rb +2 -2
- data/lib/steep/server/change_buffer.rb +2 -1
- data/lib/steep/server/custom_methods.rb +12 -0
- data/lib/steep/server/inline_source_change_detector.rb +94 -0
- data/lib/steep/server/interaction_worker.rb +51 -74
- data/lib/steep/server/lsp_formatter.rb +48 -12
- data/lib/steep/server/master.rb +100 -18
- data/lib/steep/server/target_group_files.rb +124 -151
- data/lib/steep/server/type_check_controller.rb +276 -123
- data/lib/steep/server/type_check_worker.rb +104 -3
- data/lib/steep/services/completion_provider/rbs.rb +74 -0
- data/lib/steep/services/completion_provider/ruby.rb +652 -0
- data/lib/steep/services/completion_provider/type_name.rb +243 -0
- data/lib/steep/services/completion_provider.rb +39 -662
- data/lib/steep/services/content_change.rb +14 -1
- data/lib/steep/services/file_loader.rb +4 -2
- data/lib/steep/services/goto_service.rb +271 -68
- data/lib/steep/services/hover_provider/content.rb +67 -0
- data/lib/steep/services/hover_provider/rbs.rb +8 -9
- data/lib/steep/services/hover_provider/ruby.rb +123 -64
- data/lib/steep/services/hover_provider/singleton_methods.rb +4 -0
- data/lib/steep/services/signature_service.rb +129 -54
- data/lib/steep/services/type_check_service.rb +72 -27
- data/lib/steep/signature/validator.rb +30 -18
- data/lib/steep/source/ignore_ranges.rb +14 -4
- data/lib/steep/source.rb +16 -2
- data/lib/steep/tagged_logging.rb +39 -0
- data/lib/steep/type_construction.rb +94 -21
- data/lib/steep/type_inference/block_params.rb +7 -7
- data/lib/steep/type_inference/context.rb +4 -2
- data/lib/steep/type_inference/logic_type_interpreter.rb +21 -3
- data/lib/steep/type_inference/method_call.rb +4 -0
- data/lib/steep/type_inference/type_env.rb +1 -1
- data/lib/steep/typing.rb +0 -2
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +42 -32
- data/manual/ruby-diagnostics.md +67 -0
- data/sample/Steepfile +1 -0
- data/sample/lib/conference.rb +1 -0
- data/sample/lib/deprecated.rb +6 -0
- data/sample/lib/inline.rb +43 -0
- data/sample/sig/generics.rbs +3 -0
- data/steep.gemspec +4 -5
- metadata +26 -26
- 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)
|
|
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
|
-
|
|
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
|
-
|
|
434
|
-
|
|
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.
|
|
598
|
+
location: error.entry.primary_decl.location
|
|
576
599
|
)
|
|
577
600
|
when RBS::InvalidVarianceAnnotationError
|
|
578
601
|
Diagnostic::Signature::InvalidVarianceAnnotation.new(
|