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.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,44 +1,45 @@
1
- module Solargraph
2
- class YardMap
3
- module Helpers
4
- module_function
5
-
6
- # @param code_object [YARD::CodeObjects::Base]
7
- # @param spec [Gem::Specification, nil]
8
- # @return [Solargraph::Location, nil]
9
- def object_location code_object, spec
10
- if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
11
- if code_object.namespace.is_a?(YARD::CodeObjects::NamespaceObject)
12
- # If the code object is a namespace, use the namespace's location
13
- return object_location(code_object.namespace, spec)
14
- end
15
- return Solargraph::Location.new(__FILE__, Solargraph::Range.from_to(__LINE__ - 1, 0, __LINE__ - 1, 0))
16
- end
17
- file = File.join(spec.full_gem_path, code_object.file)
18
- Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
19
- end
20
-
21
- # @param code_object [YARD::CodeObjects::Base]
22
- # @param spec [Gem::Specification, nil]
23
- # @return [Solargraph::Pin::Namespace]
24
- def create_closure_namespace_for(code_object, spec)
25
- code_object_for_location = code_object
26
- # code_object.namespace is sometimes a YARD proxy object pointing to a method path ("Object#new")
27
- code_object_for_location = code_object.namespace if code_object.namespace.is_a?(YARD::CodeObjects::NamespaceObject)
28
- namespace_location = object_location(code_object_for_location, spec)
29
- ns_name = code_object.namespace.to_s
30
- if ns_name.empty?
31
- Solargraph::Pin::ROOT_PIN
32
- else
33
- Solargraph::Pin::Namespace.new(
34
- name: ns_name,
35
- closure: Pin::ROOT_PIN,
36
- gates: [code_object.namespace.to_s],
37
- source: :yardoc,
38
- location: namespace_location
39
- )
40
- end
41
- end
42
- end
43
- end
44
- end
1
+ module Solargraph
2
+ class YardMap
3
+ module Helpers
4
+ module_function
5
+
6
+ # @param code_object [YARD::CodeObjects::Base]
7
+ # @param spec [Gem::Specification, nil]
8
+ # @return [Solargraph::Location]
9
+ def object_location code_object, spec
10
+ if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
11
+ if code_object.namespace.is_a?(YARD::CodeObjects::NamespaceObject)
12
+ # If the code object is a namespace, use the namespace's location
13
+ return object_location(code_object.namespace, spec)
14
+ end
15
+ return Solargraph::Location.new(__FILE__, Solargraph::Range.from_to(__LINE__ - 1, 0, __LINE__ - 1, 0))
16
+ end
17
+ # @sg-ignore flow sensitive typing should be able to identify more blocks that always return
18
+ file = File.join(spec.full_gem_path, code_object.file)
19
+ Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
20
+ end
21
+
22
+ # @param code_object [YARD::CodeObjects::Base]
23
+ # @param spec [Gem::Specification, nil]
24
+ # @return [Solargraph::Pin::Namespace]
25
+ def create_closure_namespace_for(code_object, spec)
26
+ code_object_for_location = code_object
27
+ # code_object.namespace is sometimes a YARD proxy object pointing to a method path ("Object#new")
28
+ code_object_for_location = code_object.namespace if code_object.namespace.is_a?(YARD::CodeObjects::NamespaceObject)
29
+ namespace_location = object_location(code_object_for_location, spec)
30
+ ns_name = code_object.namespace.to_s
31
+ if ns_name.empty?
32
+ Solargraph::Pin::ROOT_PIN
33
+ else
34
+ Solargraph::Pin::Namespace.new(
35
+ name: ns_name,
36
+ closure: Pin::ROOT_PIN,
37
+ gates: [code_object.namespace.to_s],
38
+ source: :yardoc,
39
+ location: namespace_location
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,130 +1,134 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class YardMap
5
- class Mapper
6
- module ToMethod
7
- extend YardMap::Helpers
8
-
9
- VISIBILITY_OVERRIDE = {
10
- # YARD pays attention to 'private' statements prior to class methods but shouldn't
11
- ["Rails::Engine", :class, "find_root_with_flag"] => :public
12
- }
13
-
14
- # @param code_object [YARD::CodeObjects::MethodObject]
15
- # @param name [String, nil]
16
- # @param scope [Symbol, nil]
17
- # @param visibility [Symbol, nil]
18
- # @param closure [Solargraph::Pin::Namespace, nil]
19
- # @param spec [Gem::Specification, nil]
20
- # @return [Solargraph::Pin::Method]
21
- def self.make code_object, name = nil, scope = nil, visibility = nil, closure = nil, spec = nil
22
- closure ||= create_closure_namespace_for(code_object, spec)
23
- location = object_location(code_object, spec)
24
- name ||= code_object.name.to_s
25
- return_type = ComplexType::SELF if name == 'new'
26
- comments = code_object.docstring ? code_object.docstring.all.to_s : ''
27
- final_scope = scope || code_object.scope
28
- override_key = [closure.path, final_scope, name]
29
- final_visibility = VISIBILITY_OVERRIDE[override_key]
30
- final_visibility ||= VISIBILITY_OVERRIDE[[closure.path, final_scope]]
31
- final_visibility ||= :private if closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(name.to_sym)
32
- final_visibility ||= visibility
33
- final_visibility ||= :private if code_object.module_function? && final_scope == :instance
34
- final_visibility ||= :public if code_object.module_function? && final_scope == :class
35
- final_visibility ||= code_object.visibility
36
- if code_object.is_alias?
37
- origin_code_object = code_object.namespace.aliases[code_object]
38
- pin = Pin::MethodAlias.new(
39
- name: name,
40
- location: location,
41
- original: origin_code_object.name.to_s,
42
- closure: closure,
43
- comments: comments,
44
- scope: final_scope,
45
- visibility: final_visibility,
46
- explicit: code_object.is_explicit?,
47
- return_type: return_type,
48
- parameters: [],
49
- source: :yardoc,
50
- )
51
- else
52
- pin = Pin::Method.new(
53
- location: location,
54
- closure: closure,
55
- name: name,
56
- comments: comments,
57
- scope: final_scope,
58
- visibility: final_visibility,
59
- # @todo Might need to convert overloads to signatures
60
- explicit: code_object.is_explicit?,
61
- return_type: return_type,
62
- attribute: code_object.is_attribute?,
63
- parameters: [],
64
- source: :yardoc,
65
- )
66
- pin.parameters.concat get_parameters(code_object, location, comments, pin)
67
- pin.parameters.freeze
68
- end
69
- logger.debug { "ToMethod.make: Just created method pin: #{pin.inspect}" }
70
- pin
71
- end
72
-
73
- class << self
74
- include Logging
75
-
76
- private
77
-
78
- # @param code_object [YARD::CodeObjects::Base]
79
- # @param location [Location],
80
- # @param comments [String]
81
- # @param pin [Pin::Base]
82
- # @return [Array<Solargraph::Pin::Parameter>]
83
- def get_parameters code_object, location, comments, pin
84
- return [] unless code_object.is_a?(YARD::CodeObjects::MethodObject)
85
- # HACK: Skip `nil` and `self` parameters that are sometimes emitted
86
- # for methods defined in C
87
- # See https://github.com/castwide/solargraph/issues/345
88
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
89
- code_object.parameters.select { |a| a[0] && a[0] != 'self' }.map do |a|
90
- Solargraph::Pin::Parameter.new(
91
- location: location,
92
- closure: pin,
93
- comments: comments,
94
- name: arg_name(a),
95
- presence: nil,
96
- decl: arg_type(a),
97
- asgn_code: a[1],
98
- source: :yardoc,
99
- )
100
- end
101
- end
102
-
103
- # @param a [Array<String>]
104
- # @return [String]
105
- def arg_name a
106
- a[0].gsub(/[^a-z0-9_]/i, '')
107
- end
108
-
109
- # @param a [Array]
110
- # @return [::Symbol]
111
- def arg_type a
112
- if a[0].start_with?('**')
113
- :kwrestarg
114
- elsif a[0].start_with?('*')
115
- :restarg
116
- elsif a[0].start_with?('&')
117
- :blockarg
118
- elsif a[0].end_with?(':')
119
- a[1] ? :kwoptarg : :kwarg
120
- elsif a[1]
121
- :optarg
122
- else
123
- :arg
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class YardMap
5
+ class Mapper
6
+ module ToMethod
7
+ extend YardMap::Helpers
8
+
9
+ # @type [Hash{Array<String, Symbol, String> => Symbol}]
10
+ VISIBILITY_OVERRIDE = {
11
+ # YARD pays attention to 'private' statements prior to class methods but shouldn't
12
+ ["Rails::Engine", :class, "find_root_with_flag"] => :public
13
+ }
14
+
15
+ # @param code_object [YARD::CodeObjects::MethodObject]
16
+ # @param name [String, nil]
17
+ # @param scope [Symbol, nil]
18
+ # @param visibility [Symbol, nil]
19
+ # @param closure [Solargraph::Pin::Namespace, nil]
20
+ # @param spec [Gem::Specification, nil]
21
+ # @return [Solargraph::Pin::Method]
22
+ def self.make code_object, name = nil, scope = nil, visibility = nil, closure = nil, spec = nil
23
+ closure ||= create_closure_namespace_for(code_object, spec)
24
+ location = object_location(code_object, spec)
25
+ name ||= code_object.name.to_s
26
+ return_type = ComplexType::SELF if name == 'new'
27
+ comments = code_object.docstring ? code_object.docstring.all.to_s : ''
28
+ final_scope = scope || code_object.scope
29
+ # @sg-ignore Need to add nil check here
30
+ override_key = [closure.path, final_scope, name]
31
+ final_visibility = VISIBILITY_OVERRIDE[override_key]
32
+ # @sg-ignore Need to add nil check here
33
+ final_visibility ||= VISIBILITY_OVERRIDE[[closure.path, final_scope]]
34
+ # @sg-ignore Need to add nil check here
35
+ final_visibility ||= :private if closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(name.to_sym)
36
+ final_visibility ||= visibility
37
+ final_visibility ||= :private if code_object.module_function? && final_scope == :instance
38
+ final_visibility ||= :public if code_object.module_function? && final_scope == :class
39
+ final_visibility ||= code_object.visibility
40
+ if code_object.is_alias?
41
+ origin_code_object = code_object.namespace.aliases[code_object]
42
+ pin = Pin::MethodAlias.new(
43
+ name: name,
44
+ location: location,
45
+ original: origin_code_object.name.to_s,
46
+ closure: closure,
47
+ comments: comments,
48
+ scope: final_scope,
49
+ visibility: final_visibility,
50
+ explicit: code_object.is_explicit?,
51
+ return_type: return_type,
52
+ parameters: [],
53
+ source: :yardoc,
54
+ )
55
+ else
56
+ # @sg-ignore Need to add nil check here
57
+ pin = Pin::Method.new(
58
+ location: location,
59
+ closure: closure,
60
+ name: name,
61
+ comments: comments,
62
+ scope: final_scope,
63
+ visibility: final_visibility,
64
+ # @todo Might need to convert overloads to signatures
65
+ explicit: code_object.is_explicit?,
66
+ return_type: return_type,
67
+ attribute: code_object.is_attribute?,
68
+ parameters: [],
69
+ source: :yardoc,
70
+ )
71
+ pin.parameters.concat get_parameters(code_object, location, comments, pin)
72
+ pin.parameters.freeze
73
+ end
74
+ logger.debug { "ToMethod.make: Just created method pin: #{pin.inspect}" }
75
+ pin
76
+ end
77
+
78
+ class << self
79
+ include Logging
80
+
81
+ private
82
+
83
+ # @param code_object [YARD::CodeObjects::Base]
84
+ # @param location [Location],
85
+ # @param comments [String]
86
+ # @param pin [Pin::Base]
87
+ # @return [Array<Solargraph::Pin::Parameter>]
88
+ def get_parameters code_object, location, comments, pin
89
+ return [] unless code_object.is_a?(YARD::CodeObjects::MethodObject)
90
+ # HACK: Skip `nil` and `self` parameters that are sometimes emitted
91
+ # for methods defined in C
92
+ # See https://github.com/castwide/solargraph/issues/345
93
+ code_object.parameters.select { |a| a[0] && a[0] != 'self' }.map do |a|
94
+ Solargraph::Pin::Parameter.new(
95
+ location: location,
96
+ closure: pin,
97
+ comments: comments,
98
+ name: arg_name(a),
99
+ presence: nil,
100
+ decl: arg_type(a),
101
+ asgn_code: a[1],
102
+ source: :yardoc,
103
+ )
104
+ end
105
+ end
106
+
107
+ # @param a [Array<String>]
108
+ # @return [String]
109
+ def arg_name a
110
+ a[0].gsub(/[^a-z0-9_]/i, '')
111
+ end
112
+
113
+ # @param a [Array]
114
+ # @return [::Symbol]
115
+ def arg_type a
116
+ if a[0].start_with?('**')
117
+ :kwrestarg
118
+ elsif a[0].start_with?('*')
119
+ :restarg
120
+ elsif a[0].start_with?('&')
121
+ :blockarg
122
+ elsif a[0].end_with?(':')
123
+ a[1] ? :kwoptarg : :kwarg
124
+ elsif a[1]
125
+ :optarg
126
+ else
127
+ :arg
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -1,31 +1,32 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class YardMap
5
- class Mapper
6
- module ToNamespace
7
- extend YardMap::Helpers
8
-
9
- # @param code_object [YARD::CodeObjects::NamespaceObject]
10
- # @param spec [Gem::Specification, nil]
11
- # @param closure [Pin::Closure, nil]
12
- # @return [Pin::Namespace]
13
- def self.make code_object, spec, closure = nil
14
- closure ||= create_closure_namespace_for(code_object, spec)
15
- location = object_location(code_object, spec)
16
-
17
- Pin::Namespace.new(
18
- location: location,
19
- name: code_object.name.to_s,
20
- comments: code_object.docstring ? code_object.docstring.all.to_s : '',
21
- type: code_object.is_a?(YARD::CodeObjects::ClassObject) ? :class : :module,
22
- visibility: code_object.visibility,
23
- closure: closure,
24
- gates: closure.gates,
25
- source: :yardoc,
26
- )
27
- end
28
- end
29
- end
30
- end
31
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class YardMap
5
+ class Mapper
6
+ module ToNamespace
7
+ extend YardMap::Helpers
8
+
9
+ # @param code_object [YARD::CodeObjects::NamespaceObject]
10
+ # @param spec [Gem::Specification, nil]
11
+ # @param closure [Pin::Closure, nil]
12
+ # @return [Pin::Namespace]
13
+ def self.make code_object, spec, closure = nil
14
+ closure ||= create_closure_namespace_for(code_object, spec)
15
+ location = object_location(code_object, spec)
16
+
17
+ Pin::Namespace.new(
18
+ location: location,
19
+ name: code_object.name.to_s,
20
+ comments: code_object.docstring ? code_object.docstring.all.to_s : '',
21
+ type: code_object.is_a?(YARD::CodeObjects::ClassObject) ? :class : :module,
22
+ visibility: code_object.visibility,
23
+ closure: closure,
24
+ # @sg-ignore need to add a nil check here
25
+ gates: closure.gates,
26
+ source: :yardoc,
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,79 +1,84 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class YardMap
5
- class Mapper
6
- autoload :ToMethod, 'solargraph/yard_map/mapper/to_method'
7
- autoload :ToNamespace, 'solargraph/yard_map/mapper/to_namespace'
8
- autoload :ToConstant, 'solargraph/yard_map/mapper/to_constant'
9
-
10
- # @param code_objects [Array<YARD::CodeObjects::Base>]
11
- # @param spec [Gem::Specification, nil]
12
- def initialize code_objects, spec = nil
13
- @code_objects = code_objects
14
- @spec = spec
15
- # @type [Array<Solargraph::Pin::Base>]
16
- @pins = []
17
- @namespace_pins = {}
18
- end
19
-
20
- # @return [Array<Pin::Base>]
21
- def map
22
- @code_objects.each do |co|
23
- @pins.concat generate_pins co
24
- end
25
- # Some yardocs contain documentation for dependencies that can be
26
- # ignored here. The YardMap will load dependencies separately.
27
- @pins.keep_if { |pin| pin.location.nil? || File.file?(pin.location.filename) } if @spec
28
- @pins
29
- end
30
-
31
- private
32
-
33
- # @param code_object [YARD::CodeObjects::Base]
34
- # @return [Array<Pin::Base>]
35
- def generate_pins code_object
36
- result = []
37
- if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
38
- nspin = ToNamespace.make(code_object, @spec, @namespace_pins[code_object.namespace.to_s])
39
- @namespace_pins[code_object.path] = nspin
40
- result.push nspin
41
- if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
42
- # This method of superclass detection is a bit of a hack. If
43
- # the superclass is a Proxy, it is assumed to be undefined in its
44
- # yardoc and converted to a fully qualified namespace.
45
- superclass = if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
46
- "::#{code_object.superclass}"
47
- else
48
- code_object.superclass.to_s
49
- end
50
- result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin, source: :yard_map)
51
- end
52
- code_object.class_mixins.each do |m|
53
- result.push Solargraph::Pin::Reference::Extend.new(closure: nspin, name: m.path, source: :yard_map)
54
- end
55
- code_object.instance_mixins.each do |m|
56
- result.push Solargraph::Pin::Reference::Include.new(
57
- closure: nspin, # @todo Fix this
58
- name: m.path,
59
- source: :yard_map
60
- )
61
- end
62
- elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
63
- closure = @namespace_pins[code_object.namespace.to_s]
64
- if code_object.name == :initialize && code_object.scope == :instance
65
- # @todo Check the visibility of <Class>.new
66
- result.push ToMethod.make(code_object, 'new', :class, :public, closure, @spec)
67
- result.push ToMethod.make(code_object, 'initialize', :instance, :private, closure, @spec)
68
- else
69
- result.push ToMethod.make(code_object, nil, nil, nil, closure, @spec)
70
- end
71
- elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
72
- closure = @namespace_pins[code_object.namespace]
73
- result.push ToConstant.make(code_object, closure, @spec)
74
- end
75
- result
76
- end
77
- end
78
- end
79
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class YardMap
5
+ class Mapper
6
+ autoload :ToMethod, 'solargraph/yard_map/mapper/to_method'
7
+ autoload :ToNamespace, 'solargraph/yard_map/mapper/to_namespace'
8
+ autoload :ToConstant, 'solargraph/yard_map/mapper/to_constant'
9
+
10
+ # @param code_objects [Array<YARD::CodeObjects::Base>]
11
+ # @param spec [Gem::Specification, nil]
12
+ def initialize code_objects, spec = nil
13
+ @code_objects = code_objects
14
+ @spec = spec
15
+ # @type [Array<Solargraph::Pin::Base>]
16
+ @pins = []
17
+ @namespace_pins = {}
18
+ end
19
+
20
+ # @return [Array<Pin::Base>]
21
+ def map
22
+ @code_objects.each do |co|
23
+ @pins.concat generate_pins co
24
+ end
25
+ # Some yardocs contain documentation for dependencies that can be
26
+ # ignored here. The YardMap will load dependencies separately.
27
+ # @sg-ignore Need to add nil check here
28
+ @pins.keep_if { |pin| pin.location.nil? || File.file?(pin.location.filename) } if @spec
29
+ @pins
30
+ end
31
+
32
+ private
33
+
34
+ # @param code_object [YARD::CodeObjects::Base]
35
+ # @return [Array<Pin::Base>]
36
+ def generate_pins code_object
37
+ result = []
38
+ if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
39
+ nspin = ToNamespace.make(code_object, @spec, @namespace_pins[code_object.namespace.to_s])
40
+ @namespace_pins[code_object.path] = nspin
41
+ result.push nspin
42
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
43
+ if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
44
+ # This method of superclass detection is a bit of a hack. If
45
+ # the superclass is a Proxy, it is assumed to be undefined in its
46
+ # yardoc and converted to a fully qualified namespace.
47
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
48
+ superclass = if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
49
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
50
+ "::#{code_object.superclass}"
51
+ else
52
+ # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
53
+ code_object.superclass.to_s
54
+ end
55
+ result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin, source: :yard_map)
56
+ end
57
+ code_object.class_mixins.each do |m|
58
+ result.push Solargraph::Pin::Reference::Extend.new(closure: nspin, name: m.path, source: :yard_map)
59
+ end
60
+ code_object.instance_mixins.each do |m|
61
+ result.push Solargraph::Pin::Reference::Include.new(
62
+ closure: nspin, # @todo Fix this
63
+ name: m.path,
64
+ source: :yard_map
65
+ )
66
+ end
67
+ elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
68
+ closure = @namespace_pins[code_object.namespace.to_s]
69
+ if code_object.name == :initialize && code_object.scope == :instance
70
+ # @todo Check the visibility of <Class>.new
71
+ result.push ToMethod.make(code_object, 'new', :class, :public, closure, @spec)
72
+ result.push ToMethod.make(code_object, 'initialize', :instance, :private, closure, @spec)
73
+ else
74
+ result.push ToMethod.make(code_object, nil, nil, nil, closure, @spec)
75
+ end
76
+ elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
77
+ closure = @namespace_pins[code_object.namespace]
78
+ result.push ToConstant.make(code_object, closure, @spec)
79
+ end
80
+ result
81
+ end
82
+ end
83
+ end
84
+ end