rucoa 0.9.0 → 0.11.0

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -0
  3. data/Gemfile.lock +8 -8
  4. data/data/definitions_ruby_3_1 +0 -0
  5. data/lib/rucoa/configuration.rb +4 -1
  6. data/lib/rucoa/definition_store.rb +350 -105
  7. data/lib/rucoa/definitions/base.rb +14 -3
  8. data/lib/rucoa/definitions/class_definition.rb +14 -64
  9. data/lib/rucoa/definitions/constant_definition.rb +31 -19
  10. data/lib/rucoa/definitions/method_definition.rb +44 -52
  11. data/lib/rucoa/definitions/method_parameter_definition.rb +4 -1
  12. data/lib/rucoa/definitions/module_definition.rb +53 -0
  13. data/lib/rucoa/handler_concerns/diagnostics_publishable.rb +14 -3
  14. data/lib/rucoa/handlers/base.rb +12 -3
  15. data/lib/rucoa/handlers/text_document_definition_handler.rb +3 -99
  16. data/lib/rucoa/handlers/text_document_hover_handler.rb +21 -13
  17. data/lib/rucoa/handlers/text_document_selection_range_handler.rb +8 -2
  18. data/lib/rucoa/location.rb +37 -0
  19. data/lib/rucoa/node_concerns/body.rb +24 -0
  20. data/lib/rucoa/node_concerns/{name_fully_qualifiable.rb → qualified_name.rb} +2 -2
  21. data/lib/rucoa/node_concerns.rb +2 -1
  22. data/lib/rucoa/node_inspector.rb +29 -23
  23. data/lib/rucoa/nodes/base.rb +22 -6
  24. data/lib/rucoa/nodes/begin_node.rb +8 -0
  25. data/lib/rucoa/nodes/casgn_node.rb +1 -1
  26. data/lib/rucoa/nodes/class_node.rb +2 -1
  27. data/lib/rucoa/nodes/const_node.rb +33 -15
  28. data/lib/rucoa/nodes/def_node.rb +2 -2
  29. data/lib/rucoa/nodes/defs_node.rb +1 -1
  30. data/lib/rucoa/nodes/module_node.rb +2 -1
  31. data/lib/rucoa/nodes.rb +2 -1
  32. data/lib/rucoa/parser.rb +14 -14
  33. data/lib/rucoa/parser_builder.rb +6 -1
  34. data/lib/rucoa/position.rb +10 -1
  35. data/lib/rucoa/range.rb +11 -1
  36. data/lib/rucoa/rbs/class_definition_mapper.rb +14 -28
  37. data/lib/rucoa/rbs/constant_definition_mapper.rb +12 -6
  38. data/lib/rucoa/rbs/method_definition_mapper.rb +12 -6
  39. data/lib/rucoa/rbs/module_definition_mapper.rb +39 -6
  40. data/lib/rucoa/rubocop/investigator.rb +4 -1
  41. data/lib/rucoa/server.rb +9 -3
  42. data/lib/rucoa/source.rb +19 -4
  43. data/lib/rucoa/unqualified_name.rb +9 -0
  44. data/lib/rucoa/version.rb +1 -1
  45. data/lib/rucoa/yard/definition_generators/attribute_reader_definition_generator.rb +76 -0
  46. data/lib/rucoa/yard/definition_generators/attribute_writer_definition_generator.rb +76 -0
  47. data/lib/rucoa/yard/definition_generators/base.rb +117 -0
  48. data/lib/rucoa/yard/definition_generators/class_definition_generator.rb +67 -0
  49. data/lib/rucoa/yard/definition_generators/constant_assignment_definition_generator.rb +29 -0
  50. data/lib/rucoa/yard/definition_generators/method_definition_generator.rb +60 -0
  51. data/lib/rucoa/yard/definition_generators/module_definition_generator.rb +68 -0
  52. data/lib/rucoa/yard/definition_generators.rb +15 -0
  53. data/lib/rucoa/yard/definitions_loader.rb +1 -271
  54. data/lib/rucoa/yard.rb +1 -0
  55. data/lib/rucoa.rb +4 -2
  56. metadata +15 -3
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ Location = ::Struct.new(
5
+ :range,
6
+ :uri,
7
+ keyword_init: true
8
+ ) do
9
+ class << self
10
+ # @param location [RBS::Location]
11
+ # @return [Rucoa::Location]
12
+ def from_rbs_location(location)
13
+ new(
14
+ range: Range.new(
15
+ Position.new(
16
+ column: location.start_column,
17
+ line: location.start_line
18
+ ),
19
+ Position.new(
20
+ column: location.end_column,
21
+ line: location.end_line
22
+ )
23
+ ),
24
+ uri: "file://#{location.name}"
25
+ )
26
+ end
27
+
28
+ # @param node [Rucoa::Nodes::Base]
29
+ def from_rucoa_node(node)
30
+ new(
31
+ range: Range.from_parser_range(node.location.expression),
32
+ uri: node.location.expression.source_buffer.name
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module NodeConcerns
5
+ module Body
6
+ # @return [Rucoa::Nodes::BeginNode, nil]
7
+ def body
8
+ children[2]
9
+ end
10
+
11
+ # @return [Array<Rucoa::Nodes::Base>]
12
+ def body_children
13
+ case body
14
+ when Nodes::BeginNode
15
+ body.children
16
+ when nil
17
+ []
18
+ else
19
+ [body]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Rucoa
4
4
  module NodeConcerns
5
- module NameFullyQualifiable
5
+ module QualifiedName
6
6
  # @return [String]
7
- def fully_qualified_name
7
+ def qualified_name
8
8
  [
9
9
  name,
10
10
  *each_ancestor(:class, :constant, :module).map(&:name)
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Rucoa
4
4
  module NodeConcerns
5
- autoload :NameFullyQualifiable, 'rucoa/node_concerns/name_fully_qualifiable'
5
+ autoload :Body, 'rucoa/node_concerns/body'
6
+ autoload :QualifiedName, 'rucoa/node_concerns/qualified_name'
6
7
  end
7
8
  end
@@ -4,7 +4,10 @@ module Rucoa
4
4
  class NodeInspector
5
5
  # @param definition_store [Rucoa::DefinitionStore]
6
6
  # @param node [Rucoa::Node]
7
- def initialize(definition_store:, node:)
7
+ def initialize(
8
+ definition_store:,
9
+ node:
10
+ )
8
11
  @definition_store = definition_store
9
12
  @node = node
10
13
  end
@@ -48,7 +51,7 @@ module Rucoa
48
51
  def return_types
49
52
  case @node.type
50
53
  when :const
51
- ["singleton<#{@node.name}>"]
54
+ return_types_for_const
52
55
  when :lvar
53
56
  return_types_for_lvar
54
57
  when :send
@@ -90,22 +93,14 @@ module Rucoa
90
93
  def constant_definition
91
94
  return unless @node.is_a?(Nodes::ConstNode)
92
95
 
93
- module_nesting = @node.module_nesting
94
- candidate_fully_qualified_names = module_nesting.flat_map do |module_nesting_fully_qualified_name|
95
- [
96
- module_nesting_fully_qualified_name
97
- # TODO: *ancestors_of(module_nesting_fully_qualified_name)
98
- ].map do |fully_qualified_name|
99
- [
100
- fully_qualified_name,
101
- @node.chained_name
102
- ].join('::')
103
- end
104
- end + [@node.chained_name]
105
- candidate_fully_qualified_names.find do |candidate_fully_qualified_name|
106
- definition = @definition_store.find_definition_by_fully_qualified_name(candidate_fully_qualified_name)
107
- break definition if definition
108
- end
96
+ @definition_store.find_definition_by_qualified_name(
97
+ @definition_store.resolve_constant(
98
+ UnqualifiedName.new(
99
+ chained_name: @node.chained_name,
100
+ module_nesting: @node.module_nesting
101
+ )
102
+ )
103
+ )
109
104
  end
110
105
 
111
106
  # @return [Boolean]
@@ -114,16 +109,27 @@ module Rucoa
114
109
  end
115
110
 
116
111
  # @return [String, nil]
117
- def nearest_def_fully_qualified_name
118
- @node.each_ancestor(:def).first&.fully_qualified_name
112
+ def nearest_def_qualified_name
113
+ @node.each_ancestor(:def).first&.qualified_name
114
+ end
115
+
116
+ # @return [Array<String>]
117
+ def return_types_for_const
118
+ qualified_name = @definition_store.resolve_constant(
119
+ UnqualifiedName.new(
120
+ chained_name: @node.chained_name,
121
+ module_nesting: @node.module_nesting
122
+ )
123
+ )
124
+ ["singleton<#{qualified_name}>"]
119
125
  end
120
126
 
121
127
  # @return [Array<String>]
122
128
  def return_types_for_lvar
123
- fully_qualified_name = nearest_def_fully_qualified_name
124
- return [] unless fully_qualified_name
129
+ qualified_name = nearest_def_qualified_name
130
+ return [] unless qualified_name
125
131
 
126
- definition = @definition_store.find_definition_by_fully_qualified_name(fully_qualified_name)
132
+ definition = @definition_store.find_definition_by_qualified_name(qualified_name)
127
133
  return [] unless definition
128
134
 
129
135
  definition.parameters.select do |parameter|
@@ -37,7 +37,10 @@ module Rucoa
37
37
  # @param types [Array<Symbol>]
38
38
  # @return [Rucoa::Nodes::Base] if a block is given
39
39
  # @return [Enumerator] if no block is given
40
- def each_ancestor(*types, &block)
40
+ def each_ancestor(
41
+ *types,
42
+ &block
43
+ )
41
44
  return to_enum(__method__, *types) unless block
42
45
 
43
46
  visit_ancestors(types, &block)
@@ -47,7 +50,10 @@ module Rucoa
47
50
  # @param types [Array<Symbol>]
48
51
  # @return [Rucoa::Nodes::Base] if a block is given
49
52
  # @return [Enumerator] if no block is given
50
- def each_child_node(*types, &block)
53
+ def each_child_node(
54
+ *types,
55
+ &block
56
+ )
51
57
  return to_enum(__method__, *types) unless block
52
58
 
53
59
  visit_child_node(types, &block)
@@ -57,7 +63,10 @@ module Rucoa
57
63
  # @param types [Array<Symbol>]
58
64
  # @return [Rucoa::Nodes::Base] if a block is given
59
65
  # @return [Enumerator] if no block is given
60
- def each_descendant(*types, &block)
66
+ def each_descendant(
67
+ *types,
68
+ &block
69
+ )
61
70
  return to_enum(__method__, *types) unless block
62
71
 
63
72
  visit_descendants(types, &block)
@@ -68,7 +77,11 @@ module Rucoa
68
77
  # Some nodes change their type depending on the context.
69
78
  # For example, `const` node can be `casgn` node.
70
79
  # @return [Rucoa::Nodes::Base]
71
- def updated(type = nil, children = nil, properties = {})
80
+ def updated(
81
+ type = nil,
82
+ children = nil,
83
+ properties = {}
84
+ )
72
85
  properties[:location] ||= @location
73
86
  ParserBuilder.node_class_for(type || @type).new(
74
87
  type || @type,
@@ -137,7 +150,7 @@ module Rucoa
137
150
  # )
138
151
  # expect(node.module_nesting).to eq(['Foo::Bar', 'Foo'])
139
152
  def module_nesting
140
- each_ancestor(:class, :module).map(&:fully_qualified_name)
153
+ each_ancestor(:class, :module).map(&:qualified_name)
141
154
  end
142
155
 
143
156
  protected
@@ -145,7 +158,10 @@ module Rucoa
145
158
  # Visit all descendants.
146
159
  # @param types [Array<Symbol>]
147
160
  # @return [void]
148
- def visit_descendants(types, &block)
161
+ def visit_descendants(
162
+ types,
163
+ &block
164
+ )
149
165
  each_child_node do |child|
150
166
  yield(child) if types.empty? || types.include?(child.type)
151
167
  child.visit_descendants(types, &block)
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rucoa
4
+ module Nodes
5
+ class BeginNode < Base
6
+ end
7
+ end
8
+ end
@@ -3,7 +3,7 @@
3
3
  module Rucoa
4
4
  module Nodes
5
5
  class CasgnNode < Base
6
- include NodeConcerns::NameFullyQualifiable
6
+ include NodeConcerns::QualifiedName
7
7
 
8
8
  # @return [String]
9
9
  def name
@@ -3,7 +3,8 @@
3
3
  module Rucoa
4
4
  module Nodes
5
5
  class ClassNode < Base
6
- include NodeConcerns::NameFullyQualifiable
6
+ include NodeConcerns::Body
7
+ include NodeConcerns::QualifiedName
7
8
 
8
9
  # @return [String]
9
10
  def name
@@ -5,16 +5,25 @@ module Rucoa
5
5
  class ConstNode < Base
6
6
  # @return [String]
7
7
  # @example returns "A" for "A"
8
- # node = Rucoa::Parser.call(
9
- # path: '/path/to/example.rb',
10
- # text: 'A'
8
+ # node = Rucoa::Source.new(
9
+ # content: <<~RUBY,
10
+ # A
11
+ # RUBY
12
+ # uri: 'file:///path/to/a.rb'
11
13
  # ).root_node
12
14
  # expect(node.name).to eq('A')
13
15
  # @example returns "B" for "A::B"
14
- # node = Rucoa::Parser.call(
15
- # path: '/path/to/example.rb',
16
- # text: 'A::B'
17
- # ).root_node
16
+ # node = Rucoa::Source.new(
17
+ # content: <<~RUBY,
18
+ # A::B
19
+ # RUBY
20
+ # uri: 'file:///path/to/a.rb'
21
+ # ).node_at(
22
+ # Rucoa::Position.new(
23
+ # column: 4,
24
+ # line: 1
25
+ # )
26
+ # )
18
27
  # expect(node.name).to eq('B')
19
28
  def name
20
29
  children[1].to_s
@@ -22,16 +31,25 @@ module Rucoa
22
31
 
23
32
  # @return [String]
24
33
  # @example returns "A" for "A"
25
- # node = Rucoa::Parser.call(
26
- # path: '/path/to/example.rb',
27
- # text: 'A'
34
+ # node = Rucoa::Source.new(
35
+ # content: <<~RUBY,
36
+ # A
37
+ # RUBY
38
+ # uri: 'file:///path/to/a.rb'
28
39
  # ).root_node
29
40
  # expect(node.chained_name).to eq('A')
30
41
  # @example returns "A::B" for "A::B"
31
- # node = Rucoa::Parser.call(
32
- # path: '/path/to/example.rb',
33
- # text: 'A::B'
34
- # ).root_node
42
+ # node = Rucoa::Source.new(
43
+ # content: <<~RUBY,
44
+ # A::B
45
+ # RUBY
46
+ # uri: 'file:///path/to/a.rb'
47
+ # ).node_at(
48
+ # Rucoa::Position.new(
49
+ # column: 4,
50
+ # line: 1
51
+ # )
52
+ # )
35
53
  # expect(node.chained_name).to eq('A::B')
36
54
  def chained_name
37
55
  case receiver
@@ -70,7 +88,7 @@ module Rucoa
70
88
  # )
71
89
  # expect(node.module_nesting).to eq(['Foo::Bar', 'Foo'])
72
90
  def module_nesting
73
- each_ancestor(:class, :module).map(&:fully_qualified_name)
91
+ each_ancestor(:class, :module).map(&:qualified_name)
74
92
  end
75
93
 
76
94
  private
@@ -44,8 +44,8 @@ module Rucoa
44
44
  # line: 3
45
45
  # )
46
46
  # )
47
- # expect(node.fully_qualified_name).to eq('Foo::Bar#baz')
48
- def fully_qualified_name
47
+ # expect(node.qualified_name).to eq('Foo::Bar#baz')
48
+ def qualified_name
49
49
  [
50
50
  namespace,
51
51
  method_marker,
@@ -4,7 +4,7 @@ module Rucoa
4
4
  module Nodes
5
5
  class DefsNode < Base
6
6
  # @return [String]
7
- def fully_qualified_name
7
+ def qualified_name
8
8
  [
9
9
  namespace,
10
10
  method_marker,
@@ -3,7 +3,8 @@
3
3
  module Rucoa
4
4
  module Nodes
5
5
  class ModuleNode < Base
6
- include NodeConcerns::NameFullyQualifiable
6
+ include NodeConcerns::Body
7
+ include NodeConcerns::QualifiedName
7
8
 
8
9
  # @return [String]
9
10
  def name
data/lib/rucoa/nodes.rb CHANGED
@@ -3,9 +3,10 @@
3
3
  module Rucoa
4
4
  module Nodes
5
5
  autoload :Base, 'rucoa/nodes/base'
6
+ autoload :BeginNode, 'rucoa/nodes/begin_node'
7
+ autoload :CasgnNode, 'rucoa/nodes/casgn_node'
6
8
  autoload :CbaseNode, 'rucoa/nodes/cbase_node'
7
9
  autoload :ClassNode, 'rucoa/nodes/class_node'
8
- autoload :CasgnNode, 'rucoa/nodes/casgn_node'
9
10
  autoload :ConstNode, 'rucoa/nodes/const_node'
10
11
  autoload :DefNode, 'rucoa/nodes/def_node'
11
12
  autoload :DefsNode, 'rucoa/nodes/defs_node'
data/lib/rucoa/parser.rb CHANGED
@@ -5,47 +5,47 @@ require 'parser/current'
5
5
  module Rucoa
6
6
  class Parser
7
7
  class << self
8
- # @param path [String]
9
8
  # @param text [String]
9
+ # @param uri [String]
10
10
  # @return [Rucoa::ParseResult]
11
11
  # @example returns non-failed parse result for valid Ruby source
12
12
  # result = Rucoa::Parser.call(
13
- # path: '/path/to/foo.rb',
14
- # text: 'foo'
13
+ # text: 'foo',
14
+ # uri: 'file:///path/to/foo.rb'
15
15
  # )
16
16
  # expect(result).not_to be_failed
17
17
  # @example returns failed parse result for invalid Ruby source
18
18
  # result = Rucoa::Parser.call(
19
- # path: '/path/to/foo.rb',
20
- # text: 'foo('
19
+ # text: 'foo(',
20
+ # uri: 'file:///path/to/foo.rb'
21
21
  # )
22
22
  # expect(result).to be_failed
23
23
  def call(
24
- path:,
25
- text:
24
+ text:,
25
+ uri:
26
26
  )
27
27
  new(
28
- path: path,
29
- text: text
28
+ text: text,
29
+ uri: uri
30
30
  ).call
31
31
  end
32
32
  end
33
33
 
34
- # @param path [String]
35
34
  # @param text [String]
35
+ # @param uri [String]
36
36
  def initialize(
37
- path:,
38
- text:
37
+ text:,
38
+ uri:
39
39
  )
40
- @path = path
41
40
  @text = text
41
+ @uri = uri
42
42
  end
43
43
 
44
44
  # @return [Rucoa::ParseResult]
45
45
  def call
46
46
  root_node, comments = parser.parse_with_comments(
47
47
  ::Parser::Source::Buffer.new(
48
- @path,
48
+ @uri,
49
49
  source: @text
50
50
  )
51
51
  )
@@ -5,6 +5,7 @@ require 'parser/current'
5
5
  module Rucoa
6
6
  class ParserBuilder < ::Parser::Builders::Default
7
7
  NODE_CLASS_BY_TYPE = {
8
+ begin: Nodes::BeginNode,
8
9
  casgn: Nodes::CasgnNode,
9
10
  cbase: Nodes::CbaseNode,
10
11
  class: Nodes::ClassNode,
@@ -28,7 +29,11 @@ module Rucoa
28
29
  end
29
30
 
30
31
  # @note Override.
31
- def n(type, children, source_map)
32
+ def n(
33
+ type,
34
+ children,
35
+ source_map
36
+ )
32
37
  self.class.node_class_for(type).new(
33
38
  type,
34
39
  children,
@@ -39,11 +39,20 @@ module Rucoa
39
39
 
40
40
  # @param column [Integer] 0-origin column number
41
41
  # @param line [Integer] 1-origin line number
42
- def initialize(column: 0, line: 1)
42
+ def initialize(
43
+ column: 0,
44
+ line: 1
45
+ )
43
46
  @column = column
44
47
  @line = line
45
48
  end
46
49
 
50
+ # @param other [Rucoa::Position]
51
+ # @return [Boolean]
52
+ def ==(other)
53
+ column == other.column && line == other.line
54
+ end
55
+
47
56
  # @param text [String]
48
57
  # @return [Integer]
49
58
  def to_index_of(text)
data/lib/rucoa/range.rb CHANGED
@@ -31,12 +31,22 @@ module Rucoa
31
31
  # @param beginning [Rucoa::Position]
32
32
  # @param ending [Ruoca::Position]
33
33
  # @param including_ending [Boolean]
34
- def initialize(beginning, ending, including_ending: true)
34
+ def initialize(
35
+ beginning,
36
+ ending,
37
+ including_ending: true
38
+ )
35
39
  @beginning = beginning
36
40
  @ending = ending
37
41
  @including_ending = including_ending
38
42
  end
39
43
 
44
+ # @param other [Rucoa::Range]
45
+ # @return [Boolean]
46
+ def ==(other)
47
+ beginning == other.beginning && ending == other.ending
48
+ end
49
+
40
50
  # @param range [Rucoa::Range]
41
51
  # @return [Boolean]
42
52
  # @example returns true when the range is contained in self
@@ -2,43 +2,29 @@
2
2
 
3
3
  module Rucoa
4
4
  module Rbs
5
- class ClassDefinitionMapper
6
- class << self
7
- # @param declaration [RBS::AST::Declarations::Class]
8
- # @return [Rucoa::Definitions::ClassDefinition]
9
- def call(declaration:)
10
- new(declaration: declaration).call
11
- end
12
- end
13
-
14
- # @param declaration [RBS::AST::Declarations::Class]
15
- def initialize(declaration:)
16
- @declaration = declaration
17
- end
18
-
5
+ class ClassDefinitionMapper < ModuleDefinitionMapper
19
6
  # @return [Rucoa::Definitions::ClassDefinition]
7
+ # @example supports `include`
8
+ # definition_store = Rucoa::DefinitionStore.new
9
+ # definition_store.bulk_add(Rucoa::DefinitionArchiver.load)
10
+ # subject = definition_store.find_definition_by_qualified_name('Array')
11
+ # expect(subject.included_module_qualified_names).to include('Enumerable')
20
12
  def call
21
13
  Definitions::ClassDefinition.new(
22
- fully_qualified_name: fully_qualified_name,
23
- source_path: source_path,
24
- super_class_fully_qualified_name: super_class_fully_qualified_name
14
+ description: description,
15
+ extended_module_qualified_names: extended_module_qualified_names,
16
+ included_module_qualified_names: included_module_qualified_names,
17
+ location: location,
18
+ prepended_module_qualified_names: prepended_module_qualified_names,
19
+ qualified_name: qualified_name,
20
+ super_class_qualified_name: super_class_qualified_name
25
21
  )
26
22
  end
27
23
 
28
24
  private
29
25
 
30
- # @return [String]
31
- def fully_qualified_name
32
- @declaration.name.to_s.delete_prefix('::')
33
- end
34
-
35
- # @return [String]
36
- def source_path
37
- @declaration.location.name
38
- end
39
-
40
26
  # @return [String, nil]
41
- def super_class_fully_qualified_name
27
+ def super_class_qualified_name
42
28
  @declaration.super_class&.name&.to_s&.delete_prefix('::')
43
29
  end
44
30
  end
@@ -19,21 +19,27 @@ module Rucoa
19
19
  # @return [Rucoa::Definitions::ConstantDefinition]
20
20
  def call
21
21
  Definitions::ConstantDefinition.new(
22
- fully_qualified_name: fully_qualified_name,
23
- source_path: source_path
22
+ description: description,
23
+ location: location,
24
+ qualified_name: qualified_name
24
25
  )
25
26
  end
26
27
 
27
28
  private
28
29
 
30
+ # @return [String, nil]
31
+ def description
32
+ @declaration.comment&.string&.sub(/\A\s*<!--.*-->\s*/m, '')
33
+ end
34
+
29
35
  # @return [String]
30
- def fully_qualified_name
36
+ def qualified_name
31
37
  @declaration.name.to_s.delete_prefix('::')
32
38
  end
33
39
 
34
- # @return [String]
35
- def source_path
36
- @declaration.location.name
40
+ # @return [Rucoa::Location]
41
+ def location
42
+ Location.from_rbs_location(@declaration.location)
37
43
  end
38
44
  end
39
45
  end
@@ -7,7 +7,10 @@ module Rucoa
7
7
  # @param declaration [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
8
8
  # @param method_definition [RBS::AST::Members::MethodDefinition]
9
9
  # @return [Rucoa::Definitions::MethodDefinition]
10
- def call(declaration:, method_definition:)
10
+ def call(
11
+ declaration:,
12
+ method_definition:
13
+ )
11
14
  new(
12
15
  declaration: declaration,
13
16
  method_definition: method_definition
@@ -17,7 +20,10 @@ module Rucoa
17
20
 
18
21
  # @param declaration [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
19
22
  # @param method_definition [RBS::AST::Members::MethodDefinition]
20
- def initialize(declaration:, method_definition:)
23
+ def initialize(
24
+ declaration:,
25
+ method_definition:
26
+ )
21
27
  @declaration = declaration
22
28
  @method_definition = method_definition
23
29
  end
@@ -27,9 +33,9 @@ module Rucoa
27
33
  Definitions::MethodDefinition.new(
28
34
  description: description,
29
35
  kind: kind,
36
+ location: location,
30
37
  method_name: method_name,
31
38
  namespace: namespace,
32
- source_path: source_path,
33
39
  types: types
34
40
  )
35
41
  end
@@ -65,9 +71,9 @@ module Rucoa
65
71
  @method_definition.kind
66
72
  end
67
73
 
68
- # @return [String]
69
- def source_path
70
- @declaration.location.name
74
+ # @return [Rucoa::Location]
75
+ def location
76
+ Location.from_rbs_location(@method_definition.location)
71
77
  end
72
78
 
73
79
  class MethodTypeMapper