solargraph 0.54.4 → 0.58.3
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/.gitattributes +2 -0
- data/.github/workflows/linting.yml +127 -0
- data/.github/workflows/plugins.yml +185 -6
- data/.github/workflows/rspec.yml +55 -5
- data/.github/workflows/typecheck.yml +8 -3
- data/.gitignore +8 -0
- data/.overcommit.yml +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +1279 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +143 -0
- data/README.md +20 -6
- data/Rakefile +125 -13
- data/bin/solargraph +3 -0
- data/lib/solargraph/api_map/cache.rb +110 -109
- data/lib/solargraph/api_map/constants.rb +279 -0
- data/lib/solargraph/api_map/index.rb +193 -167
- data/lib/solargraph/api_map/source_to_yard.rb +97 -88
- data/lib/solargraph/api_map/store.rb +384 -241
- data/lib/solargraph/api_map.rb +945 -875
- data/lib/solargraph/bench.rb +45 -28
- data/lib/solargraph/complex_type/type_methods.rb +228 -217
- data/lib/solargraph/complex_type/unique_type.rb +482 -386
- data/lib/solargraph/complex_type.rb +444 -394
- data/lib/solargraph/convention/active_support_concern.rb +111 -0
- data/lib/solargraph/convention/base.rb +20 -3
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
- data/lib/solargraph/convention/data_definition.rb +105 -0
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -22
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
- data/lib/solargraph/convention/struct_definition.rb +164 -0
- data/lib/solargraph/convention.rb +78 -47
- data/lib/solargraph/converters/dd.rb +17 -17
- data/lib/solargraph/converters/dl.rb +15 -15
- data/lib/solargraph/converters/dt.rb +15 -15
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -113
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/doc_map.rb +439 -188
- data/lib/solargraph/environ.rb +9 -2
- data/lib/solargraph/equality.rb +34 -33
- data/lib/solargraph/gem_pins.rb +98 -72
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -128
- data/lib/solargraph/language_server/host/message_worker.rb +112 -106
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -861
- data/lib/solargraph/language_server/message/base.rb +97 -96
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
- data/lib/solargraph/language_server/message/extended/document.rb +23 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +191 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/progress.rb +8 -0
- data/lib/solargraph/language_server/request.rb +27 -24
- data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +683 -662
- data/lib/solargraph/location.rb +82 -58
- data/lib/solargraph/logging.rb +37 -27
- data/lib/solargraph/page.rb +92 -89
- data/lib/solargraph/parser/comment_ripper.rb +69 -56
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
- data/lib/solargraph/parser/node_processor/base.rb +92 -87
- data/lib/solargraph/parser/node_processor.rb +62 -45
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
- data/lib/solargraph/parser/parser_gem.rb +12 -12
- data/lib/solargraph/parser/region.rb +69 -66
- data/lib/solargraph/parser/snippet.rb +17 -15
- data/lib/solargraph/parser.rb +23 -22
- data/lib/solargraph/pin/base.rb +729 -378
- data/lib/solargraph/pin/base_variable.rb +126 -118
- data/lib/solargraph/pin/block.rb +104 -101
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +231 -147
- data/lib/solargraph/pin/closure.rb +72 -57
- data/lib/solargraph/pin/common.rb +79 -70
- data/lib/solargraph/pin/constant.rb +45 -43
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -101
- data/lib/solargraph/pin/documenting.rb +114 -98
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -15
- data/lib/solargraph/pin/local_variable.rb +75 -67
- data/lib/solargraph/pin/method.rb +672 -527
- data/lib/solargraph/pin/method_alias.rb +34 -31
- data/lib/solargraph/pin/namespace.rb +115 -107
- data/lib/solargraph/pin/parameter.rb +275 -212
- data/lib/solargraph/pin/proxy_type.rb +39 -29
- data/lib/solargraph/pin/reference/override.rb +47 -29
- data/lib/solargraph/pin/reference/require.rb +2 -2
- data/lib/solargraph/pin/reference/superclass.rb +15 -10
- data/lib/solargraph/pin/reference.rb +39 -22
- data/lib/solargraph/pin/search.rb +61 -56
- data/lib/solargraph/pin/signature.rb +61 -17
- data/lib/solargraph/pin/singleton.rb +1 -1
- data/lib/solargraph/pin/symbol.rb +53 -47
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +44 -41
- data/lib/solargraph/pin_cache.rb +245 -0
- data/lib/solargraph/position.rb +132 -107
- data/lib/solargraph/range.rb +112 -98
- data/lib/solargraph/rbs_map/conversions.rb +823 -646
- data/lib/solargraph/rbs_map/core_fills.rb +84 -50
- data/lib/solargraph/rbs_map/core_map.rb +58 -28
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
- data/lib/solargraph/rbs_map.rb +163 -93
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +363 -269
- data/lib/solargraph/source/chain/array.rb +37 -33
- data/lib/solargraph/source/chain/block_symbol.rb +1 -1
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +337 -303
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +26 -89
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +34 -33
- data/lib/solargraph/source/chain/head.rb +1 -1
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +109 -98
- data/lib/solargraph/source/chain/literal.rb +48 -28
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +291 -252
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -167
- data/lib/solargraph/source/encoding_fixes.rb +23 -23
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -495
- data/lib/solargraph/source_map/clip.rb +226 -232
- data/lib/solargraph/source_map/data.rb +34 -30
- data/lib/solargraph/source_map/mapper.rb +259 -255
- data/lib/solargraph/source_map.rb +212 -217
- data/lib/solargraph/type_checker/checks.rb +124 -120
- data/lib/solargraph/type_checker/param_def.rb +37 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -62
- data/lib/solargraph/type_checker.rb +814 -672
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/_method.erb +10 -10
- data/lib/solargraph/views/_namespace.erb +3 -3
- data/lib/solargraph/views/document.erb +10 -10
- data/lib/solargraph/workspace/config.rb +255 -239
- data/lib/solargraph/workspace/require_paths.rb +97 -0
- data/lib/solargraph/workspace.rb +220 -239
- data/lib/solargraph/yard_map/helpers.rb +44 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
- data/lib/solargraph/yard_map/mapper.rb +79 -78
- data/lib/solargraph/yard_map/to_method.rb +89 -86
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +87 -52
- data/lib/solargraph.rb +105 -72
- data/rbs/fills/bundler/0/bundler.rbs +4271 -0
- data/rbs/fills/open3/0/open3.rbs +172 -0
- data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
- data/rbs/fills/rubygems/0/errors.rbs +364 -0
- data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
- data/rbs/fills/rubygems/0/specification.rbs +1753 -0
- data/rbs/fills/tuple/tuple.rbs +149 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
- data/rbs/shims/ast/2.4/ast.rbs +73 -0
- data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
- data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
- data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
- data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
- data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
- data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
- data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
- data/rbs_collection.yaml +19 -0
- data/solargraph.gemspec +27 -5
- metadata +215 -18
- data/lib/.rubocop.yml +0 -22
- data/lib/solargraph/cache.rb +0 -77
- data/lib/solargraph/parser/node_methods.rb +0 -83
|
@@ -1,120 +1,124 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class TypeChecker
|
|
5
|
-
# Helper methods for performing type checks
|
|
6
|
-
#
|
|
7
|
-
module Checks
|
|
8
|
-
module_function
|
|
9
|
-
|
|
10
|
-
# Compare an expected type with an inferred type. Common usage is to
|
|
11
|
-
# check if the type declared in a method's @return tag matches the type
|
|
12
|
-
# inferred from static analysis of the code.
|
|
13
|
-
#
|
|
14
|
-
# @param api_map [ApiMap]
|
|
15
|
-
# @param expected [ComplexType]
|
|
16
|
-
# @param inferred [ComplexType]
|
|
17
|
-
# @return [Boolean]
|
|
18
|
-
def types_match? api_map, expected, inferred
|
|
19
|
-
return true if expected.to_s == inferred.to_s
|
|
20
|
-
matches = []
|
|
21
|
-
expected.each do |exp|
|
|
22
|
-
found = false
|
|
23
|
-
inferred.each do |inf|
|
|
24
|
-
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
25
|
-
if either_way?(api_map, inf, exp)
|
|
26
|
-
found = true
|
|
27
|
-
matches.push inf
|
|
28
|
-
break
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
return false unless found
|
|
32
|
-
end
|
|
33
|
-
inferred.each do |inf|
|
|
34
|
-
next if matches.include?(inf)
|
|
35
|
-
found = false
|
|
36
|
-
expected.each do |exp|
|
|
37
|
-
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
38
|
-
if either_way?(api_map, inf, exp)
|
|
39
|
-
found = true
|
|
40
|
-
break
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
return false unless found
|
|
44
|
-
end
|
|
45
|
-
true
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# @param api_map [ApiMap]
|
|
49
|
-
# @param expected [ComplexType]
|
|
50
|
-
# @param inferred [ComplexType]
|
|
51
|
-
# @return [Boolean]
|
|
52
|
-
def any_types_match? api_map, expected, inferred
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
expected
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
inferred
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# @param
|
|
72
|
-
# @
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
#
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class TypeChecker
|
|
5
|
+
# Helper methods for performing type checks
|
|
6
|
+
#
|
|
7
|
+
module Checks
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Compare an expected type with an inferred type. Common usage is to
|
|
11
|
+
# check if the type declared in a method's @return tag matches the type
|
|
12
|
+
# inferred from static analysis of the code.
|
|
13
|
+
#
|
|
14
|
+
# @param api_map [ApiMap]
|
|
15
|
+
# @param expected [ComplexType]
|
|
16
|
+
# @param inferred [ComplexType]
|
|
17
|
+
# @return [Boolean]
|
|
18
|
+
def types_match? api_map, expected, inferred
|
|
19
|
+
return true if expected.to_s == inferred.to_s
|
|
20
|
+
matches = []
|
|
21
|
+
expected.each do |exp|
|
|
22
|
+
found = false
|
|
23
|
+
inferred.each do |inf|
|
|
24
|
+
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
25
|
+
if either_way?(api_map, inf, exp)
|
|
26
|
+
found = true
|
|
27
|
+
matches.push inf
|
|
28
|
+
break
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
return false unless found
|
|
32
|
+
end
|
|
33
|
+
inferred.each do |inf|
|
|
34
|
+
next if matches.include?(inf)
|
|
35
|
+
found = false
|
|
36
|
+
expected.each do |exp|
|
|
37
|
+
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
38
|
+
if either_way?(api_map, inf, exp)
|
|
39
|
+
found = true
|
|
40
|
+
break
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
return false unless found
|
|
44
|
+
end
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @param api_map [ApiMap]
|
|
49
|
+
# @param expected [ComplexType]
|
|
50
|
+
# @param inferred [ComplexType]
|
|
51
|
+
# @return [Boolean]
|
|
52
|
+
def any_types_match? api_map, expected, inferred
|
|
53
|
+
expected = expected.downcast_to_literal_if_possible
|
|
54
|
+
inferred = inferred.downcast_to_literal_if_possible
|
|
55
|
+
return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
|
|
56
|
+
# walk through the union expected type and see if any members
|
|
57
|
+
# of the union match the inferred type
|
|
58
|
+
expected.each do |exp|
|
|
59
|
+
next if exp.duck_type?
|
|
60
|
+
# @todo: there should be a level of typechecking where all
|
|
61
|
+
# unique types in the inferred must match one of the
|
|
62
|
+
# expected unique types
|
|
63
|
+
inferred.each do |inf|
|
|
64
|
+
# return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
65
|
+
return true if exp == inf || either_way?(api_map, inf, exp)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @param api_map [ApiMap]
|
|
72
|
+
# @param inferred [ComplexType]
|
|
73
|
+
# @param expected [ComplexType]
|
|
74
|
+
# @return [Boolean]
|
|
75
|
+
def all_types_match? api_map, inferred, expected
|
|
76
|
+
expected = expected.downcast_to_literal_if_possible
|
|
77
|
+
inferred = inferred.downcast_to_literal_if_possible
|
|
78
|
+
return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
|
|
79
|
+
inferred.each do |inf|
|
|
80
|
+
next if inf.duck_type?
|
|
81
|
+
return false unless expected.any? { |exp| exp == inf || either_way?(api_map, inf, exp) }
|
|
82
|
+
end
|
|
83
|
+
true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @param api_map [ApiMap]
|
|
87
|
+
# @param expected [ComplexType]
|
|
88
|
+
# @param inferred [ComplexType]
|
|
89
|
+
# @return [Boolean]
|
|
90
|
+
def duck_types_match? api_map, expected, inferred
|
|
91
|
+
raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
|
|
92
|
+
expected.each do |exp|
|
|
93
|
+
next unless exp.duck_type?
|
|
94
|
+
quack = exp.to_s[1..-1]
|
|
95
|
+
return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
|
|
96
|
+
end
|
|
97
|
+
true
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @param type [ComplexType::UniqueType]
|
|
101
|
+
# @return [String]
|
|
102
|
+
def fuzz type
|
|
103
|
+
if type.parameters?
|
|
104
|
+
type.name
|
|
105
|
+
else
|
|
106
|
+
type.tag
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# @param api_map [ApiMap]
|
|
111
|
+
# @param cls1 [ComplexType::UniqueType]
|
|
112
|
+
# @param cls2 [ComplexType::UniqueType]
|
|
113
|
+
# @return [Boolean]
|
|
114
|
+
def either_way?(api_map, cls1, cls2)
|
|
115
|
+
# @todo there should be a level of typechecking which uses the
|
|
116
|
+
# full tag with parameters to determine compatibility
|
|
117
|
+
f1 = cls1.name
|
|
118
|
+
f2 = cls2.name
|
|
119
|
+
api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
|
120
|
+
# api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -1,35 +1,37 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class TypeChecker
|
|
5
|
-
# Data about a method parameter definition. This is the information from
|
|
6
|
-
# the args list in the def call, not the `@param` tags.
|
|
7
|
-
#
|
|
8
|
-
class ParamDef
|
|
9
|
-
# @return [String]
|
|
10
|
-
attr_reader :name
|
|
11
|
-
|
|
12
|
-
# @return [Symbol]
|
|
13
|
-
attr_reader :type
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class TypeChecker
|
|
5
|
+
# Data about a method parameter definition. This is the information from
|
|
6
|
+
# the args list in the def call, not the `@param` tags.
|
|
7
|
+
#
|
|
8
|
+
class ParamDef
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :name
|
|
11
|
+
|
|
12
|
+
# @return [Symbol]
|
|
13
|
+
attr_reader :type
|
|
14
|
+
|
|
15
|
+
# @param name [String]
|
|
16
|
+
# @param type [Symbol] The type of parameter, such as :req, :opt, :rest, etc.
|
|
17
|
+
def initialize name, type
|
|
18
|
+
@name = name
|
|
19
|
+
@type = type
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# Get an array of ParamDefs from a method pin.
|
|
24
|
+
#
|
|
25
|
+
# @param pin [Solargraph::Pin::Method]
|
|
26
|
+
# @return [Array<ParamDef>]
|
|
27
|
+
def from pin
|
|
28
|
+
result = []
|
|
29
|
+
pin.parameters.each do |par|
|
|
30
|
+
result.push ParamDef.new(par.name, par.decl)
|
|
31
|
+
end
|
|
32
|
+
result
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class TypeChecker
|
|
5
|
-
# A problem reported by TypeChecker.
|
|
6
|
-
#
|
|
7
|
-
class Problem
|
|
8
|
-
# @return [Solargraph::Location]
|
|
9
|
-
attr_reader :location
|
|
10
|
-
|
|
11
|
-
# @return [String]
|
|
12
|
-
attr_reader :message
|
|
13
|
-
|
|
14
|
-
# @return [Pin::Base]
|
|
15
|
-
attr_reader :pin
|
|
16
|
-
|
|
17
|
-
# @return [String, nil]
|
|
18
|
-
attr_reader :suggestion
|
|
19
|
-
|
|
20
|
-
# @param location [Solargraph::Location]
|
|
21
|
-
# @param message [String]
|
|
22
|
-
# @param pin [Solargraph::Pin::Base, nil]
|
|
23
|
-
# @param suggestion [String, nil]
|
|
24
|
-
def initialize location, message, pin: nil, suggestion: nil
|
|
25
|
-
@location = location
|
|
26
|
-
@message = message
|
|
27
|
-
@pin = pin
|
|
28
|
-
@suggestion = suggestion
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class TypeChecker
|
|
5
|
+
# A problem reported by TypeChecker.
|
|
6
|
+
#
|
|
7
|
+
class Problem
|
|
8
|
+
# @return [Solargraph::Location]
|
|
9
|
+
attr_reader :location
|
|
10
|
+
|
|
11
|
+
# @return [String]
|
|
12
|
+
attr_reader :message
|
|
13
|
+
|
|
14
|
+
# @return [Pin::Base]
|
|
15
|
+
attr_reader :pin
|
|
16
|
+
|
|
17
|
+
# @return [String, nil]
|
|
18
|
+
attr_reader :suggestion
|
|
19
|
+
|
|
20
|
+
# @param location [Solargraph::Location]
|
|
21
|
+
# @param message [String]
|
|
22
|
+
# @param pin [Solargraph::Pin::Base, nil]
|
|
23
|
+
# @param suggestion [String, nil]
|
|
24
|
+
def initialize location, message, pin: nil, suggestion: nil
|
|
25
|
+
@location = location
|
|
26
|
+
@message = message
|
|
27
|
+
@pin = pin
|
|
28
|
+
@suggestion = suggestion
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -1,62 +1,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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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_all_return_types_match_inferred?
|
|
64
|
+
report?(:require_all_return_types_match_inferred, :alpha)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# We keep this at strong because if you added an @ sg-ignore to
|
|
68
|
+
# address a strong-level issue, then ran at a lower level, you'd
|
|
69
|
+
# get a false positive - we don't run stronger level checks than
|
|
70
|
+
# requested for performance reasons
|
|
71
|
+
def validate_sg_ignores?
|
|
72
|
+
report?(:validate_sg_ignores, :strong)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
# @param type [Symbol]
|
|
78
|
+
# @param level [Symbol]
|
|
79
|
+
def report?(type, level)
|
|
80
|
+
rank >= LEVELS[@overrides.fetch(type, level)]
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|