rucoa 0.6.0 → 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/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
|