solargraph 0.58.1 → 0.59.0.dev.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.
- checksums.yaml +4 -4
- data/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,84 +1,157 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class TypeChecker
|
|
5
|
-
# Definitions of type checking rules to be performed at various levels
|
|
6
|
-
#
|
|
7
|
-
class Rules
|
|
8
|
-
LEVELS = {
|
|
9
|
-
normal: 0,
|
|
10
|
-
typed: 1,
|
|
11
|
-
strict: 2,
|
|
12
|
-
strong: 3,
|
|
13
|
-
alpha: 4
|
|
14
|
-
}.freeze
|
|
15
|
-
|
|
16
|
-
# @return [Symbol]
|
|
17
|
-
attr_reader :level
|
|
18
|
-
|
|
19
|
-
# @return [Integer]
|
|
20
|
-
attr_reader :rank
|
|
21
|
-
|
|
22
|
-
# @param level [Symbol]
|
|
23
|
-
# @param overrides [Hash{Symbol => Symbol}]
|
|
24
|
-
def initialize level, overrides
|
|
25
|
-
@rank = if LEVELS.key?(level)
|
|
26
|
-
LEVELS[level]
|
|
27
|
-
else
|
|
28
|
-
Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
|
|
29
|
-
0
|
|
30
|
-
end
|
|
31
|
-
@level = LEVELS[LEVELS.values.index(@rank)]
|
|
32
|
-
@overrides = overrides
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def ignore_all_undefined?
|
|
36
|
-
!report_undefined?
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def report_undefined?
|
|
40
|
-
report?(:report_undefined, :strict)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def validate_consts?
|
|
44
|
-
report?(:validate_consts, :strict)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def validate_calls?
|
|
48
|
-
report?(:validate_calls, :strict)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def require_type_tags?
|
|
52
|
-
report?(:validate_type_tags, :strong)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def must_tag_or_infer?
|
|
56
|
-
report?(:must_tag_or_infer, :strict)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def validate_tags?
|
|
60
|
-
report?(:validate_tags, :typed)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def
|
|
64
|
-
report?(:
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class TypeChecker
|
|
5
|
+
# Definitions of type checking rules to be performed at various levels
|
|
6
|
+
#
|
|
7
|
+
class Rules
|
|
8
|
+
LEVELS = {
|
|
9
|
+
normal: 0,
|
|
10
|
+
typed: 1,
|
|
11
|
+
strict: 2,
|
|
12
|
+
strong: 3,
|
|
13
|
+
alpha: 4
|
|
14
|
+
}.freeze
|
|
15
|
+
|
|
16
|
+
# @return [Symbol]
|
|
17
|
+
attr_reader :level
|
|
18
|
+
|
|
19
|
+
# @return [Integer]
|
|
20
|
+
attr_reader :rank
|
|
21
|
+
|
|
22
|
+
# @param level [Symbol]
|
|
23
|
+
# @param overrides [Hash{Symbol => Symbol}]
|
|
24
|
+
def initialize level, overrides
|
|
25
|
+
@rank = if LEVELS.key?(level)
|
|
26
|
+
LEVELS[level]
|
|
27
|
+
else
|
|
28
|
+
Solargraph.logger.warn "Unrecognized TypeChecker level #{level}, assuming normal"
|
|
29
|
+
0
|
|
30
|
+
end
|
|
31
|
+
@level = LEVELS[LEVELS.values.index(@rank)]
|
|
32
|
+
@overrides = overrides
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def ignore_all_undefined?
|
|
36
|
+
!report_undefined?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def report_undefined?
|
|
40
|
+
report?(:report_undefined, :strict)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def validate_consts?
|
|
44
|
+
report?(:validate_consts, :strict)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def validate_calls?
|
|
48
|
+
report?(:validate_calls, :strict)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def require_type_tags?
|
|
52
|
+
report?(:validate_type_tags, :strong)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def must_tag_or_infer?
|
|
56
|
+
report?(:must_tag_or_infer, :strict)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def validate_tags?
|
|
60
|
+
report?(:validate_tags, :typed)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def require_inferred_type_params?
|
|
64
|
+
report?(:require_inferred_type_params, :alpha)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# False negatives:
|
|
69
|
+
#
|
|
70
|
+
# @todo 4: Missed nil violation
|
|
71
|
+
#
|
|
72
|
+
# pending code fixes (277):
|
|
73
|
+
#
|
|
74
|
+
# @todo 281: Need to add nil check here
|
|
75
|
+
# @todo 22: Translate to something flow sensitive typing understands
|
|
76
|
+
# @todo 3: Need a downcast here
|
|
77
|
+
#
|
|
78
|
+
# flow sensitive typing could handle (96):
|
|
79
|
+
#
|
|
80
|
+
# @todo 36: flow sensitive typing needs to handle attrs
|
|
81
|
+
# @todo 29: flow sensitive typing should be able to handle redefinition
|
|
82
|
+
# @todo 19: flow sensitive typing needs to narrow down type with an if is_a? check
|
|
83
|
+
# @todo 13: Need to validate config
|
|
84
|
+
# @todo 8: flow sensitive typing should support .class == .class
|
|
85
|
+
# @todo 6: need boolish support for ? methods
|
|
86
|
+
# @todo 5: literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
87
|
+
# @todo 5: flow sensitive typing needs to handle 'raise if'
|
|
88
|
+
# @todo 5: flow sensitive typing needs better handling of ||= on lvars
|
|
89
|
+
# @todo 4: flow sensitive typing needs to eliminate literal from union with [:bar].include?(foo)
|
|
90
|
+
# @todo 4: nil? support in flow sensitive typing
|
|
91
|
+
# @todo 2: downcast output of Enumerable#select
|
|
92
|
+
# @todo 2: flow sensitive typing should handle return nil if location&.name.nil?
|
|
93
|
+
# @todo 2: flow sensitive typing should handle is_a? and next
|
|
94
|
+
# @todo 2: Need to look at Tuple#include? handling
|
|
95
|
+
# @todo 2: Should better support meaning of '&' in RBS
|
|
96
|
+
# @todo 2: (*) flow sensitive typing needs to handle "if foo = bar"
|
|
97
|
+
# @todo 2: flow sensitive typing needs to handle "if foo = bar"
|
|
98
|
+
# @todo 2: Need to handle duck-typed method calls on union types
|
|
99
|
+
# @todo 2: Need better handling of #compact
|
|
100
|
+
# @todo 2: flow sensitive typing should allow shadowing of Kernel#caller
|
|
101
|
+
# @todo 2: flow sensitive typing ought to be able to handle 'when ClassName'
|
|
102
|
+
# @todo 1: flow sensitive typing not smart enough to handle this case
|
|
103
|
+
# @todo 1: flow sensitive typing needs to handle if foo = bar
|
|
104
|
+
# @todo 1: flow sensitive typing needs to handle "if foo.nil?"
|
|
105
|
+
# @todo 1: flow sensitive typing should support case/when
|
|
106
|
+
# @todo 1: flow sensitive typing should support ivars
|
|
107
|
+
# @todo 1: Need to support this in flow sensitive typing
|
|
108
|
+
# @todo 1: flow sensitive typing needs to handle self.class == other.class
|
|
109
|
+
# @todo 1: flow sensitive typing needs to remove literal with
|
|
110
|
+
# @todo 1: flow sensitive typing needs to understand reassignment
|
|
111
|
+
# @todo 1: flow sensitive typing should be able to identify more blocks that always return
|
|
112
|
+
# @todo 1: should warn on nil dereference below
|
|
113
|
+
# @todo 1: flow sensitive typing needs to create separate ranges for postfix if
|
|
114
|
+
# @todo 1: flow sensitive typing needs to handle constants
|
|
115
|
+
# @todo 1: flow sensitive typing needs to eliminate literal from union with return if foo == :bar
|
|
116
|
+
def require_all_unique_types_match_expected?
|
|
117
|
+
report?(:require_all_unique_types_match_expected, :strong)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def require_all_unique_types_support_call?
|
|
121
|
+
report?(:require_all_unique_types_support_call, :strong)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def require_no_undefined_args?
|
|
125
|
+
report?(:require_no_undefined_args, :alpha)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def require_generics_resolved?
|
|
129
|
+
report?(:require_generics_resolved, :alpha)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def require_interfaces_resolved?
|
|
133
|
+
report?(:require_interfaces_resolved, :alpha)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def require_downcasts?
|
|
137
|
+
report?(:require_downcasts, :alpha)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# We keep this at strong because if you added an @ sg-ignore to
|
|
141
|
+
# address a strong-level issue, then ran at a lower level, you'd
|
|
142
|
+
# get a false positive - we don't run stronger level checks than
|
|
143
|
+
# requested for performance reasons
|
|
144
|
+
def validate_sg_ignores?
|
|
145
|
+
report?(:validate_sg_ignores, :strong)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
private
|
|
149
|
+
|
|
150
|
+
# @param type [Symbol]
|
|
151
|
+
# @param level [Symbol]
|
|
152
|
+
def report?(type, level)
|
|
153
|
+
rank >= LEVELS[@overrides.fetch(type, level)]
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|