rucoa 0.6.0 → 0.7.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/data/definitions_ruby_3_1 +0 -0
- data/lib/rucoa/handler_concerns/diagnostics_publishable.rb +14 -2
- data/lib/rucoa/handlers/initialized_handler.rb +1 -1
- data/lib/rucoa/handlers/text_document_completion_handler.rb +8 -1
- 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_range_formatting_handler.rb +2 -2
- data/lib/rucoa/handlers.rb +1 -0
- data/lib/rucoa/node_inspector.rb +13 -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 +1 -0
- data/lib/rucoa/source.rb +1 -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 +14 -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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48f65475f89a895b8fa3429ddcb5a10738c78e2181a0a0f41a8fe14ec8a2fd17
|
4
|
+
data.tar.gz: b94bffab0ae35cf83ee0ae5146f41b583abcea4b4192eabcdc8acbcedf3418b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1693536178207fc2740ede4806a8803f140477b312c143e7ad0284875c1685244a09fa33dcd6208e993f4d0acb87284391a605a27e09d8479c71f556cf951d7f
|
7
|
+
data.tar.gz: d4458ea8223b032e5df2680bfa4f8ed2f939f2971a19db327306a3c6fb6a9a6b3810ffd8ed56346b6e7defb36b916e9054bcb71d031f2494c30b0d6f216995eb
|
data/Gemfile.lock
CHANGED
data/data/definitions_ruby_3_1
CHANGED
Binary file
|
@@ -16,6 +16,18 @@ module Rucoa
|
|
16
16
|
)
|
17
17
|
end
|
18
18
|
|
19
|
+
# @param uri [String]
|
20
|
+
# @return [void]
|
21
|
+
def clear_diagnostics_on(uri)
|
22
|
+
write(
|
23
|
+
method: 'textDocument/publishDiagnostics',
|
24
|
+
params: {
|
25
|
+
diagnostics: [],
|
26
|
+
uri: uri
|
27
|
+
}
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
19
31
|
# @param uri [String]
|
20
32
|
# @return [void]
|
21
33
|
def publish_diagnostics_on(uri)
|
@@ -48,7 +60,7 @@ module Rucoa
|
|
48
60
|
|
49
61
|
# @return [Array<Hash>]
|
50
62
|
def call
|
51
|
-
return [] unless
|
63
|
+
return [] unless Rubocop::ConfigurationChecker.call
|
52
64
|
|
53
65
|
offenses.map do |offense|
|
54
66
|
OffenseToDiagnosticMapper.call(
|
@@ -63,7 +75,7 @@ module Rucoa
|
|
63
75
|
|
64
76
|
# @return [Array<RuboCop::Cop::Offense>]
|
65
77
|
def offenses
|
66
|
-
|
78
|
+
Rubocop::Investigator.call(source: @source)
|
67
79
|
end
|
68
80
|
|
69
81
|
class OffenseToDiagnosticMapper
|
@@ -208,7 +208,14 @@ module Rucoa
|
|
208
208
|
if @repaired
|
209
209
|
position.to_range
|
210
210
|
else
|
211
|
-
Range.from_parser_range(
|
211
|
+
Range.from_parser_range(
|
212
|
+
case node
|
213
|
+
when Nodes::SendNode
|
214
|
+
node.location.selector
|
215
|
+
else
|
216
|
+
node.location.expression
|
217
|
+
end
|
218
|
+
)
|
212
219
|
end
|
213
220
|
end
|
214
221
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rucoa
|
4
|
+
module Handlers
|
5
|
+
class TextDocumentDidCloseHandler < Base
|
6
|
+
include HandlerConcerns::DiagnosticsPublishable
|
7
|
+
|
8
|
+
def call
|
9
|
+
clear_diagnostics_on(uri)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
def uri
|
16
|
+
request.dig('params', 'textDocument', 'uri')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -13,7 +13,7 @@ module Rucoa
|
|
13
13
|
def formattable?
|
14
14
|
configuration.enables_formatting? &&
|
15
15
|
source &&
|
16
|
-
|
16
|
+
Rubocop::ConfigurationChecker.call
|
17
17
|
end
|
18
18
|
|
19
19
|
# @return [Array<Hash>]
|
@@ -43,7 +43,7 @@ module Rucoa
|
|
43
43
|
|
44
44
|
# @return [String]
|
45
45
|
def new_text
|
46
|
-
|
46
|
+
Rubocop::Autocorrector.call(source: source)
|
47
47
|
end
|
48
48
|
|
49
49
|
# @return [Hash]
|
@@ -25,7 +25,7 @@ module Rucoa
|
|
25
25
|
def formattable?
|
26
26
|
configuration.enables_formatting? &&
|
27
27
|
source &&
|
28
|
-
|
28
|
+
Rubocop::ConfigurationChecker.call
|
29
29
|
end
|
30
30
|
|
31
31
|
# @return [Rucoa::Source]
|
@@ -59,7 +59,7 @@ module Rucoa
|
|
59
59
|
|
60
60
|
# @return [Array<RuboCop::Cop::Offense>]
|
61
61
|
def offenses
|
62
|
-
|
62
|
+
Rubocop::Investigator.call(source: source)
|
63
63
|
end
|
64
64
|
|
65
65
|
# @return [Array(Rucoa::Range, String)]
|
data/lib/rucoa/handlers.rb
CHANGED
@@ -10,6 +10,7 @@ module Rucoa
|
|
10
10
|
autoload :TextDocumentCodeActionHandler, 'rucoa/handlers/text_document_code_action_handler'
|
11
11
|
autoload :TextDocumentCompletionHandler, 'rucoa/handlers/text_document_completion_handler'
|
12
12
|
autoload :TextDocumentDidChangeHandler, 'rucoa/handlers/text_document_did_change_handler'
|
13
|
+
autoload :TextDocumentDidCloseHandler, 'rucoa/handlers/text_document_did_close_handler'
|
13
14
|
autoload :TextDocumentDidOpenHandler, 'rucoa/handlers/text_document_did_open_handler'
|
14
15
|
autoload :TextDocumentDocumentSymbolHandler, 'rucoa/handlers/text_document_document_symbol_handler'
|
15
16
|
autoload :TextDocumentFormattingHandler, 'rucoa/handlers/text_document_formatting_handler'
|
data/lib/rucoa/node_inspector.rb
CHANGED
@@ -80,7 +80,19 @@ module Rucoa
|
|
80
80
|
[
|
81
81
|
type,
|
82
82
|
@node.name
|
83
|
-
].join(
|
83
|
+
].join(method_kind_symbol)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [String, nil]
|
88
|
+
def method_kind_symbol
|
89
|
+
return unless @node.is_a?(Nodes::SendNode)
|
90
|
+
|
91
|
+
case @node.receiver
|
92
|
+
when Nodes::ConstNode
|
93
|
+
'.'
|
94
|
+
else
|
95
|
+
'#'
|
84
96
|
end
|
85
97
|
end
|
86
98
|
|
@@ -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
@@ -14,6 +14,7 @@ module Rucoa
|
|
14
14
|
'textDocument/codeAction' => Handlers::TextDocumentCodeActionHandler,
|
15
15
|
'textDocument/completion' => Handlers::TextDocumentCompletionHandler,
|
16
16
|
'textDocument/didChange' => Handlers::TextDocumentDidChangeHandler,
|
17
|
+
'textDocument/didClose' => Handlers::TextDocumentDidCloseHandler,
|
17
18
|
'textDocument/didOpen' => Handlers::TextDocumentDidOpenHandler,
|
18
19
|
'textDocument/documentSymbol' => Handlers::TextDocumentDocumentSymbolHandler,
|
19
20
|
'textDocument/formatting' => Handlers::TextDocumentFormattingHandler,
|
data/lib/rucoa/source.rb
CHANGED
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
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rucoa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -92,10 +92,6 @@ files:
|
|
92
92
|
- lib/rucoa/cli.rb
|
93
93
|
- lib/rucoa/configuration.rb
|
94
94
|
- lib/rucoa/definition_archiver.rb
|
95
|
-
- lib/rucoa/definition_builders.rb
|
96
|
-
- lib/rucoa/definition_builders/rbs_constant_definition_builder.rb
|
97
|
-
- lib/rucoa/definition_builders/rbs_method_definition_builder.rb
|
98
|
-
- lib/rucoa/definition_builders/yard_method_definition_builder.rb
|
99
95
|
- lib/rucoa/definition_store.rb
|
100
96
|
- lib/rucoa/definitions.rb
|
101
97
|
- lib/rucoa/definitions/base.rb
|
@@ -115,6 +111,7 @@ files:
|
|
115
111
|
- lib/rucoa/handlers/text_document_code_action_handler.rb
|
116
112
|
- lib/rucoa/handlers/text_document_completion_handler.rb
|
117
113
|
- lib/rucoa/handlers/text_document_did_change_handler.rb
|
114
|
+
- lib/rucoa/handlers/text_document_did_close_handler.rb
|
118
115
|
- lib/rucoa/handlers/text_document_did_open_handler.rb
|
119
116
|
- lib/rucoa/handlers/text_document_document_symbol_handler.rb
|
120
117
|
- lib/rucoa/handlers/text_document_formatting_handler.rb
|
@@ -145,18 +142,23 @@ files:
|
|
145
142
|
- lib/rucoa/parser_builder.rb
|
146
143
|
- lib/rucoa/position.rb
|
147
144
|
- lib/rucoa/range.rb
|
148
|
-
- lib/rucoa/
|
149
|
-
- lib/rucoa/
|
150
|
-
- lib/rucoa/
|
151
|
-
- lib/rucoa/
|
145
|
+
- lib/rucoa/rbs.rb
|
146
|
+
- lib/rucoa/rbs/constant_definition_mapper.rb
|
147
|
+
- lib/rucoa/rbs/method_definition_mapper.rb
|
148
|
+
- lib/rucoa/rbs/ruby_definitions_loader.rb
|
149
|
+
- lib/rucoa/rubocop.rb
|
150
|
+
- lib/rucoa/rubocop/autocorrector.rb
|
151
|
+
- lib/rucoa/rubocop/configuration_checker.rb
|
152
|
+
- lib/rucoa/rubocop/investigator.rb
|
152
153
|
- lib/rucoa/server.rb
|
153
154
|
- lib/rucoa/source.rb
|
154
155
|
- lib/rucoa/source_store.rb
|
155
156
|
- lib/rucoa/types.rb
|
156
157
|
- lib/rucoa/types/method_type.rb
|
157
158
|
- lib/rucoa/version.rb
|
158
|
-
- lib/rucoa/
|
159
|
-
- lib/rucoa/
|
159
|
+
- lib/rucoa/yard.rb
|
160
|
+
- lib/rucoa/yard/definition_mapper.rb
|
161
|
+
- lib/rucoa/yard/definitions_loader.rb
|
160
162
|
- rucoa.gemspec
|
161
163
|
homepage: https://github.com/r7kamura/rucoa
|
162
164
|
licenses:
|
@@ -1,9 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Rucoa
|
4
|
-
module DefinitionBuilders
|
5
|
-
autoload :RbsConstantDefinitionBuilder, 'rucoa/definition_builders/rbs_constant_definition_builder'
|
6
|
-
autoload :RbsMethodDefinitionBuilder, 'rucoa/definition_builders/rbs_method_definition_builder'
|
7
|
-
autoload :YardMethodDefinitionBuilder, 'rucoa/definition_builders/yard_method_definition_builder'
|
8
|
-
end
|
9
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rbs'
|
4
|
-
|
5
|
-
module Rucoa
|
6
|
-
class RbsDocumentLoader
|
7
|
-
class << self
|
8
|
-
def call
|
9
|
-
new.call
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# @return [Array<Rucoa::Definitions::Base>]
|
14
|
-
def call
|
15
|
-
declarations.flat_map do |declaration|
|
16
|
-
case declaration
|
17
|
-
when ::RBS::AST::Declarations::Constant
|
18
|
-
[
|
19
|
-
DefinitionBuilders::RbsConstantDefinitionBuilder.call(declaration: declaration)
|
20
|
-
]
|
21
|
-
when ::RBS::AST::Declarations::Class, ::RBS::AST::Declarations::Module
|
22
|
-
declaration.members.grep(::RBS::AST::Members::MethodDefinition).map do |method_definition|
|
23
|
-
DefinitionBuilders::RbsMethodDefinitionBuilder.call(
|
24
|
-
declaration: declaration,
|
25
|
-
method_definition: method_definition
|
26
|
-
)
|
27
|
-
end
|
28
|
-
else
|
29
|
-
[]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
# @return [Array<RBS::AST::Declarations::Base>]
|
37
|
-
def declarations
|
38
|
-
::RBS::Environment.from_loader(
|
39
|
-
::RBS::EnvironmentLoader.new
|
40
|
-
).resolve_type_names.declarations
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubocop'
|
4
|
-
|
5
|
-
module Rucoa
|
6
|
-
class RubocopAutocorrector < ::RuboCop::Runner
|
7
|
-
class << self
|
8
|
-
# @param source [Rucoa::Source]
|
9
|
-
# @return [String]
|
10
|
-
def call(source:)
|
11
|
-
new(source: source).call
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# @param source [Rucoa::Source]
|
16
|
-
def initialize(source:)
|
17
|
-
@source = source
|
18
|
-
super(
|
19
|
-
::RuboCop::Options.new.parse(
|
20
|
-
%w[
|
21
|
-
--stderr
|
22
|
-
--force-exclusion
|
23
|
-
--format RuboCop::Formatter::BaseFormatter
|
24
|
-
-A
|
25
|
-
]
|
26
|
-
).first,
|
27
|
-
::RuboCop::ConfigStore.new
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
# @return [String]
|
32
|
-
def call
|
33
|
-
@options[:stdin] = @source.content
|
34
|
-
run([@source.path || 'untitled'])
|
35
|
-
@options[:stdin]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'pathname'
|
4
|
-
|
5
|
-
module Rucoa
|
6
|
-
class RubocopConfigurationChecker
|
7
|
-
class << self
|
8
|
-
# @return [Boolean]
|
9
|
-
def call
|
10
|
-
new.call
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
# @return [Boolean]
|
15
|
-
def call
|
16
|
-
rubocop_configured_for_current_directory?
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
# @return [Boolean]
|
22
|
-
def rubocop_configured_for_current_directory?
|
23
|
-
each_current_and_ancestor_pathname.any? do |pathname|
|
24
|
-
pathname.join('.rubocop.yml').exist?
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# @return [Enumerable<Pathname>]
|
29
|
-
def each_current_and_ancestor_pathname
|
30
|
-
return to_enum(__method__) unless block_given?
|
31
|
-
|
32
|
-
pathname = ::Pathname.pwd
|
33
|
-
loop do
|
34
|
-
yield pathname
|
35
|
-
break if pathname.root?
|
36
|
-
|
37
|
-
pathname = pathname.parent
|
38
|
-
end
|
39
|
-
self
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubocop'
|
4
|
-
|
5
|
-
module Rucoa
|
6
|
-
class RubocopInvestigator < ::RuboCop::Runner
|
7
|
-
class << self
|
8
|
-
# @param source [Rucoa::Source]
|
9
|
-
# @return [Array<RuboCop::Cop::Offense>]
|
10
|
-
def call(source:)
|
11
|
-
new(source: source).call
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# @param source [Rucoa::Source]
|
16
|
-
def initialize(source:)
|
17
|
-
@source = source
|
18
|
-
@offenses = []
|
19
|
-
super(
|
20
|
-
::RuboCop::Options.new.parse(
|
21
|
-
%w[
|
22
|
-
--stderr
|
23
|
-
--force-exclusion
|
24
|
-
--format RuboCop::Formatter::BaseFormatter
|
25
|
-
]
|
26
|
-
).first,
|
27
|
-
::RuboCop::ConfigStore.new
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
# @return [Array<RuboCop::Cop::Offense>]
|
32
|
-
def call
|
33
|
-
@options[:stdin] = @source.content
|
34
|
-
run([@source.path || 'untitled'])
|
35
|
-
@offenses
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
# @param file [String]
|
41
|
-
# @param offenses [Array<RuboCop::Cop::Offense>]
|
42
|
-
# @return [void]
|
43
|
-
def file_finished(file, offenses)
|
44
|
-
@offenses = offenses
|
45
|
-
super
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logger'
|
4
|
-
require 'yard'
|
5
|
-
|
6
|
-
module Rucoa
|
7
|
-
class YardGlobDocumentLoader
|
8
|
-
class << self
|
9
|
-
# @param globs [Array<String>]
|
10
|
-
# @return [Array<Rucoa::Definitions::Base>]
|
11
|
-
def call(globs:)
|
12
|
-
new(
|
13
|
-
globs: globs
|
14
|
-
).call
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# @param globs [String]
|
19
|
-
def initialize(globs:)
|
20
|
-
@globs = globs
|
21
|
-
end
|
22
|
-
|
23
|
-
# @return [Array<Rucoa::Definitions::Base>]
|
24
|
-
def call
|
25
|
-
code_objects.filter_map do |code_object|
|
26
|
-
case code_object
|
27
|
-
when ::YARD::CodeObjects::MethodObject
|
28
|
-
DefinitionBuilders::YardMethodDefinitionBuilder.call(
|
29
|
-
code_object: code_object,
|
30
|
-
path: code_object.file
|
31
|
-
)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
# @return [Array<YARD::CodeObjects::Base>]
|
39
|
-
def code_objects
|
40
|
-
::YARD::Logger.instance.enter_level(::Logger::FATAL) do
|
41
|
-
::YARD::Registry.clear
|
42
|
-
::YARD.parse(@globs)
|
43
|
-
::YARD::Registry.all
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logger'
|
4
|
-
require 'yard'
|
5
|
-
|
6
|
-
module Rucoa
|
7
|
-
class YardStringDocumentLoader
|
8
|
-
class << self
|
9
|
-
# @param content [String]
|
10
|
-
# @return [Array<Rucoa::Definitions::Base>]
|
11
|
-
# @example returns method definitions from Ruby source code
|
12
|
-
# content = <<~RUBY
|
13
|
-
# class Foo
|
14
|
-
# # Return given argument as an Integer.
|
15
|
-
# # @param bar [String]
|
16
|
-
# # @return [Integer]
|
17
|
-
# def foo(bar)
|
18
|
-
# bar.to_i
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
# RUBY
|
22
|
-
# definitions = Rucoa::YardStringDocumentLoader.call(
|
23
|
-
# content: content,
|
24
|
-
# path: '/path/to/foo.rb'
|
25
|
-
# )
|
26
|
-
# expect(definitions.size).to eq(1)
|
27
|
-
# expect(definitions.first.full_qualified_name).to eq('Foo#foo')
|
28
|
-
# expect(definitions.first.source_path).to eq('/path/to/foo.rb')
|
29
|
-
# expect(definitions.first.description).to eq('Return given argument as an Integer.')
|
30
|
-
# expect(definitions.first.return_types).to eq(%w[Integer])
|
31
|
-
def call(content:, path:)
|
32
|
-
new(
|
33
|
-
content: content,
|
34
|
-
path: path
|
35
|
-
).call
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# @param content [String]
|
40
|
-
# @param path [String]
|
41
|
-
def initialize(content:, path:)
|
42
|
-
@content = content
|
43
|
-
@path = path
|
44
|
-
end
|
45
|
-
|
46
|
-
# @return [Array<Rucoa::Definitions::Base>]
|
47
|
-
def call
|
48
|
-
code_objects.filter_map do |code_object|
|
49
|
-
case code_object
|
50
|
-
when ::YARD::CodeObjects::MethodObject
|
51
|
-
DefinitionBuilders::YardMethodDefinitionBuilder.call(
|
52
|
-
code_object: code_object,
|
53
|
-
path: @path
|
54
|
-
)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
# @return [Array<YARD::CodeObjects::Base>]
|
62
|
-
def code_objects
|
63
|
-
::YARD::Logger.instance.enter_level(::Logger::FATAL) do
|
64
|
-
::YARD::Registry.clear
|
65
|
-
::YARD.parse_string(@content)
|
66
|
-
::YARD::Registry.all
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|