solargraph 0.58.3 → 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 (201) 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 +41 -38
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +0 -1
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +1 -10
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/lib/solargraph/api_map/cache.rb +3 -3
  13. data/lib/solargraph/api_map/constants.rb +13 -3
  14. data/lib/solargraph/api_map/index.rb +22 -11
  15. data/lib/solargraph/api_map/source_to_yard.rb +13 -1
  16. data/lib/solargraph/api_map/store.rb +11 -8
  17. data/lib/solargraph/api_map.rb +105 -50
  18. data/lib/solargraph/bench.rb +45 -45
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +16 -2
  21. data/lib/solargraph/complex_type/unique_type.rb +170 -20
  22. data/lib/solargraph/complex_type.rb +119 -14
  23. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  24. data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
  25. data/lib/solargraph/convention/data_definition.rb +4 -1
  26. data/lib/solargraph/convention/gemfile.rb +15 -15
  27. data/lib/solargraph/convention/gemspec.rb +23 -23
  28. data/lib/solargraph/convention/rakefile.rb +17 -17
  29. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
  30. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +1 -0
  31. data/lib/solargraph/convention/struct_definition.rb +5 -1
  32. data/lib/solargraph/convention.rb +78 -78
  33. data/lib/solargraph/converters/dd.rb +17 -17
  34. data/lib/solargraph/converters/dl.rb +15 -15
  35. data/lib/solargraph/converters/dt.rb +15 -15
  36. data/lib/solargraph/converters/misc.rb +1 -1
  37. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  38. data/lib/solargraph/diagnostics/rubocop.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  40. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/doc_map.rb +134 -373
  43. data/lib/solargraph/equality.rb +1 -1
  44. data/lib/solargraph/gem_pins.rb +14 -15
  45. data/lib/solargraph/language_server/error_codes.rb +20 -20
  46. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  47. data/lib/solargraph/language_server/host/dispatch.rb +1 -0
  48. data/lib/solargraph/language_server/host/message_worker.rb +2 -1
  49. data/lib/solargraph/language_server/host/sources.rb +1 -0
  50. data/lib/solargraph/language_server/host.rb +6 -1
  51. data/lib/solargraph/language_server/message/base.rb +97 -97
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  54. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -7
  55. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  56. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  57. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  58. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  59. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  60. data/lib/solargraph/language_server/message/text_document/completion.rb +2 -0
  61. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  62. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  63. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
  64. data/lib/solargraph/language_server/message/text_document/formatting.rb +2 -0
  65. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  66. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  67. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  68. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  69. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -0
  70. data/lib/solargraph/language_server/message/text_document/type_definition.rb +2 -0
  71. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  72. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  73. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  74. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
  75. data/lib/solargraph/language_server/message.rb +94 -94
  76. data/lib/solargraph/language_server/request.rb +27 -27
  77. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  78. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  79. data/lib/solargraph/library.rb +59 -13
  80. data/lib/solargraph/location.rb +9 -4
  81. data/lib/solargraph/logging.rb +21 -1
  82. data/lib/solargraph/page.rb +92 -92
  83. data/lib/solargraph/parser/comment_ripper.rb +7 -0
  84. data/lib/solargraph/parser/flow_sensitive_typing.rb +330 -102
  85. data/lib/solargraph/parser/node_processor/base.rb +32 -2
  86. data/lib/solargraph/parser/node_processor.rb +7 -6
  87. data/lib/solargraph/parser/parser_gem/class_methods.rb +28 -10
  88. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  89. data/lib/solargraph/parser/parser_gem/node_chainer.rb +31 -6
  90. data/lib/solargraph/parser/parser_gem/node_methods.rb +27 -7
  91. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  92. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +2 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -11
  95. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +7 -0
  96. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  97. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  98. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +3 -2
  99. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  101. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +2 -2
  102. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  103. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  104. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +1 -0
  106. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +12 -7
  107. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  108. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  109. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +5 -1
  110. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  111. data/lib/solargraph/parser/parser_gem.rb +12 -12
  112. data/lib/solargraph/parser/region.rb +9 -3
  113. data/lib/solargraph/parser/snippet.rb +1 -1
  114. data/lib/solargraph/parser.rb +23 -23
  115. data/lib/solargraph/pin/base.rb +53 -21
  116. data/lib/solargraph/pin/base_variable.rb +312 -20
  117. data/lib/solargraph/pin/block.rb +26 -4
  118. data/lib/solargraph/pin/breakable.rb +5 -1
  119. data/lib/solargraph/pin/callable.rb +50 -3
  120. data/lib/solargraph/pin/closure.rb +2 -6
  121. data/lib/solargraph/pin/common.rb +20 -5
  122. data/lib/solargraph/pin/compound_statement.rb +55 -0
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +2 -1
  125. data/lib/solargraph/pin/delegated_method.rb +15 -4
  126. data/lib/solargraph/pin/documenting.rb +1 -0
  127. data/lib/solargraph/pin/instance_variable.rb +5 -1
  128. data/lib/solargraph/pin/keyword.rb +0 -4
  129. data/lib/solargraph/pin/local_variable.rb +13 -57
  130. data/lib/solargraph/pin/method.rb +90 -42
  131. data/lib/solargraph/pin/method_alias.rb +8 -0
  132. data/lib/solargraph/pin/namespace.rb +7 -1
  133. data/lib/solargraph/pin/parameter.rb +76 -13
  134. data/lib/solargraph/pin/proxy_type.rb +2 -1
  135. data/lib/solargraph/pin/reference/override.rb +1 -1
  136. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  137. data/lib/solargraph/pin/reference.rb +2 -0
  138. data/lib/solargraph/pin/search.rb +1 -0
  139. data/lib/solargraph/pin/signature.rb +8 -0
  140. data/lib/solargraph/pin/symbol.rb +1 -1
  141. data/lib/solargraph/pin/until.rb +1 -1
  142. data/lib/solargraph/pin/while.rb +1 -1
  143. data/lib/solargraph/pin.rb +2 -0
  144. data/lib/solargraph/pin_cache.rb +477 -57
  145. data/lib/solargraph/position.rb +12 -26
  146. data/lib/solargraph/range.rb +6 -6
  147. data/lib/solargraph/rbs_map/conversions.rb +33 -10
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -84
  149. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +34 -5
  151. data/lib/solargraph/rbs_map.rb +74 -20
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +73 -39
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +52 -17
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +2 -0
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +1 -0
  160. data/lib/solargraph/source/chain/if.rb +1 -0
  161. data/lib/solargraph/source/chain/instance_variable.rb +22 -1
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +5 -0
  164. data/lib/solargraph/source/chain/or.rb +9 -1
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +25 -22
  169. data/lib/solargraph/source/change.rb +9 -2
  170. data/lib/solargraph/source/cursor.rb +7 -1
  171. data/lib/solargraph/source/source_chainer.rb +13 -3
  172. data/lib/solargraph/source/updater.rb +4 -0
  173. data/lib/solargraph/source.rb +33 -7
  174. data/lib/solargraph/source_map/clip.rb +13 -2
  175. data/lib/solargraph/source_map/data.rb +4 -1
  176. data/lib/solargraph/source_map/mapper.rb +24 -1
  177. data/lib/solargraph/source_map.rb +14 -6
  178. data/lib/solargraph/type_checker/problem.rb +3 -1
  179. data/lib/solargraph/type_checker/rules.rb +75 -2
  180. data/lib/solargraph/type_checker.rb +111 -30
  181. data/lib/solargraph/version.rb +1 -1
  182. data/lib/solargraph/workspace/config.rb +3 -1
  183. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  184. data/lib/solargraph/workspace/require_paths.rb +1 -0
  185. data/lib/solargraph/workspace.rb +158 -16
  186. data/lib/solargraph/yard_map/helpers.rb +2 -1
  187. data/lib/solargraph/yard_map/mapper/to_method.rb +5 -1
  188. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  189. data/lib/solargraph/yard_map/mapper.rb +5 -0
  190. data/lib/solargraph/yard_tags.rb +20 -20
  191. data/lib/solargraph/yardoc.rb +33 -23
  192. data/lib/solargraph.rb +24 -3
  193. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  194. data/rbs/fills/tuple/tuple.rbs +28 -0
  195. data/rbs/shims/ast/0/node.rbs +1 -1
  196. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  197. data/solargraph.gemspec +2 -1
  198. metadata +12 -7
  199. data/lib/solargraph/type_checker/checks.rb +0 -124
  200. data/lib/solargraph/type_checker/param_def.rb +0 -37
  201. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -66,7 +66,7 @@ module Solargraph
66
66
  end.compact
67
67
  end
68
68
 
69
- # @return [Parser::AST::Node]
69
+ # @return [Parser::AST::Node, nil]
70
70
  def body_node
71
71
  node.children[2]
72
72
  end
@@ -81,8 +81,10 @@ module Solargraph
81
81
  node.children[1]
82
82
  end
83
83
 
84
+ # @sg-ignore Need to add nil check here
84
85
  # @return [Array<Parser::AST::Node>]
85
86
  def data_attribute_nodes
87
+ # @sg-ignore Need to add nil check here
86
88
  data_node.children[2..-1]
87
89
  end
88
90
  end
@@ -17,6 +17,7 @@ module Solargraph
17
17
  type: :class,
18
18
  location: loc,
19
19
  closure: region.closure,
20
+ # @sg-ignore flow sensitive typing needs to handle attrs
20
21
  name: data_definition_node.class_name,
21
22
  comments: comments_for(node),
22
23
  visibility: :public,
@@ -39,6 +40,7 @@ module Solargraph
39
40
  # Solargraph::SourceMap::Clip#complete_keyword_parameters does not seem to currently take into account [Pin::Method#signatures] hence we only one for :kwarg
40
41
  pins.push initialize_method_pin
41
42
 
43
+ # @sg-ignore flow sensitive typing needs to handle attrs
42
44
  data_definition_node.attributes.map do |attribute_node, attribute_name|
43
45
  initialize_method_pin.parameters.push(
44
46
  Pin::Parameter.new(
@@ -51,6 +53,7 @@ module Solargraph
51
53
  end
52
54
 
53
55
  # define attribute readers and instance variables
56
+ # @sg-ignore flow sensitive typing needs to handle attrs
54
57
  data_definition_node.attributes.each do |attribute_node, attribute_name|
55
58
  name = attribute_name.to_s
56
59
  method_pin = Pin::Method.new(
@@ -78,7 +81,7 @@ module Solargraph
78
81
 
79
82
  private
80
83
 
81
- # @return [DataDefintionNode, nil]
84
+ # @return [DataDefinition::DataDefintionNode, DataDefinition::DataAssignmentNode, nil]
82
85
  def data_definition_node
83
86
  @data_definition_node ||= if DataDefintionNode.match?(node)
84
87
  DataDefintionNode.new(node)
@@ -1,15 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Gemfile < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
8
- @environ ||= Environ.new(
9
- requires: ['bundler'],
10
- domains: ['Bundler::Dsl']
11
- )
12
- end
13
- end
14
- end
15
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemfile < Base
6
+ def local source_map
7
+ return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
8
+ @environ ||= Environ.new(
9
+ requires: ['bundler'],
10
+ domains: ['Bundler::Dsl']
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,23 +1,23 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Gemspec < Base
6
- def local source_map
7
- return Convention::Base::EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
8
- @environ ||= Environ.new(
9
- requires: ['rubygems'],
10
- pins: [
11
- Solargraph::Pin::Reference::Override.from_comment(
12
- 'Gem::Specification.new',
13
- %(
14
- @yieldparam [self]
15
- ),
16
- source: :gemspec
17
- )
18
- ]
19
- )
20
- end
21
- end
22
- end
23
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemspec < Base
6
+ def local source_map
7
+ return Convention::Base::EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
8
+ @environ ||= Environ.new(
9
+ requires: ['rubygems'],
10
+ pins: [
11
+ Solargraph::Pin::Reference::Override.from_comment(
12
+ 'Gem::Specification.new',
13
+ %(
14
+ @yieldparam [self]
15
+ ),
16
+ source: :gemspec
17
+ )
18
+ ]
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,17 +1,17 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Rakefile < Base
6
- def local source_map
7
- basename = File.basename(source_map.filename)
8
- return EMPTY_ENVIRON unless basename.end_with?('.rake') || basename == 'Rakefile'
9
-
10
- @environ ||= Environ.new(
11
- requires: ['rake'],
12
- domains: ['Rake::DSL']
13
- )
14
- end
15
- end
16
- end
17
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Rakefile < Base
6
+ def local source_map
7
+ basename = File.basename(source_map.filename)
8
+ return EMPTY_ENVIRON unless basename.end_with?('.rake') || basename == 'Rakefile'
9
+
10
+ @environ ||= Environ.new(
11
+ requires: ['rake'],
12
+ domains: ['Rake::DSL']
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
@@ -22,6 +22,7 @@ module Solargraph
22
22
  # s(:def, :foo,
23
23
  # s(:args),
24
24
  # s(:send, nil, :bar))))
25
+ #
25
26
  # @param node [Parser::AST::Node]
26
27
  def match?(node)
27
28
  return false unless node&.type == :casgn
@@ -92,6 +92,7 @@ module Solargraph
92
92
  node.children[1]
93
93
  end
94
94
 
95
+ # @sg-ignore Need to add nil check here
95
96
  # @return [Array<Parser::AST::Node>]
96
97
  def struct_attribute_nodes
97
98
  struct_node.children[2..-1]
@@ -17,6 +17,7 @@ module Solargraph
17
17
  type: :class,
18
18
  location: loc,
19
19
  closure: region.closure,
20
+ # @sg-ignore flow sensitive typing needs to handle attrs
20
21
  name: struct_definition_node.class_name,
21
22
  docstring: docstring,
22
23
  visibility: :public,
@@ -39,6 +40,7 @@ module Solargraph
39
40
 
40
41
  pins.push initialize_method_pin
41
42
 
43
+ # @sg-ignore flow sensitive typing needs to handle attrs
42
44
  struct_definition_node.attributes.map do |attribute_node, attribute_name|
43
45
  initialize_method_pin.parameters.push(
44
46
  Pin::Parameter.new(
@@ -52,6 +54,7 @@ module Solargraph
52
54
  end
53
55
 
54
56
  # define attribute accessors and instance variables
57
+ # @sg-ignore flow sensitive typing needs to handle attrs
55
58
  struct_definition_node.attributes.each do |attribute_node, attribute_name|
56
59
  [attribute_name, "#{attribute_name}="].each do |name|
57
60
  docs = docstring.tags.find { |t| t.tag_name == 'param' && t.name == attribute_name }
@@ -102,7 +105,7 @@ module Solargraph
102
105
 
103
106
  private
104
107
 
105
- # @return [StructDefintionNode, StructAssignmentNode, nil]
108
+ # @return [StructDefinition::StructDefintionNode, StructDefinition::StructAssignmentNode, nil]
106
109
  def struct_definition_node
107
110
  @struct_definition_node ||= if StructDefintionNode.match?(node)
108
111
  StructDefintionNode.new(node)
@@ -121,6 +124,7 @@ module Solargraph
121
124
  # @return [YARD::Docstring]
122
125
  def parse_comments
123
126
  struct_comments = comments_for(node) || ''
127
+ # @sg-ignore Need to add nil check here
124
128
  struct_definition_node.attributes.each do |attr_node, attr_name|
125
129
  comment = comments_for(attr_node)
126
130
  next if comment.nil?
@@ -1,78 +1,78 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # Conventions provide a way to modify an ApiMap based on expectations about
5
- # one of its sources.
6
- #
7
- module Convention
8
- autoload :Base, 'solargraph/convention/base'
9
- autoload :Gemfile, 'solargraph/convention/gemfile'
10
- autoload :Gemspec, 'solargraph/convention/gemspec'
11
- autoload :Rakefile, 'solargraph/convention/rakefile'
12
- autoload :StructDefinition, 'solargraph/convention/struct_definition'
13
- autoload :DataDefinition, 'solargraph/convention/data_definition'
14
- autoload :ActiveSupportConcern, 'solargraph/convention/active_support_concern'
15
-
16
- # @type [Set<Convention::Base>]
17
- @@conventions = Set.new
18
-
19
- # @param convention [Class<Convention::Base>]
20
- # @return [void]
21
- def self.register convention
22
- @@conventions.add convention.new
23
- end
24
-
25
- # @param convention [Class<Convention::Base>]
26
- # @return [void]
27
- def self.unregister convention
28
- @@conventions.delete_if { |c| c.is_a?(convention) }
29
- end
30
-
31
- # @param source_map [SourceMap]
32
- # @return [Environ]
33
- def self.for_local(source_map)
34
- result = Environ.new
35
- @@conventions.each do |conv|
36
- result.merge conv.local(source_map)
37
- end
38
- result
39
- end
40
-
41
- # @param doc_map [DocMap]
42
- # @return [Environ]
43
- def self.for_global(doc_map)
44
- result = Environ.new
45
- @@conventions.each do |conv|
46
- result.merge conv.global(doc_map)
47
- end
48
- result
49
- end
50
-
51
- # Provides any additional method pins based on the described object.
52
- #
53
- # @param api_map [ApiMap]
54
- # @param rooted_tag [String] A fully qualified namespace, with
55
- # generic parameter values if applicable
56
- # @param scope [Symbol] :class or :instance
57
- # @param visibility [Array<Symbol>] :public, :protected, and/or :private
58
- # @param deep [Boolean]
59
- # @param skip [Set<String>]
60
- # @param no_core [Boolean] Skip core classes if true
61
- #
62
- # @return [Environ]
63
- def self.for_object api_map, rooted_tag, scope, visibility,
64
- deep, skip, no_core
65
- result = Environ.new
66
- @@conventions.each do |conv|
67
- result.merge conv.object(api_map, rooted_tag, scope, visibility,
68
- deep, skip, no_core)
69
- end
70
- result
71
- end
72
-
73
- register Gemfile
74
- register Gemspec
75
- register Rakefile
76
- register ActiveSupportConcern
77
- end
78
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # Conventions provide a way to modify an ApiMap based on expectations about
5
+ # one of its sources.
6
+ #
7
+ module Convention
8
+ autoload :Base, 'solargraph/convention/base'
9
+ autoload :Gemfile, 'solargraph/convention/gemfile'
10
+ autoload :Gemspec, 'solargraph/convention/gemspec'
11
+ autoload :Rakefile, 'solargraph/convention/rakefile'
12
+ autoload :StructDefinition, 'solargraph/convention/struct_definition'
13
+ autoload :DataDefinition, 'solargraph/convention/data_definition'
14
+ autoload :ActiveSupportConcern, 'solargraph/convention/active_support_concern'
15
+
16
+ # @type [Set<Convention::Base>]
17
+ @@conventions = Set.new
18
+
19
+ # @param convention [Class<Convention::Base>]
20
+ # @return [void]
21
+ def self.register convention
22
+ @@conventions.add convention.new
23
+ end
24
+
25
+ # @param convention [Class<Convention::Base>]
26
+ # @return [void]
27
+ def self.unregister convention
28
+ @@conventions.delete_if { |c| c.is_a?(convention) }
29
+ end
30
+
31
+ # @param source_map [SourceMap]
32
+ # @return [Environ]
33
+ def self.for_local(source_map)
34
+ result = Environ.new
35
+ @@conventions.each do |conv|
36
+ result.merge conv.local(source_map)
37
+ end
38
+ result
39
+ end
40
+
41
+ # @param doc_map [DocMap]
42
+ # @return [Environ]
43
+ def self.for_global(doc_map)
44
+ result = Environ.new
45
+ @@conventions.each do |conv|
46
+ result.merge conv.global(doc_map)
47
+ end
48
+ result
49
+ end
50
+
51
+ # Provides any additional method pins based on the described object.
52
+ #
53
+ # @param api_map [ApiMap]
54
+ # @param rooted_tag [String] A fully qualified namespace, with
55
+ # generic parameter values if applicable
56
+ # @param scope [Symbol] :class or :instance
57
+ # @param visibility [Array<Symbol>] :public, :protected, and/or :private
58
+ # @param deep [Boolean]
59
+ # @param skip [Set<String>]
60
+ # @param no_core [Boolean] Skip core classes if true
61
+ #
62
+ # @return [Environ]
63
+ def self.for_object api_map, rooted_tag, scope, visibility,
64
+ deep, skip, no_core
65
+ result = Environ.new
66
+ @@conventions.each do |conv|
67
+ result.merge conv.object(api_map, rooted_tag, scope, visibility,
68
+ deep, skip, no_core)
69
+ end
70
+ result
71
+ end
72
+
73
+ register Gemfile
74
+ register Gemspec
75
+ register Rakefile
76
+ register ActiveSupportConcern
77
+ end
78
+ end
@@ -1,17 +1,17 @@
1
- require 'nokogiri'
2
-
3
- module ReverseMarkdown
4
- module Converters
5
- class Dd < Base
6
- # @return [String]
7
- # @param node [Nokogiri::XML::Element]
8
- # @param state [Hash]
9
- def convert node, state = {}
10
- content = treat_children(node, state)
11
- ": #{content.strip}\n"
12
- end
13
- end
14
- end
15
- end
16
-
17
- ReverseMarkdown::Converters.register :dd, ReverseMarkdown::Converters::Dd.new
1
+ require 'nokogiri'
2
+
3
+ module ReverseMarkdown
4
+ module Converters
5
+ class Dd < Base
6
+ # @return [String]
7
+ # @param node [Nokogiri::XML::Element]
8
+ # @param state [Hash]
9
+ def convert node, state = {}
10
+ content = treat_children(node, state)
11
+ ": #{content.strip}\n"
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ ReverseMarkdown::Converters.register :dd, ReverseMarkdown::Converters::Dd.new
@@ -1,15 +1,15 @@
1
- module ReverseMarkdown
2
- module Converters
3
- class Dl < Base
4
- # @return [String]
5
- # @param node [Nokogiri::XML::Element]
6
- # @param state [Hash]
7
- def convert node, state = {}
8
- content = treat_children(node, state).strip
9
- "\n\n#{content}\n"
10
- end
11
- end
12
- end
13
- end
14
-
15
- ReverseMarkdown::Converters.register :dl, ReverseMarkdown::Converters::Dl.new
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Dl < Base
4
+ # @return [String]
5
+ # @param node [Nokogiri::XML::Element]
6
+ # @param state [Hash]
7
+ def convert node, state = {}
8
+ content = treat_children(node, state).strip
9
+ "\n\n#{content}\n"
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ ReverseMarkdown::Converters.register :dl, ReverseMarkdown::Converters::Dl.new
@@ -1,15 +1,15 @@
1
- module ReverseMarkdown
2
- module Converters
3
- class Dt < Base
4
- # @return [String]
5
- # @param node [Nokogiri::XML::Element]
6
- # @param state [Hash]
7
- def convert node, state = {}
8
- content = treat_children(node, state)
9
- "\n#{content.strip}\n"
10
- end
11
- end
12
- end
13
- end
14
-
15
- ReverseMarkdown::Converters.register :dt, ReverseMarkdown::Converters::Dt.new
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Dt < Base
4
+ # @return [String]
5
+ # @param node [Nokogiri::XML::Element]
6
+ # @param state [Hash]
7
+ def convert node, state = {}
8
+ content = treat_children(node, state)
9
+ "\n#{content.strip}\n"
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ ReverseMarkdown::Converters.register :dt, ReverseMarkdown::Converters::Dt.new
@@ -1 +1 @@
1
- ReverseMarkdown::Converters.register :tt, ReverseMarkdown::Converters::Code.new
1
+ ReverseMarkdown::Converters.register :tt, ReverseMarkdown::Converters::Code.new
@@ -10,6 +10,7 @@ module Solargraph
10
10
  return [] unless source.parsed? && source.synchronized?
11
11
  result = []
12
12
  refs = {}
13
+ # @sg-ignore Need to add nil check here
13
14
  map = api_map.source_map(source.filename)
14
15
  map.requires.each { |ref| refs[ref.name] = ref }
15
16
  api_map.missing_docs.each do |r|
@@ -25,6 +25,7 @@ module Solargraph
25
25
  def diagnose source, _api_map
26
26
  @source = source
27
27
  require_rubocop(rubocop_version)
28
+ # @sg-ignore Need to add nil check here
28
29
  options, paths = generate_options(source.filename, source.code)
29
30
  store = RuboCop::ConfigStore.new
30
31
  runner = RuboCop::Runner.new(options, store)
@@ -18,6 +18,7 @@ module Solargraph
18
18
  # @type [String]
19
19
  gem_path = Gem::Specification.find_by_name('rubocop', version).full_gem_path
20
20
  gem_lib_path = File.join(gem_path, 'lib')
21
+ # @sg-ignore Should better support meaning of '&' in RBS
21
22
  $LOAD_PATH.unshift(gem_lib_path) unless $LOAD_PATH.include?(gem_lib_path)
22
23
  rescue Gem::MissingSpecVersionError => e
23
24
  # @type [Array<Gem::Specification>]
@@ -50,6 +51,7 @@ module Solargraph
50
51
  # @return [String]
51
52
  def fix_drive_letter path
52
53
  return path unless path.match(/^[a-z]:/)
54
+ # @sg-ignore Need to add nil check here
53
55
  path[0].upcase + path[1..-1]
54
56
  end
55
57
 
@@ -11,6 +11,7 @@ module Solargraph
11
11
  # return [] unless args.include?('always') || api_map.workspaced?(source.filename)
12
12
  severity = Diagnostics::Severities::ERROR
13
13
  level = (args.reverse.find { |a| ['normal', 'typed', 'strict', 'strong'].include?(a) }) || :normal
14
+ # @sg-ignore sensitive typing needs to handle || on nil types
14
15
  checker = Solargraph::TypeChecker.new(source.filename, api_map: api_map, level: level.to_sym)
15
16
  checker.problems
16
17
  .sort { |a, b| a.location.range.start.line <=> b.location.range.start.line }
@@ -1,41 +1,41 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Diagnostics
5
- class UpdateErrors < Base
6
- def diagnose source, api_map
7
- result = []
8
- combine_ranges(source.code, source.error_ranges).each do |range|
9
- result.push(
10
- range: range.to_hash,
11
- severity: Diagnostics::Severities::ERROR,
12
- source: 'Solargraph',
13
- message: 'Syntax error'
14
- )
15
- end
16
- result
17
- end
18
-
19
- private
20
-
21
- # Combine an array of ranges by their starting lines.
22
- #
23
- # @param code [String]
24
- # @param ranges [Array<Range>]
25
- # @return [Array<Range>]
26
- def combine_ranges code, ranges
27
- result = []
28
- lines = []
29
- ranges.sort{|a, b| a.start.line <=> b.start.line}.each do |rng|
30
- next if rng.nil? || lines.include?(rng.start.line)
31
- lines.push rng.start.line
32
- next if rng.start.line >= code.lines.length
33
- scol = code.lines[rng.start.line].index(/[^\s]/) || 0
34
- ecol = code.lines[rng.start.line].length
35
- result.push Range.from_to(rng.start.line, scol, rng.start.line, ecol)
36
- end
37
- result
38
- end
39
- end
40
- end
41
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Diagnostics
5
+ class UpdateErrors < Base
6
+ def diagnose source, api_map
7
+ result = []
8
+ combine_ranges(source.code, source.error_ranges).each do |range|
9
+ result.push(
10
+ range: range.to_hash,
11
+ severity: Diagnostics::Severities::ERROR,
12
+ source: 'Solargraph',
13
+ message: 'Syntax error'
14
+ )
15
+ end
16
+ result
17
+ end
18
+
19
+ private
20
+
21
+ # Combine an array of ranges by their starting lines.
22
+ #
23
+ # @param code [String]
24
+ # @param ranges [Array<Range>]
25
+ # @return [Array<Range>]
26
+ def combine_ranges code, ranges
27
+ result = []
28
+ lines = []
29
+ ranges.sort{|a, b| a.start.line <=> b.start.line}.each do |rng|
30
+ next if rng.nil? || lines.include?(rng.start.line)
31
+ lines.push rng.start.line
32
+ next if rng.start.line >= code.lines.length
33
+ scol = code.lines[rng.start.line].index(/[^\s]/) || 0
34
+ ecol = code.lines[rng.start.line].length
35
+ result.push Range.from_to(rng.start.line, scol, rng.start.line, ecol)
36
+ end
37
+ result
38
+ end
39
+ end
40
+ end
41
+ end