rucoa 0.5.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +12 -13
- data/data/definitions_ruby_3_1 +0 -0
- data/lib/rucoa/cli.rb +3 -2
- data/lib/rucoa/configuration.rb +69 -16
- data/lib/rucoa/handler_concerns/diagnostics_publishable.rb +14 -2
- data/lib/rucoa/handlers/initialize_handler.rb +7 -0
- data/lib/rucoa/handlers/initialized_handler.rb +1 -1
- data/lib/rucoa/handlers/text_document_completion_handler.rb +223 -0
- data/lib/rucoa/handlers/text_document_did_close_handler.rb +20 -0
- data/lib/rucoa/handlers/text_document_formatting_handler.rb +2 -2
- data/lib/rucoa/handlers/text_document_hover_handler.rb +76 -0
- data/lib/rucoa/handlers/text_document_range_formatting_handler.rb +2 -2
- data/lib/rucoa/handlers.rb +3 -0
- data/lib/rucoa/node_inspector.rb +13 -1
- data/lib/rucoa/position.rb +12 -1
- data/lib/rucoa/{definition_builders/rbs_constant_definition_builder.rb → rbs/constant_definition_mapper.rb} +4 -8
- data/lib/rucoa/{definition_builders/rbs_method_definition_builder.rb → rbs/method_definition_mapper.rb} +4 -7
- data/lib/rucoa/rbs/ruby_definitions_loader.rb +78 -0
- data/lib/rucoa/rbs.rb +9 -0
- data/lib/rucoa/rubocop/autocorrector.rb +40 -0
- data/lib/rucoa/rubocop/configuration_checker.rb +44 -0
- data/lib/rucoa/rubocop/investigator.rb +50 -0
- data/lib/rucoa/rubocop.rb +9 -0
- data/lib/rucoa/server.rb +45 -12
- data/lib/rucoa/source.rb +6 -1
- data/lib/rucoa/version.rb +1 -1
- data/lib/rucoa/{definition_builders/yard_method_definition_builder.rb → yard/definition_mapper.rb} +20 -21
- data/lib/rucoa/yard/definitions_loader.rb +62 -0
- data/lib/rucoa/yard.rb +8 -0
- data/lib/rucoa.rb +3 -7
- metadata +16 -12
- data/lib/rucoa/definition_builders.rb +0 -9
- data/lib/rucoa/rbs_document_loader.rb +0 -43
- data/lib/rucoa/rubocop_autocorrector.rb +0 -38
- data/lib/rucoa/rubocop_configuration_checker.rb +0 -42
- data/lib/rucoa/rubocop_investigator.rb +0 -48
- data/lib/rucoa/yard_glob_document_loader.rb +0 -47
- data/lib/rucoa/yard_string_document_loader.rb +0 -70
data/lib/rucoa/position.rb
CHANGED
@@ -21,7 +21,7 @@ module Rucoa
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
# @param hash [Hash{
|
24
|
+
# @param hash [Hash{String => Integer}]
|
25
25
|
# @return [Rucoa::Position]
|
26
26
|
def from_vscode_position(hash)
|
27
27
|
new(
|
@@ -44,6 +44,17 @@ module Rucoa
|
|
44
44
|
@line = line
|
45
45
|
end
|
46
46
|
|
47
|
+
# @param text [String]
|
48
|
+
# @return [Integer]
|
49
|
+
def to_index_of(text)
|
50
|
+
text.each_line.take(@line - 1).sum(&:length) + @column
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [Rucoa::Range]
|
54
|
+
def to_range
|
55
|
+
Range.new(self, self)
|
56
|
+
end
|
57
|
+
|
47
58
|
# @return [Hash]
|
48
59
|
def to_vscode_position
|
49
60
|
{
|
@@ -1,28 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Rucoa
|
4
|
-
module
|
5
|
-
|
6
|
-
class RbsConstantDefinitionBuilder
|
4
|
+
module Rbs
|
5
|
+
class ConstantDefinitionMapper
|
7
6
|
class << self
|
8
7
|
# @param declaration [RBS::AST::Declarations::Constant]
|
9
8
|
# @return [Rucoa::Definitions::ConstantDefinition]
|
10
9
|
def call(declaration:)
|
11
|
-
new(
|
12
|
-
declaration: declaration
|
13
|
-
).call
|
10
|
+
new(declaration: declaration).call
|
14
11
|
end
|
15
12
|
end
|
16
13
|
|
17
14
|
# @param declaration [RBS::AST::Declarations::Constant]
|
18
|
-
# @return [Rucoa::Definitions::ConstantDefinition]
|
19
15
|
def initialize(declaration:)
|
20
16
|
@declaration = declaration
|
21
17
|
end
|
22
18
|
|
23
19
|
# @return [Rucoa::Definitions::ConstantDefinition]
|
24
20
|
def call
|
25
|
-
|
21
|
+
Definitions::ConstantDefinition.new(
|
26
22
|
full_qualified_name: full_qualified_name,
|
27
23
|
source_path: source_path
|
28
24
|
)
|
@@ -1,11 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rbs'
|
4
|
-
|
5
3
|
module Rucoa
|
6
|
-
module
|
7
|
-
|
8
|
-
class RbsMethodDefinitionBuilder
|
4
|
+
module Rbs
|
5
|
+
class MethodDefinitionMapper
|
9
6
|
class << self
|
10
7
|
# @param declaration [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
|
11
8
|
# @param method_definition [RBS::AST::Members::MethodDefinition]
|
@@ -42,7 +39,7 @@ module Rucoa
|
|
42
39
|
# @return [Array<Rucoa::Types::MethodType>]
|
43
40
|
def types
|
44
41
|
@method_definition.types.map do |method_type|
|
45
|
-
|
42
|
+
MethodTypeMapper.call(
|
46
43
|
method_type: method_type
|
47
44
|
)
|
48
45
|
end
|
@@ -73,7 +70,7 @@ module Rucoa
|
|
73
70
|
@declaration.location.name
|
74
71
|
end
|
75
72
|
|
76
|
-
class
|
73
|
+
class MethodTypeMapper
|
77
74
|
class << self
|
78
75
|
# @param method_type [RBS::Types::MethodType]
|
79
76
|
# @return [Rucoa::Types::MethodType]
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rbs'
|
4
|
+
|
5
|
+
module Rucoa
|
6
|
+
module Rbs
|
7
|
+
# Load definitions for Ruby core and standard libraries.
|
8
|
+
class RubyDefinitionsLoader
|
9
|
+
class << self
|
10
|
+
# @return [Array<Rucoa::Definitions::Base>]
|
11
|
+
def call
|
12
|
+
new.call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Array<Rucoa::Definitions::Base>]
|
17
|
+
def call
|
18
|
+
declarations.flat_map do |declaration|
|
19
|
+
case declaration
|
20
|
+
when ::RBS::AST::Declarations::Constant
|
21
|
+
[
|
22
|
+
ConstantDefinitionMapper.call(declaration: declaration)
|
23
|
+
]
|
24
|
+
when ::RBS::AST::Declarations::Class, ::RBS::AST::Declarations::Module
|
25
|
+
[
|
26
|
+
ConstantDefinitionMapper.call(declaration: declaration)
|
27
|
+
] +
|
28
|
+
declaration.members.grep(::RBS::AST::Members::MethodDefinition).map do |method_definition|
|
29
|
+
MethodDefinitionMapper.call(
|
30
|
+
declaration: declaration,
|
31
|
+
method_definition: method_definition
|
32
|
+
)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# @return [Array<RBS::AST::Declarations::Base>]
|
43
|
+
def declarations
|
44
|
+
class_declarations + constant_declarations
|
45
|
+
end
|
46
|
+
|
47
|
+
# @return [Array<RBS::AST::Declarations::Class>]
|
48
|
+
def class_declarations
|
49
|
+
environment.class_decls.values.flat_map do |multi_entry|
|
50
|
+
multi_entry.decls.map(&:decl)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Array<RBS::AST::Declarations::Constant>]
|
55
|
+
def constant_declarations
|
56
|
+
environment.constant_decls.values.map(&:decl)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [RBS::Environment]
|
60
|
+
def environment
|
61
|
+
@environment ||= ::RBS::Environment.from_loader(
|
62
|
+
environment_loader
|
63
|
+
).resolve_type_names
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [RBS::EnvironmentLoader]
|
67
|
+
def environment_loader
|
68
|
+
loader = ::RBS::EnvironmentLoader.new
|
69
|
+
::RBS::Repository::DEFAULT_STDLIB_ROOT.children.sort.each do |pathname|
|
70
|
+
loader.add(
|
71
|
+
library: pathname.basename.to_s
|
72
|
+
)
|
73
|
+
end
|
74
|
+
loader
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/rucoa/rbs.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rucoa
|
4
|
+
module Rbs
|
5
|
+
autoload :ConstantDefinitionMapper, 'rucoa/rbs/constant_definition_mapper'
|
6
|
+
autoload :MethodDefinitionMapper, 'rucoa/rbs/method_definition_mapper'
|
7
|
+
autoload :RubyDefinitionsLoader, 'rucoa/rbs/ruby_definitions_loader'
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubocop'
|
4
|
+
|
5
|
+
module Rucoa
|
6
|
+
module Rubocop
|
7
|
+
class Autocorrector < ::RuboCop::Runner
|
8
|
+
class << self
|
9
|
+
# @param source [Rucoa::Source]
|
10
|
+
# @return [String]
|
11
|
+
def call(source:)
|
12
|
+
new(source: source).call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param source [Rucoa::Source]
|
17
|
+
def initialize(source:)
|
18
|
+
@source = source
|
19
|
+
super(
|
20
|
+
::RuboCop::Options.new.parse(
|
21
|
+
%w[
|
22
|
+
--stderr
|
23
|
+
--force-exclusion
|
24
|
+
--format RuboCop::Formatter::BaseFormatter
|
25
|
+
-A
|
26
|
+
]
|
27
|
+
).first,
|
28
|
+
::RuboCop::ConfigStore.new
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [String]
|
33
|
+
def call
|
34
|
+
@options[:stdin] = @source.content
|
35
|
+
run([@source.path || 'untitled'])
|
36
|
+
@options[:stdin]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Rucoa
|
6
|
+
module Rubocop
|
7
|
+
class ConfigurationChecker
|
8
|
+
class << self
|
9
|
+
# @return [Boolean]
|
10
|
+
def call
|
11
|
+
new.call
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean]
|
16
|
+
def call
|
17
|
+
rubocop_configured_for_current_directory?
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# @return [Boolean]
|
23
|
+
def rubocop_configured_for_current_directory?
|
24
|
+
each_current_and_ancestor_pathname.any? do |pathname|
|
25
|
+
pathname.join('.rubocop.yml').exist?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Enumerable<Pathname>]
|
30
|
+
def each_current_and_ancestor_pathname
|
31
|
+
return to_enum(__method__) unless block_given?
|
32
|
+
|
33
|
+
pathname = ::Pathname.pwd
|
34
|
+
loop do
|
35
|
+
yield pathname
|
36
|
+
break if pathname.root?
|
37
|
+
|
38
|
+
pathname = pathname.parent
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubocop'
|
4
|
+
|
5
|
+
module Rucoa
|
6
|
+
module Rubocop
|
7
|
+
class Investigator < ::RuboCop::Runner
|
8
|
+
class << self
|
9
|
+
# @param source [Rucoa::Source]
|
10
|
+
# @return [Array<RuboCop::Cop::Offense>]
|
11
|
+
def call(source:)
|
12
|
+
new(source: source).call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param source [Rucoa::Source]
|
17
|
+
def initialize(source:)
|
18
|
+
@source = source
|
19
|
+
@offenses = []
|
20
|
+
super(
|
21
|
+
::RuboCop::Options.new.parse(
|
22
|
+
%w[
|
23
|
+
--stderr
|
24
|
+
--force-exclusion
|
25
|
+
--format RuboCop::Formatter::BaseFormatter
|
26
|
+
]
|
27
|
+
).first,
|
28
|
+
::RuboCop::ConfigStore.new
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Array<RuboCop::Cop::Offense>]
|
33
|
+
def call
|
34
|
+
@options[:stdin] = @source.content
|
35
|
+
run([@source.path || 'untitled'])
|
36
|
+
@offenses
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @param file [String]
|
42
|
+
# @param offenses [Array<RuboCop::Cop::Offense>]
|
43
|
+
# @return [void]
|
44
|
+
def file_finished(file, offenses)
|
45
|
+
@offenses = offenses
|
46
|
+
super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/rucoa/server.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'logger'
|
4
|
+
require 'stringio'
|
5
|
+
|
3
6
|
module Rucoa
|
4
7
|
class Server
|
5
8
|
# @return [Hash{String => Class}]
|
@@ -9,10 +12,13 @@ module Rucoa
|
|
9
12
|
'initialized' => Handlers::InitializedHandler,
|
10
13
|
'shutdown' => Handlers::ShutdownHandler,
|
11
14
|
'textDocument/codeAction' => Handlers::TextDocumentCodeActionHandler,
|
15
|
+
'textDocument/completion' => Handlers::TextDocumentCompletionHandler,
|
12
16
|
'textDocument/didChange' => Handlers::TextDocumentDidChangeHandler,
|
17
|
+
'textDocument/didClose' => Handlers::TextDocumentDidCloseHandler,
|
13
18
|
'textDocument/didOpen' => Handlers::TextDocumentDidOpenHandler,
|
14
19
|
'textDocument/documentSymbol' => Handlers::TextDocumentDocumentSymbolHandler,
|
15
20
|
'textDocument/formatting' => Handlers::TextDocumentFormattingHandler,
|
21
|
+
'textDocument/hover' => Handlers::TextDocumentHoverHandler,
|
16
22
|
'textDocument/rangeFormatting' => Handlers::TextDocumentRangeFormattingHandler,
|
17
23
|
'textDocument/selectionRange' => Handlers::TextDocumentSelectionRangeHandler,
|
18
24
|
'textDocument/signatureHelp' => Handlers::TextDocumentSignatureHelpHandler,
|
@@ -32,11 +38,18 @@ module Rucoa
|
|
32
38
|
# @return [Rucoa::SourceStore]
|
33
39
|
attr_reader :source_store
|
34
40
|
|
35
|
-
# @param
|
36
|
-
# @param
|
37
|
-
|
38
|
-
|
39
|
-
|
41
|
+
# @param io_log [IO]
|
42
|
+
# @param io_in [IO]
|
43
|
+
# @param io_out [IO]
|
44
|
+
def initialize(
|
45
|
+
io_log: ::StringIO.new,
|
46
|
+
io_in: ::StringIO.new,
|
47
|
+
io_out: ::StringIO.new
|
48
|
+
)
|
49
|
+
@logger = ::Logger.new(io_log)
|
50
|
+
@logger.level = ::Logger::DEBUG
|
51
|
+
@reader = MessageReader.new(io_in)
|
52
|
+
@writer = MessageWriter.new(io_out)
|
40
53
|
|
41
54
|
@client_response_handlers = {}
|
42
55
|
@configuration = Configuration.new
|
@@ -50,8 +63,14 @@ module Rucoa
|
|
50
63
|
|
51
64
|
# @return [void]
|
52
65
|
def start
|
53
|
-
@reader.read do |
|
54
|
-
|
66
|
+
@reader.read do |message|
|
67
|
+
debug do
|
68
|
+
{
|
69
|
+
kind: :read,
|
70
|
+
message: message
|
71
|
+
}
|
72
|
+
end
|
73
|
+
handle(message)
|
55
74
|
end
|
56
75
|
end
|
57
76
|
|
@@ -91,6 +110,11 @@ module Rucoa
|
|
91
110
|
end
|
92
111
|
end
|
93
112
|
|
113
|
+
# @yieldparam log [String]
|
114
|
+
def debug(&block)
|
115
|
+
@logger.debug(&block) if configuration.enables_debug?
|
116
|
+
end
|
117
|
+
|
94
118
|
# @param request [Hash]
|
95
119
|
# @return [void]
|
96
120
|
def handle_client_request(request)
|
@@ -115,11 +139,14 @@ module Rucoa
|
|
115
139
|
# @param message [Hash]
|
116
140
|
# @return [void]
|
117
141
|
def write_server_request(message, &block)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
142
|
+
message = message.merge('id' => @server_request_id)
|
143
|
+
debug do
|
144
|
+
{
|
145
|
+
kind: :write,
|
146
|
+
message: message
|
147
|
+
}
|
148
|
+
end
|
149
|
+
@writer.write(message)
|
123
150
|
@client_response_handlers[@server_request_id] = block
|
124
151
|
@server_request_id += 1
|
125
152
|
end
|
@@ -127,6 +154,12 @@ module Rucoa
|
|
127
154
|
# @param message [Hash]
|
128
155
|
# @return [void]
|
129
156
|
def write_server_response(message)
|
157
|
+
debug do
|
158
|
+
{
|
159
|
+
kind: :write,
|
160
|
+
message: message
|
161
|
+
}
|
162
|
+
end
|
130
163
|
@writer.write(message)
|
131
164
|
end
|
132
165
|
end
|
data/lib/rucoa/source.rb
CHANGED
@@ -33,7 +33,7 @@ module Rucoa
|
|
33
33
|
# ]
|
34
34
|
# )
|
35
35
|
def definitions
|
36
|
-
@definitions ||=
|
36
|
+
@definitions ||= Yard::DefinitionsLoader.load_string(
|
37
37
|
content: @content,
|
38
38
|
path: path
|
39
39
|
)
|
@@ -78,6 +78,11 @@ module Rucoa
|
|
78
78
|
nil
|
79
79
|
end
|
80
80
|
|
81
|
+
# @return [Boolean]
|
82
|
+
def syntax_error?
|
83
|
+
root_node.nil?
|
84
|
+
end
|
85
|
+
|
81
86
|
private
|
82
87
|
|
83
88
|
# @return [Array<Rucoa::Nodes::Base>]
|
data/lib/rucoa/version.rb
CHANGED
data/lib/rucoa/{definition_builders/yard_method_definition_builder.rb → yard/definition_mapper.rb}
RENAMED
@@ -3,30 +3,29 @@
|
|
3
3
|
require 'yard'
|
4
4
|
|
5
5
|
module Rucoa
|
6
|
-
module
|
7
|
-
class
|
6
|
+
module Yard
|
7
|
+
class DefinitionMapper
|
8
8
|
class << self
|
9
|
-
# @param code_object [YARD::CodeObjects::
|
10
|
-
# @param path [String]
|
11
|
-
# @return [Rucoa::Definitions::Base]
|
12
|
-
def call(code_object
|
13
|
-
new(
|
14
|
-
code_object: code_object,
|
15
|
-
path: path
|
16
|
-
).call
|
9
|
+
# @param code_object [YARD::CodeObjects::Base]
|
10
|
+
# @param path [String] This must be passed if the path is not available from code object.
|
11
|
+
# @return [Rucoa::Definitions::Base, nil]
|
12
|
+
def call(code_object, path: code_object.file)
|
13
|
+
new(code_object, path: path).call
|
17
14
|
end
|
18
15
|
end
|
19
16
|
|
20
17
|
# @param code_object [YARD::CodeObjects::Base]
|
21
18
|
# @param path [String]
|
22
|
-
def initialize(code_object
|
19
|
+
def initialize(code_object, path:)
|
23
20
|
@code_object = code_object
|
24
21
|
@path = path
|
25
22
|
end
|
26
23
|
|
27
|
-
# @return [Rucoa::Definitions::Base]
|
24
|
+
# @return [Rucoa::Definitions::Base, nil]
|
28
25
|
def call
|
29
|
-
::
|
26
|
+
return unless @code_object.is_a?(::YARD::CodeObjects::MethodObject)
|
27
|
+
|
28
|
+
Definitions::MethodDefinition.new(
|
30
29
|
description: description,
|
31
30
|
kind: kind,
|
32
31
|
method_name: method_name,
|
@@ -74,7 +73,7 @@ module Rucoa
|
|
74
73
|
|
75
74
|
# @return [String]
|
76
75
|
# @example
|
77
|
-
# definitions = Rucoa::
|
76
|
+
# definitions = Rucoa::Yard::DefinitionsLoader.load_string(
|
78
77
|
# content: <<~RUBY,
|
79
78
|
# class Foo
|
80
79
|
# def bar(
|
@@ -133,7 +132,7 @@ module Rucoa
|
|
133
132
|
# @return [Array<String>]
|
134
133
|
# @return [String]
|
135
134
|
# @example returns return type annotated by YARD @return tags
|
136
|
-
# definitions = Rucoa::
|
135
|
+
# definitions = Rucoa::Yard::DefinitionsLoader.load_string(
|
137
136
|
# content: <<~RUBY,
|
138
137
|
# # @return [String]
|
139
138
|
# def foo
|
@@ -148,7 +147,7 @@ module Rucoa
|
|
148
147
|
# ]
|
149
148
|
# )
|
150
149
|
# @example ignores empty @return tags
|
151
|
-
# definitions = Rucoa::
|
150
|
+
# definitions = Rucoa::Yard::DefinitionsLoader.load_string(
|
152
151
|
# content: <<~RUBY,
|
153
152
|
# # @return []
|
154
153
|
# def foo
|
@@ -181,27 +180,27 @@ module Rucoa
|
|
181
180
|
|
182
181
|
# @return [String]
|
183
182
|
# @example scrubs "Array<String>" to "Array"
|
184
|
-
# yard_type = Rucoa::
|
183
|
+
# yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
|
185
184
|
# 'Array<String>'
|
186
185
|
# )
|
187
186
|
# expect(yard_type.to_rucoa_type).to eq('Array')
|
188
187
|
# @example scrubs "Array(String, Integer)" to "Array"
|
189
|
-
# yard_type = Rucoa::
|
188
|
+
# yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
|
190
189
|
# 'Array(String, Integer)'
|
191
190
|
# )
|
192
191
|
# expect(yard_type.to_rucoa_type).to eq('Array')
|
193
192
|
# @example scrubs "::Array" to "Array"
|
194
|
-
# yard_type = Rucoa::
|
193
|
+
# yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
|
195
194
|
# '::Array'
|
196
195
|
# )
|
197
196
|
# expect(yard_type.to_rucoa_type).to eq('Array')
|
198
197
|
# @example scrubs "Hash{Symbol => Object}" to "Hash"
|
199
|
-
# yard_type = Rucoa::
|
198
|
+
# yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
|
200
199
|
# 'Hash{Symbol => Object}'
|
201
200
|
# )
|
202
201
|
# expect(yard_type.to_rucoa_type).to eq('Hash')
|
203
202
|
# @example scrubs "Array<Array<Integer>>" to "Array"
|
204
|
-
# yard_type = Rucoa::
|
203
|
+
# yard_type = Rucoa::Yard::DefinitionMapper::YardType.new(
|
205
204
|
# 'Array<Array<Integer>>'
|
206
205
|
# )
|
207
206
|
# expect(yard_type.to_rucoa_type).to eq('Array')
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'yard'
|
5
|
+
|
6
|
+
module Rucoa
|
7
|
+
module Yard
|
8
|
+
class DefinitionsLoader
|
9
|
+
class << self
|
10
|
+
# @param content [String]
|
11
|
+
# @return [Array<Rucoa::Definitions::Base>]
|
12
|
+
# @example returns method definitions from Ruby source code
|
13
|
+
# content = <<~RUBY
|
14
|
+
# class Foo
|
15
|
+
# # Return given argument as an Integer.
|
16
|
+
# # @param bar [String]
|
17
|
+
# # @return [Integer]
|
18
|
+
# def foo(bar)
|
19
|
+
# bar.to_i
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# RUBY
|
23
|
+
# definitions = Rucoa::Yard::DefinitionsLoader.load_string(
|
24
|
+
# content: content,
|
25
|
+
# path: '/path/to/foo.rb'
|
26
|
+
# )
|
27
|
+
# expect(definitions.size).to eq(1)
|
28
|
+
# expect(definitions.first.full_qualified_name).to eq('Foo#foo')
|
29
|
+
# expect(definitions.first.source_path).to eq('/path/to/foo.rb')
|
30
|
+
# expect(definitions.first.description).to eq('Return given argument as an Integer.')
|
31
|
+
# expect(definitions.first.return_types).to eq(%w[Integer])
|
32
|
+
def load_string(content:, path:)
|
33
|
+
::YARD::Registry.clear
|
34
|
+
quietly do
|
35
|
+
::YARD.parse_string(content)
|
36
|
+
end
|
37
|
+
::YARD::Registry.all.filter_map do |code_object|
|
38
|
+
DefinitionMapper.call(code_object, path: path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param globs [String]
|
43
|
+
# @return [Array<Rucoa::Definitions::Base>]
|
44
|
+
def load_globs(globs:)
|
45
|
+
::YARD::Registry.clear
|
46
|
+
quietly do
|
47
|
+
::YARD.parse(globs)
|
48
|
+
end
|
49
|
+
::YARD::Registry.all.filter_map do |code_object|
|
50
|
+
DefinitionMapper.call(code_object)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def quietly(&block)
|
57
|
+
::YARD::Logger.instance.enter_level(::Logger::FATAL, &block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/rucoa/yard.rb
ADDED
data/lib/rucoa.rb
CHANGED
@@ -6,7 +6,6 @@ module Rucoa
|
|
6
6
|
autoload :Cli, 'rucoa/cli'
|
7
7
|
autoload :Configuration, 'rucoa/configuration'
|
8
8
|
autoload :DefinitionArchiver, 'rucoa/definition_archiver'
|
9
|
-
autoload :DefinitionBuilders, 'rucoa/definition_builders'
|
10
9
|
autoload :Definitions, 'rucoa/definitions'
|
11
10
|
autoload :DefinitionStore, 'rucoa/definition_store'
|
12
11
|
autoload :Errors, 'rucoa/errors'
|
@@ -21,14 +20,11 @@ module Rucoa
|
|
21
20
|
autoload :ParserBuilder, 'rucoa/parser_builder'
|
22
21
|
autoload :Position, 'rucoa/position'
|
23
22
|
autoload :Range, 'rucoa/range'
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :RubocopConfigurationChecker, 'rucoa/rubocop_configuration_checker'
|
27
|
-
autoload :RubocopInvestigator, 'rucoa/rubocop_investigator'
|
23
|
+
autoload :Rbs, 'rucoa/rbs'
|
24
|
+
autoload :Rubocop, 'rucoa/rubocop'
|
28
25
|
autoload :Server, 'rucoa/server'
|
29
26
|
autoload :Source, 'rucoa/source'
|
30
27
|
autoload :SourceStore, 'rucoa/source_store'
|
31
28
|
autoload :Types, 'rucoa/types'
|
32
|
-
autoload :
|
33
|
-
autoload :YardStringDocumentLoader, 'rucoa/yard_string_document_loader'
|
29
|
+
autoload :Yard, 'rucoa/yard'
|
34
30
|
end
|