solargraph 0.54.4 → 0.56.2

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +2 -0
  3. data/.github/workflows/typecheck.yml +3 -1
  4. data/.gitignore +2 -0
  5. data/CHANGELOG.md +62 -0
  6. data/README.md +13 -3
  7. data/lib/solargraph/api_map/index.rb +24 -16
  8. data/lib/solargraph/api_map/store.rb +48 -23
  9. data/lib/solargraph/api_map.rb +175 -77
  10. data/lib/solargraph/bench.rb +17 -1
  11. data/lib/solargraph/complex_type/type_methods.rb +6 -1
  12. data/lib/solargraph/complex_type/unique_type.rb +98 -9
  13. data/lib/solargraph/complex_type.rb +35 -6
  14. data/lib/solargraph/convention/base.rb +3 -3
  15. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +60 -0
  16. data/lib/solargraph/convention/data_definition/data_definition_node.rb +89 -0
  17. data/lib/solargraph/convention/data_definition.rb +104 -0
  18. data/lib/solargraph/convention/gemspec.rb +2 -1
  19. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +60 -0
  20. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  21. data/lib/solargraph/convention/struct_definition.rb +141 -0
  22. data/lib/solargraph/convention.rb +5 -3
  23. data/lib/solargraph/doc_map.rb +277 -57
  24. data/lib/solargraph/gem_pins.rb +53 -37
  25. data/lib/solargraph/language_server/host/message_worker.rb +10 -7
  26. data/lib/solargraph/language_server/host.rb +12 -2
  27. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
  28. data/lib/solargraph/language_server/message/extended/document.rb +5 -2
  29. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  30. data/lib/solargraph/library.rb +45 -17
  31. data/lib/solargraph/location.rb +21 -0
  32. data/lib/solargraph/logging.rb +1 -0
  33. data/lib/solargraph/parser/comment_ripper.rb +12 -6
  34. data/lib/solargraph/parser/flow_sensitive_typing.rb +227 -0
  35. data/lib/solargraph/parser/node_methods.rb +14 -0
  36. data/lib/solargraph/parser/node_processor/base.rb +9 -4
  37. data/lib/solargraph/parser/node_processor.rb +21 -8
  38. data/lib/solargraph/parser/parser_gem/class_methods.rb +16 -14
  39. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  40. data/lib/solargraph/parser/parser_gem/node_methods.rb +4 -2
  41. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  42. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  43. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +4 -2
  44. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +4 -2
  45. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  46. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  47. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
  48. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  49. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  50. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  51. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
  52. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
  53. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +4 -1
  54. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  55. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +42 -0
  56. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
  57. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
  58. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -3
  59. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +28 -16
  60. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  61. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  62. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  63. data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
  64. data/lib/solargraph/parser/region.rb +1 -1
  65. data/lib/solargraph/parser.rb +1 -0
  66. data/lib/solargraph/pin/base.rb +316 -28
  67. data/lib/solargraph/pin/base_variable.rb +16 -9
  68. data/lib/solargraph/pin/block.rb +2 -0
  69. data/lib/solargraph/pin/breakable.rb +9 -0
  70. data/lib/solargraph/pin/callable.rb +74 -3
  71. data/lib/solargraph/pin/closure.rb +18 -1
  72. data/lib/solargraph/pin/common.rb +5 -0
  73. data/lib/solargraph/pin/delegated_method.rb +20 -1
  74. data/lib/solargraph/pin/documenting.rb +16 -0
  75. data/lib/solargraph/pin/keyword.rb +7 -2
  76. data/lib/solargraph/pin/local_variable.rb +15 -6
  77. data/lib/solargraph/pin/method.rb +169 -43
  78. data/lib/solargraph/pin/namespace.rb +17 -9
  79. data/lib/solargraph/pin/parameter.rb +60 -11
  80. data/lib/solargraph/pin/proxy_type.rb +12 -6
  81. data/lib/solargraph/pin/reference/override.rb +10 -6
  82. data/lib/solargraph/pin/reference/require.rb +2 -2
  83. data/lib/solargraph/pin/signature.rb +42 -0
  84. data/lib/solargraph/pin/singleton.rb +1 -1
  85. data/lib/solargraph/pin/symbol.rb +3 -2
  86. data/lib/solargraph/pin/until.rb +18 -0
  87. data/lib/solargraph/pin/while.rb +18 -0
  88. data/lib/solargraph/pin.rb +4 -1
  89. data/lib/solargraph/pin_cache.rb +185 -0
  90. data/lib/solargraph/position.rb +9 -0
  91. data/lib/solargraph/range.rb +9 -0
  92. data/lib/solargraph/rbs_map/conversions.rb +221 -67
  93. data/lib/solargraph/rbs_map/core_fills.rb +32 -16
  94. data/lib/solargraph/rbs_map/core_map.rb +34 -11
  95. data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
  96. data/lib/solargraph/rbs_map.rb +74 -17
  97. data/lib/solargraph/shell.rb +17 -18
  98. data/lib/solargraph/source/chain/array.rb +11 -7
  99. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  100. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  101. data/lib/solargraph/source/chain/call.rb +53 -23
  102. data/lib/solargraph/source/chain/constant.rb +1 -1
  103. data/lib/solargraph/source/chain/hash.rb +4 -3
  104. data/lib/solargraph/source/chain/head.rb +1 -1
  105. data/lib/solargraph/source/chain/if.rb +1 -1
  106. data/lib/solargraph/source/chain/link.rb +2 -0
  107. data/lib/solargraph/source/chain/literal.rb +22 -2
  108. data/lib/solargraph/source/chain/or.rb +1 -1
  109. data/lib/solargraph/source/chain/z_super.rb +1 -1
  110. data/lib/solargraph/source/chain.rb +78 -48
  111. data/lib/solargraph/source/source_chainer.rb +2 -2
  112. data/lib/solargraph/source_map/clip.rb +3 -1
  113. data/lib/solargraph/source_map/mapper.rb +9 -5
  114. data/lib/solargraph/source_map.rb +0 -17
  115. data/lib/solargraph/type_checker/checks.rb +4 -0
  116. data/lib/solargraph/type_checker.rb +35 -8
  117. data/lib/solargraph/version.rb +1 -1
  118. data/lib/solargraph/views/_method.erb +10 -10
  119. data/lib/solargraph/views/_namespace.erb +3 -3
  120. data/lib/solargraph/views/document.erb +10 -10
  121. data/lib/solargraph/workspace/config.rb +1 -1
  122. data/lib/solargraph/workspace.rb +23 -5
  123. data/lib/solargraph/yard_map/helpers.rb +29 -1
  124. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  125. data/lib/solargraph/yard_map/mapper/to_method.rb +53 -18
  126. data/lib/solargraph/yard_map/mapper/to_namespace.rb +9 -7
  127. data/lib/solargraph/yard_map/mapper.rb +4 -3
  128. data/lib/solargraph/yard_map/to_method.rb +4 -2
  129. data/lib/solargraph/yardoc.rb +7 -8
  130. data/lib/solargraph.rb +32 -1
  131. data/rbs/fills/tuple.rbs +150 -0
  132. data/rbs_collection.yaml +19 -0
  133. data/solargraph.gemspec +2 -1
  134. metadata +37 -9
  135. data/lib/solargraph/cache.rb +0 -77
@@ -12,7 +12,8 @@ module Solargraph
12
12
  closure: region.closure,
13
13
  name: node.children[0].children[0].to_s,
14
14
  original: node.children[1].children[0].to_s,
15
- scope: region.scope || :instance
15
+ scope: region.scope || :instance,
16
+ source: :parser
16
17
  )
17
18
  process_children
18
19
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class AndNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ process_children
12
+
13
+ position = get_node_start_position(node)
14
+ enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
15
+ FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_and(node)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -21,7 +21,8 @@ module Solargraph
21
21
  assignment: u.children[1],
22
22
  asgn_code: u.children[1] ? region.code_for(u.children[1]) : nil,
23
23
  presence: callable.location.range,
24
- decl: get_decl(u)
24
+ decl: get_decl(u),
25
+ source: :parser
25
26
  )
26
27
  callable.parameters.push locals.last
27
28
  end
@@ -40,7 +41,8 @@ module Solargraph
40
41
  location: loc,
41
42
  closure: callable,
42
43
  presence: region.closure.location.range,
43
- decl: get_decl(node)
44
+ decl: get_decl(node),
45
+ source: :parser
44
46
  )
45
47
  callable.parameters.push locals.last
46
48
  end
@@ -13,7 +13,8 @@ module Solargraph
13
13
  Solargraph::Pin::Namespace.new(
14
14
  location: location,
15
15
  type: :class,
16
- name: unpack_name(node.children[0].children[0])
16
+ name: unpack_name(node.children[0].children[0]),
17
+ source: :parser,
17
18
  )
18
19
  else
19
20
  region.closure
@@ -24,7 +25,8 @@ module Solargraph
24
25
  node: node,
25
26
  receiver: node.children[0],
26
27
  comments: comments_for(node),
27
- scope: region.scope || region.closure.context.scope
28
+ scope: region.scope || region.closure.context.scope,
29
+ source: :parser
28
30
  )
29
31
  process_children region.update(closure: pins.last)
30
32
  end
@@ -13,7 +13,8 @@ module Solargraph
13
13
  closure: region.closure,
14
14
  name: const_name,
15
15
  comments: comments_for(node),
16
- assignment: node.children[2]
16
+ assignment: node.children[2],
17
+ source: :parser
17
18
  )
18
19
  process_children
19
20
  end
@@ -12,7 +12,8 @@ module Solargraph
12
12
  closure: region.closure,
13
13
  name: node.children[0].to_s,
14
14
  comments: comments_for(node),
15
- assignment: node.children[1]
15
+ assignment: node.children[1],
16
+ source: :parser
16
17
  )
17
18
  process_children
18
19
  end
@@ -15,7 +15,8 @@ module Solargraph
15
15
  comments: comments_for(node),
16
16
  scope: scope,
17
17
  visibility: scope == :instance && name == 'initialize' ? :private : region.visibility,
18
- node: node
18
+ node: node,
19
+ source: :parser,
19
20
  )
20
21
  if region.visibility == :module_function
21
22
  pins.push Solargraph::Pin::Method.new(
@@ -26,7 +27,8 @@ module Solargraph
26
27
  scope: :class,
27
28
  visibility: :public,
28
29
  parameters: methpin.parameters,
29
- node: methpin.node
30
+ node: methpin.node,
31
+ source: :parser,
30
32
  )
31
33
  pins.push Solargraph::Pin::Method.new(
32
34
  location: methpin.location,
@@ -36,7 +38,8 @@ module Solargraph
36
38
  scope: :instance,
37
39
  visibility: :private,
38
40
  parameters: methpin.parameters,
39
- node: methpin.node
41
+ node: methpin.node,
42
+ source: :parser,
40
43
  )
41
44
  else
42
45
  pins.push methpin
@@ -25,7 +25,8 @@ module Solargraph
25
25
  comments: comments_for(node),
26
26
  scope: :class,
27
27
  visibility: s_visi,
28
- node: node
28
+ node: node,
29
+ source: :parser,
29
30
  )
30
31
  process_children region.update(closure: pins.last, scope: :class)
31
32
  end
@@ -12,7 +12,8 @@ module Solargraph
12
12
  closure: region.closure,
13
13
  name: node.children[0].to_s,
14
14
  comments: comments_for(node),
15
- assignment: node.children[1]
15
+ assignment: node.children[1],
16
+ source: :parser
16
17
  )
17
18
  process_children
18
19
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class IfNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ process_children
12
+
13
+ position = get_node_start_position(node)
14
+ enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
15
+ FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_if(node)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -14,7 +14,8 @@ module Solargraph
14
14
  closure: region.closure,
15
15
  name: node.children[0].to_s,
16
16
  comments: comments_for(node),
17
- assignment: node.children[1]
17
+ assignment: node.children[1],
18
+ source: :parser
18
19
  )
19
20
  if region.visibility == :module_function
20
21
  here = get_node_start_position(node)
@@ -25,7 +26,8 @@ module Solargraph
25
26
  closure: Pin::Namespace.new(type: :module, closure: region.closure.closure, name: region.closure.name),
26
27
  name: node.children[0].to_s,
27
28
  comments: comments_for(node),
28
- assignment: node.children[1]
29
+ assignment: node.children[1],
30
+ source: :parser
29
31
  )
30
32
  end
31
33
  end
@@ -17,7 +17,8 @@ module Solargraph
17
17
  name: node.children[0].to_s,
18
18
  assignment: node.children[1],
19
19
  comments: comments_for(node),
20
- presence: presence
20
+ presence: presence,
21
+ source: :parser
21
22
  )
22
23
  process_children
23
24
  end
@@ -7,6 +7,7 @@ module Solargraph
7
7
  class MasgnNode < Parser::NodeProcessor::Base
8
8
  include ParserGem::NodeMethods
9
9
 
10
+ # @return [void]
10
11
  def process
11
12
  # Example:
12
13
  #
@@ -40,7 +41,9 @@ module Solargraph
40
41
  # @todo in line below, nothing in typechecking alerts
41
42
  # when a non-existant method is called on 'l'
42
43
  if pin.nil?
43
- Solargraph.logger.debug { "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}" }
44
+ Solargraph.logger.debug do
45
+ "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}"
46
+ end
44
47
  next
45
48
  end
46
49
  pin.mass_assignment = [mass_rhs, i]
@@ -8,10 +8,9 @@ module Solargraph
8
8
  include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
- sc = nil
12
- if node.type == :class and !node.children[1].nil?
13
- sc = unpack_name(node.children[1])
14
- end
11
+ superclass_name = nil
12
+ superclass_name = unpack_name(node.children[1]) if node.type == :class && node.children[1]&.type == :const
13
+
15
14
  loc = get_node_location(node)
16
15
  nspin = Solargraph::Pin::Namespace.new(
17
16
  type: node.type,
@@ -20,14 +19,16 @@ module Solargraph
20
19
  name: unpack_name(node.children[0]),
21
20
  comments: comments_for(node),
22
21
  visibility: :public,
23
- gates: region.closure.gates.freeze
22
+ gates: region.closure.gates.freeze,
23
+ source: :parser
24
24
  )
25
25
  pins.push nspin
26
- unless sc.nil?
26
+ unless superclass_name.nil?
27
27
  pins.push Pin::Reference::Superclass.new(
28
28
  location: loc,
29
29
  closure: pins.last,
30
- name: sc
30
+ name: superclass_name,
31
+ source: :parser
31
32
  )
32
33
  end
33
34
  process_children region.update(closure: nspin, visibility: :public)
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parser'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module NodeProcessors
9
+ class OpasgnNode < Parser::NodeProcessor::Base
10
+ # @return [void]
11
+ def process
12
+ # Parser::CurrentRuby.parse("a += 2")
13
+ # => s(:op_asgn,
14
+ # s(:lvasgn, :a), :+,
15
+ # s(:int, 2))
16
+ asgn = node.children[0]
17
+ variable_name = asgn.children[0]
18
+ operator = node.children[1]
19
+ argument = node.children[2]
20
+ # for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
21
+ # [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
22
+ # => s(:lvasgn, :a,
23
+ # s(:send,
24
+ # s(:lvar, :a), :+,
25
+ # s(:int, 1)))
26
+ # [7] pry(main)>
27
+ variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
28
+ variable_reference = node.updated(variable_reference_type, asgn.children)
29
+ send_children = [
30
+ variable_reference,
31
+ operator,
32
+ argument
33
+ ]
34
+ send_node = node.updated(:send, send_children)
35
+ new_asgn = node.updated(asgn.type, [variable_name, send_node])
36
+ NodeProcessor.process(new_asgn, region, pins, locals)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -5,6 +5,7 @@ module Solargraph
5
5
  module ParserGem
6
6
  module NodeProcessors
7
7
  class OrasgnNode < Parser::NodeProcessor::Base
8
+ # @return [void]
8
9
  def process
9
10
  new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
10
11
  NodeProcessor.process(new_node, region, pins, locals)
@@ -7,6 +7,7 @@ module Solargraph
7
7
  class ResbodyNode < Parser::NodeProcessor::Base
8
8
  include ParserGem::NodeMethods
9
9
 
10
+ # @return [void]
10
11
  def process
11
12
  if node.children[1] # Exception local variable name
12
13
  here = get_node_start_position(node.children[1])
@@ -24,7 +25,8 @@ module Solargraph
24
25
  closure: region.closure,
25
26
  name: node.children[1].children[0].to_s,
26
27
  comments: "@type [#{types.join(',')}]",
27
- presence: presence
28
+ presence: presence,
29
+ source: :parser
28
30
  )
29
31
  end
30
32
  NodeProcessor.process(node.children[2], region, pins, locals)
@@ -17,7 +17,7 @@ module Solargraph
17
17
  names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
18
18
  end
19
19
  name = names.reject(&:empty?).join('::')
20
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
20
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
21
21
  elsif sclass.is_a?(AST::Node) && sclass.type == :const
22
22
  names = [region.closure.namespace, region.closure.name]
23
23
  also = NodeMethods.unpack_name(sclass)
@@ -25,13 +25,14 @@ module Solargraph
25
25
  names << also
26
26
  end
27
27
  name = names.reject(&:empty?).join('::')
28
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
28
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
29
29
  else
30
30
  return
31
31
  end
32
32
  pins.push Solargraph::Pin::Singleton.new(
33
33
  location: get_node_location(node),
34
- closure: closure
34
+ closure: closure,
35
+ source: :parser,
35
36
  )
36
37
  process_children region.update(visibility: :public, scope: :class, closure: pins.last)
37
38
  end
@@ -34,7 +34,7 @@ module Solargraph
34
34
  return if process_private_class_method
35
35
  end
36
36
  elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
37
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
37
+ pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
38
38
  end
39
39
  process_children
40
40
  end
@@ -76,7 +76,8 @@ module Solargraph
76
76
  comments: cmnt,
77
77
  scope: region.scope || :instance,
78
78
  visibility: region.visibility,
79
- attribute: true
79
+ attribute: true,
80
+ source: :parser
80
81
  )
81
82
  end
82
83
  if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
@@ -87,10 +88,11 @@ module Solargraph
87
88
  comments: cmnt,
88
89
  scope: region.scope || :instance,
89
90
  visibility: region.visibility,
90
- attribute: true
91
+ attribute: true,
92
+ source: :parser
91
93
  )
92
94
  pins.push method_pin
93
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
95
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
94
96
  if method_pin.return_type.defined?
95
97
  pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
96
98
  end
@@ -107,7 +109,8 @@ module Solargraph
107
109
  pins.push type.new(
108
110
  location: get_node_location(i),
109
111
  closure: cp,
110
- name: unpack_name(i)
112
+ name: unpack_name(i),
113
+ source: :parser
111
114
  )
112
115
  end
113
116
  end
@@ -121,7 +124,8 @@ module Solargraph
121
124
  pins.push Pin::Reference::Prepend.new(
122
125
  location: get_node_location(i),
123
126
  closure: cp,
124
- name: unpack_name(i)
127
+ name: unpack_name(i),
128
+ source: :parser
125
129
  )
126
130
  end
127
131
  end
@@ -135,13 +139,15 @@ module Solargraph
135
139
  pins.push Pin::Reference::Extend.new(
136
140
  location: loc,
137
141
  closure: region.closure,
138
- name: region.closure.full_context.namespace
142
+ name: region.closure.full_context.namespace,
143
+ source: :parser
139
144
  )
140
145
  else
141
146
  pins.push Pin::Reference::Extend.new(
142
147
  location: loc,
143
148
  closure: region.closure,
144
- name: unpack_name(i)
149
+ name: unpack_name(i),
150
+ source: :parser
145
151
  )
146
152
  end
147
153
  end
@@ -151,7 +157,7 @@ module Solargraph
151
157
  def process_require
152
158
  if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
153
159
  path = node.children[2].children[0].to_s
154
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
160
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
155
161
  end
156
162
  end
157
163
 
@@ -159,7 +165,7 @@ module Solargraph
159
165
  def process_autoload
160
166
  if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
161
167
  path = node.children[3].children[0].to_s
162
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
168
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
163
169
  end
164
170
  end
165
171
 
@@ -171,7 +177,8 @@ module Solargraph
171
177
  elsif node.children[2].type == :sym || node.children[2].type == :str
172
178
  node.children[2..-1].each do |x|
173
179
  cn = x.children[0].to_s
174
- ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
180
+ # @type [Pin::Method]
181
+ ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
175
182
  unless ref.nil?
176
183
  pins.delete ref
177
184
  mm = Solargraph::Pin::Method.new(
@@ -182,7 +189,8 @@ module Solargraph
182
189
  comments: ref.comments,
183
190
  scope: :class,
184
191
  visibility: :public,
185
- node: ref.node
192
+ node: ref.node,
193
+ source: :parser
186
194
  )
187
195
  cm = Solargraph::Pin::Method.new(
188
196
  location: ref.location,
@@ -192,7 +200,8 @@ module Solargraph
192
200
  comments: ref.comments,
193
201
  scope: :instance,
194
202
  visibility: :private,
195
- node: ref.node)
203
+ node: ref.node,
204
+ source: :parser)
196
205
  pins.push mm, cm
197
206
  pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
198
207
  pins.delete ivar
@@ -201,14 +210,16 @@ module Solargraph
201
210
  closure: cm,
202
211
  name: ivar.name,
203
212
  comments: ivar.comments,
204
- assignment: ivar.assignment
213
+ assignment: ivar.assignment,
214
+ source: :parser
205
215
  )
206
216
  pins.push Solargraph::Pin::InstanceVariable.new(
207
217
  location: ivar.location,
208
218
  closure: mm,
209
219
  name: ivar.name,
210
220
  comments: ivar.comments,
211
- assignment: ivar.assignment
221
+ assignment: ivar.assignment,
222
+ source: :parser
212
223
  )
213
224
  end
214
225
  end
@@ -236,7 +247,8 @@ module Solargraph
236
247
  closure: region.closure,
237
248
  name: node.children[2].children[0].to_s,
238
249
  original: node.children[3].children[0].to_s,
239
- scope: region.scope || :instance
250
+ scope: region.scope || :instance,
251
+ source: :parser
240
252
  )
241
253
  end
242
254
 
@@ -5,10 +5,12 @@ module Solargraph
5
5
  module ParserGem
6
6
  module NodeProcessors
7
7
  class SymNode < Parser::NodeProcessor::Base
8
+ # @return [void]
8
9
  def process
9
10
  pins.push Solargraph::Pin::Symbol.new(
10
11
  get_node_location(node),
11
- ":#{node.children[0]}"
12
+ ":#{node.children[0]}",
13
+ source: :parser
12
14
  )
13
15
  end
14
16
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class UntilNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # until statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::Until.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class WhileNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # while statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::While.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -13,6 +13,7 @@ module Solargraph
13
13
  autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
14
14
  autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
15
15
  autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
16
+ autoload :IfNode, 'solargraph/parser/parser_gem/node_processors/if_node'
16
17
  autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
17
18
  autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
18
19
  autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
@@ -22,8 +23,12 @@ module Solargraph
22
23
  autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
23
24
  autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
24
25
  autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
26
+ autoload :OpasgnNode, 'solargraph/parser/parser_gem/node_processors/opasgn_node'
25
27
  autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
26
28
  autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
29
+ autoload :UntilNode, 'solargraph/parser/parser_gem/node_processors/until_node'
30
+ autoload :WhileNode, 'solargraph/parser/parser_gem/node_processors/while_node'
31
+ autoload :AndNode, 'solargraph/parser/parser_gem/node_processors/and_node'
27
32
  end
28
33
  end
29
34
 
@@ -35,7 +40,10 @@ module Solargraph
35
40
  register :resbody, ParserGem::NodeProcessors::ResbodyNode
36
41
  register :def, ParserGem::NodeProcessors::DefNode
37
42
  register :defs, ParserGem::NodeProcessors::DefsNode
43
+ register :if, ParserGem::NodeProcessors::IfNode
38
44
  register :send, ParserGem::NodeProcessors::SendNode
45
+ register :class, Convention::StructDefinition::NodeProcessors::StructNode
46
+ register :class, Convention::DataDefinition::NodeProcessors::DataNode
39
47
  register :class, ParserGem::NodeProcessors::NamespaceNode
40
48
  register :module, ParserGem::NodeProcessors::NamespaceNode
41
49
  register :sclass, ParserGem::NodeProcessors::SclassNode
@@ -43,6 +51,8 @@ module Solargraph
43
51
  register :cvasgn, ParserGem::NodeProcessors::CvasgnNode
44
52
  register :lvasgn, ParserGem::NodeProcessors::LvasgnNode
45
53
  register :gvasgn, ParserGem::NodeProcessors::GvasgnNode
54
+ register :casgn, Convention::StructDefinition::NodeProcessors::StructNode
55
+ register :casgn, Convention::DataDefinition::NodeProcessors::DataNode
46
56
  register :casgn, ParserGem::NodeProcessors::CasgnNode
47
57
  register :masgn, ParserGem::NodeProcessors::MasgnNode
48
58
  register :alias, ParserGem::NodeProcessors::AliasNode
@@ -50,7 +60,11 @@ module Solargraph
50
60
  register :forward_args, ParserGem::NodeProcessors::ArgsNode
51
61
  register :block, ParserGem::NodeProcessors::BlockNode
52
62
  register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
63
+ register :op_asgn, ParserGem::NodeProcessors::OpasgnNode
53
64
  register :sym, ParserGem::NodeProcessors::SymNode
65
+ register :until, ParserGem::NodeProcessors::UntilNode
66
+ register :while, ParserGem::NodeProcessors::WhileNode
67
+ register :and, ParserGem::NodeProcessors::AndNode
54
68
  end
55
69
  end
56
70
  end
@@ -29,7 +29,7 @@ module Solargraph
29
29
  scope: nil, visibility: :public, lvars: []
30
30
  @source = source
31
31
  # @closure = closure
32
- @closure = closure || Pin::Namespace.new(name: '', location: source.location)
32
+ @closure = closure || Pin::Namespace.new(name: '', location: source.location, source: :parser)
33
33
  @scope = scope
34
34
  @visibility = visibility
35
35
  @lvars = lvars
@@ -4,6 +4,7 @@ module Solargraph
4
4
  autoload :ParserGem, 'solargraph/parser/parser_gem'
5
5
  autoload :Region, 'solargraph/parser/region'
6
6
  autoload :NodeProcessor, 'solargraph/parser/node_processor'
7
+ autoload :FlowSensitiveTyping, 'solargraph/parser/flow_sensitive_typing'
7
8
  autoload :Snippet, 'solargraph/parser/snippet'
8
9
 
9
10
  class SyntaxError < StandardError