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,91 +1,93 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
module DataDefinition
|
|
6
|
-
# A node wrapper for a Data definition via inheritance.
|
|
7
|
-
# @example
|
|
8
|
-
# class MyData < Data.new(:bar, :baz)
|
|
9
|
-
# def foo
|
|
10
|
-
# end
|
|
11
|
-
# end
|
|
12
|
-
class DataDefintionNode
|
|
13
|
-
class << self
|
|
14
|
-
# @example
|
|
15
|
-
# s(:class,
|
|
16
|
-
# s(:const, nil, :Foo),
|
|
17
|
-
# s(:send,
|
|
18
|
-
# s(:const, nil, :Data), :define,
|
|
19
|
-
# s(:sym, :bar),
|
|
20
|
-
# s(:sym, :baz)),
|
|
21
|
-
# s(:hash,
|
|
22
|
-
# s(:pair,
|
|
23
|
-
# s(:sym, :keyword_init),
|
|
24
|
-
# s(:true)))),
|
|
25
|
-
# s(:def, :foo,
|
|
26
|
-
# s(:args),
|
|
27
|
-
# s(:send, nil, :bar)))
|
|
28
|
-
#
|
|
29
|
-
# @param node [Parser::AST::Node]
|
|
30
|
-
def match?(node)
|
|
31
|
-
return false unless node&.type == :class
|
|
32
|
-
|
|
33
|
-
data_definition_node?(node.children[1])
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
private
|
|
37
|
-
|
|
38
|
-
# @param data_node [Parser::AST::Node]
|
|
39
|
-
# @return [Boolean]
|
|
40
|
-
def data_definition_node?(data_node)
|
|
41
|
-
return false unless data_node.is_a?(::Parser::AST::Node)
|
|
42
|
-
return false unless data_node&.type == :send
|
|
43
|
-
return false unless data_node.children[0]&.type == :const
|
|
44
|
-
return false unless data_node.children[0].children[1] == :Data
|
|
45
|
-
return false unless data_node.children[1] == :define
|
|
46
|
-
|
|
47
|
-
true
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @param node [Parser::AST::Node]
|
|
52
|
-
def initialize(node)
|
|
53
|
-
@node = node
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @return [String]
|
|
57
|
-
def class_name
|
|
58
|
-
Parser::NodeMethods.unpack_name(node)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @return [Array<Array(Parser::AST::Node, String)>]
|
|
62
|
-
def attributes
|
|
63
|
-
data_attribute_nodes.map do |data_def_param|
|
|
64
|
-
next unless data_def_param.type == :sym
|
|
65
|
-
[data_def_param, data_def_param.children[0].to_s]
|
|
66
|
-
end.compact
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# @return [Parser::AST::Node]
|
|
70
|
-
def body_node
|
|
71
|
-
node.children[2]
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
|
|
76
|
-
# @return [Parser::AST::Node]
|
|
77
|
-
attr_reader :node
|
|
78
|
-
|
|
79
|
-
# @return [Parser::AST::Node, nil]
|
|
80
|
-
def data_node
|
|
81
|
-
node.children[1]
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# @
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
module DataDefinition
|
|
6
|
+
# A node wrapper for a Data definition via inheritance.
|
|
7
|
+
# @example
|
|
8
|
+
# class MyData < Data.new(:bar, :baz)
|
|
9
|
+
# def foo
|
|
10
|
+
# end
|
|
11
|
+
# end
|
|
12
|
+
class DataDefintionNode
|
|
13
|
+
class << self
|
|
14
|
+
# @example
|
|
15
|
+
# s(:class,
|
|
16
|
+
# s(:const, nil, :Foo),
|
|
17
|
+
# s(:send,
|
|
18
|
+
# s(:const, nil, :Data), :define,
|
|
19
|
+
# s(:sym, :bar),
|
|
20
|
+
# s(:sym, :baz)),
|
|
21
|
+
# s(:hash,
|
|
22
|
+
# s(:pair,
|
|
23
|
+
# s(:sym, :keyword_init),
|
|
24
|
+
# s(:true)))),
|
|
25
|
+
# s(:def, :foo,
|
|
26
|
+
# s(:args),
|
|
27
|
+
# s(:send, nil, :bar)))
|
|
28
|
+
#
|
|
29
|
+
# @param node [Parser::AST::Node]
|
|
30
|
+
def match?(node)
|
|
31
|
+
return false unless node&.type == :class
|
|
32
|
+
|
|
33
|
+
data_definition_node?(node.children[1])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
# @param data_node [Parser::AST::Node]
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
def data_definition_node?(data_node)
|
|
41
|
+
return false unless data_node.is_a?(::Parser::AST::Node)
|
|
42
|
+
return false unless data_node&.type == :send
|
|
43
|
+
return false unless data_node.children[0]&.type == :const
|
|
44
|
+
return false unless data_node.children[0].children[1] == :Data
|
|
45
|
+
return false unless data_node.children[1] == :define
|
|
46
|
+
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @param node [Parser::AST::Node]
|
|
52
|
+
def initialize(node)
|
|
53
|
+
@node = node
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [String]
|
|
57
|
+
def class_name
|
|
58
|
+
Parser::NodeMethods.unpack_name(node)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [Array<Array(Parser::AST::Node, String)>]
|
|
62
|
+
def attributes
|
|
63
|
+
data_attribute_nodes.map do |data_def_param|
|
|
64
|
+
next unless data_def_param.type == :sym
|
|
65
|
+
[data_def_param, data_def_param.children[0].to_s]
|
|
66
|
+
end.compact
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [Parser::AST::Node, nil]
|
|
70
|
+
def body_node
|
|
71
|
+
node.children[2]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
# @return [Parser::AST::Node]
|
|
77
|
+
attr_reader :node
|
|
78
|
+
|
|
79
|
+
# @return [Parser::AST::Node, nil]
|
|
80
|
+
def data_node
|
|
81
|
+
node.children[1]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @sg-ignore Need to add nil check here
|
|
85
|
+
# @return [Array<Parser::AST::Node>]
|
|
86
|
+
def data_attribute_nodes
|
|
87
|
+
# @sg-ignore Need to add nil check here
|
|
88
|
+
data_node.children[2..-1]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -1,105 +1,108 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
module DataDefinition
|
|
6
|
-
autoload :DataDefintionNode, 'solargraph/convention/data_definition/data_definition_node'
|
|
7
|
-
autoload :DataAssignmentNode, 'solargraph/convention/data_definition/data_assignment_node'
|
|
8
|
-
|
|
9
|
-
module NodeProcessors
|
|
10
|
-
class DataNode < Parser::NodeProcessor::Base
|
|
11
|
-
# @return [Boolean] continue processing the next processor of the same node.
|
|
12
|
-
def process
|
|
13
|
-
return true if data_definition_node.nil?
|
|
14
|
-
|
|
15
|
-
loc = get_node_location(node)
|
|
16
|
-
nspin = Solargraph::Pin::Namespace.new(
|
|
17
|
-
type: :class,
|
|
18
|
-
location: loc,
|
|
19
|
-
closure: region.closure,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
data_comments
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
module DataDefinition
|
|
6
|
+
autoload :DataDefintionNode, 'solargraph/convention/data_definition/data_definition_node'
|
|
7
|
+
autoload :DataAssignmentNode, 'solargraph/convention/data_definition/data_assignment_node'
|
|
8
|
+
|
|
9
|
+
module NodeProcessors
|
|
10
|
+
class DataNode < Parser::NodeProcessor::Base
|
|
11
|
+
# @return [Boolean] continue processing the next processor of the same node.
|
|
12
|
+
def process
|
|
13
|
+
return true if data_definition_node.nil?
|
|
14
|
+
|
|
15
|
+
loc = get_node_location(node)
|
|
16
|
+
nspin = Solargraph::Pin::Namespace.new(
|
|
17
|
+
type: :class,
|
|
18
|
+
location: loc,
|
|
19
|
+
closure: region.closure,
|
|
20
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
21
|
+
name: data_definition_node.class_name,
|
|
22
|
+
comments: comments_for(node),
|
|
23
|
+
visibility: :public,
|
|
24
|
+
gates: region.closure.gates.freeze
|
|
25
|
+
)
|
|
26
|
+
pins.push nspin
|
|
27
|
+
|
|
28
|
+
# define initialize method
|
|
29
|
+
initialize_method_pin = Pin::Method.new(
|
|
30
|
+
name: 'initialize',
|
|
31
|
+
parameters: [],
|
|
32
|
+
scope: :instance,
|
|
33
|
+
location: get_node_location(node),
|
|
34
|
+
closure: nspin,
|
|
35
|
+
visibility: :private,
|
|
36
|
+
comments: comments_for(node)
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# @todo Support both arg and kwarg initializers for Data.define
|
|
40
|
+
# Solargraph::SourceMap::Clip#complete_keyword_parameters does not seem to currently take into account [Pin::Method#signatures] hence we only one for :kwarg
|
|
41
|
+
pins.push initialize_method_pin
|
|
42
|
+
|
|
43
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
44
|
+
data_definition_node.attributes.map do |attribute_node, attribute_name|
|
|
45
|
+
initialize_method_pin.parameters.push(
|
|
46
|
+
Pin::Parameter.new(
|
|
47
|
+
name: attribute_name,
|
|
48
|
+
decl: :kwarg,
|
|
49
|
+
location: get_node_location(attribute_node),
|
|
50
|
+
closure: initialize_method_pin
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# define attribute readers and instance variables
|
|
56
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
57
|
+
data_definition_node.attributes.each do |attribute_node, attribute_name|
|
|
58
|
+
name = attribute_name.to_s
|
|
59
|
+
method_pin = Pin::Method.new(
|
|
60
|
+
name: name,
|
|
61
|
+
parameters: [],
|
|
62
|
+
scope: :instance,
|
|
63
|
+
location: get_node_location(attribute_node),
|
|
64
|
+
closure: nspin,
|
|
65
|
+
comments: attribute_comments(attribute_node, attribute_name),
|
|
66
|
+
visibility: :public
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
pins.push method_pin
|
|
70
|
+
|
|
71
|
+
pins.push Pin::InstanceVariable.new(name: "@#{attribute_name}",
|
|
72
|
+
closure: method_pin,
|
|
73
|
+
location: get_node_location(attribute_node),
|
|
74
|
+
comments: attribute_comments(attribute_node, attribute_name))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
process_children region.update(closure: nspin, visibility: :public)
|
|
78
|
+
|
|
79
|
+
false
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
# @return [DataDefinition::DataDefintionNode, DataDefinition::DataAssignmentNode, nil]
|
|
85
|
+
def data_definition_node
|
|
86
|
+
@data_definition_node ||= if DataDefintionNode.match?(node)
|
|
87
|
+
DataDefintionNode.new(node)
|
|
88
|
+
elsif DataAssignmentNode.match?(node)
|
|
89
|
+
DataAssignmentNode.new(node)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @param attribute_node [Parser::AST::Node]
|
|
94
|
+
# @param attribute_name [String]
|
|
95
|
+
# @return [String, nil]
|
|
96
|
+
def attribute_comments(attribute_node, attribute_name)
|
|
97
|
+
data_comments = comments_for(attribute_node)
|
|
98
|
+
return if data_comments.nil? || data_comments.empty?
|
|
99
|
+
|
|
100
|
+
data_comments.split("\n").find do |row|
|
|
101
|
+
row.include?(attribute_name)
|
|
102
|
+
end&.gsub('@param', '@return')&.gsub(attribute_name, '')
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -1,61 +1,62 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
module StructDefinition
|
|
6
|
-
# A node wrapper for a Struct definition via const assignment.
|
|
7
|
-
# @example
|
|
8
|
-
# MyStruct = Struct.new(:bar, :baz) do
|
|
9
|
-
# def foo
|
|
10
|
-
# end
|
|
11
|
-
# end
|
|
12
|
-
class StructAssignmentNode < StructDefintionNode
|
|
13
|
-
class << self
|
|
14
|
-
# @example
|
|
15
|
-
# s(:casgn, nil, :Foo,
|
|
16
|
-
# s(:block,
|
|
17
|
-
# s(:send,
|
|
18
|
-
# s(:const, nil, :Struct), :new,
|
|
19
|
-
# s(:sym, :bar),
|
|
20
|
-
# s(:sym, :baz)),
|
|
21
|
-
# s(:args),
|
|
22
|
-
# s(:def, :foo,
|
|
23
|
-
# s(:args),
|
|
24
|
-
# s(:send, nil, :bar))))
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return false
|
|
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
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
module StructDefinition
|
|
6
|
+
# A node wrapper for a Struct definition via const assignment.
|
|
7
|
+
# @example
|
|
8
|
+
# MyStruct = Struct.new(:bar, :baz) do
|
|
9
|
+
# def foo
|
|
10
|
+
# end
|
|
11
|
+
# end
|
|
12
|
+
class StructAssignmentNode < StructDefintionNode
|
|
13
|
+
class << self
|
|
14
|
+
# @example
|
|
15
|
+
# s(:casgn, nil, :Foo,
|
|
16
|
+
# s(:block,
|
|
17
|
+
# s(:send,
|
|
18
|
+
# s(:const, nil, :Struct), :new,
|
|
19
|
+
# s(:sym, :bar),
|
|
20
|
+
# s(:sym, :baz)),
|
|
21
|
+
# s(:args),
|
|
22
|
+
# s(:def, :foo,
|
|
23
|
+
# s(:args),
|
|
24
|
+
# s(:send, nil, :bar))))
|
|
25
|
+
#
|
|
26
|
+
# @param node [Parser::AST::Node]
|
|
27
|
+
def match?(node)
|
|
28
|
+
return false unless node&.type == :casgn
|
|
29
|
+
return false if node.children[2].nil?
|
|
30
|
+
|
|
31
|
+
struct_node = if node.children[2].type == :block
|
|
32
|
+
node.children[2].children[0]
|
|
33
|
+
else
|
|
34
|
+
node.children[2]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
struct_definition_node?(struct_node)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def class_name
|
|
42
|
+
if node.children[0]
|
|
43
|
+
Parser::NodeMethods.unpack_name(node.children[0]) + "::#{node.children[1]}"
|
|
44
|
+
else
|
|
45
|
+
node.children[1].to_s
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# @return [Parser::AST::Node]
|
|
52
|
+
def struct_node
|
|
53
|
+
if node.children[2].type == :block
|
|
54
|
+
node.children[2].children[0]
|
|
55
|
+
else
|
|
56
|
+
node.children[2]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|