rucoa 0.3.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +12 -2
  5. data/README.md +37 -6
  6. data/data/definitions_ruby_3_1 +0 -0
  7. data/images/diagnostics.gif +0 -0
  8. data/images/document-formatting.gif +0 -0
  9. data/images/document-symbol.gif +0 -0
  10. data/images/selection-ranges.gif +0 -0
  11. data/lib/rucoa/configuration.rb +62 -28
  12. data/lib/rucoa/definition_archiver.rb +29 -0
  13. data/lib/rucoa/definition_builders/rbs_constant_definition_builder.rb +44 -0
  14. data/lib/rucoa/definition_builders/rbs_method_definition_builder.rb +106 -0
  15. data/lib/rucoa/definition_builders/yard_method_definition_builder.rb +218 -0
  16. data/lib/rucoa/definition_builders.rb +9 -0
  17. data/lib/rucoa/definition_store.rb +63 -0
  18. data/lib/rucoa/definitions/base.rb +12 -0
  19. data/lib/rucoa/definitions/constant_definition.rb +51 -0
  20. data/lib/rucoa/definitions/method_definition.rb +126 -0
  21. data/lib/rucoa/definitions/method_parameter_definition.rb +30 -0
  22. data/lib/rucoa/definitions.rb +9 -0
  23. data/lib/rucoa/handler_concerns/diagnostics_publishable.rb +140 -0
  24. data/lib/rucoa/handlers/base.rb +8 -0
  25. data/lib/rucoa/handlers/exit_handler.rb +11 -0
  26. data/lib/rucoa/handlers/initialize_handler.rb +7 -0
  27. data/lib/rucoa/handlers/initialized_handler.rb +10 -0
  28. data/lib/rucoa/handlers/shutdown_handler.rb +12 -0
  29. data/lib/rucoa/handlers/text_document_code_action_handler.rb +78 -3
  30. data/lib/rucoa/handlers/text_document_did_change_handler.rb +1 -20
  31. data/lib/rucoa/handlers/text_document_did_open_handler.rb +11 -4
  32. data/lib/rucoa/handlers/text_document_document_symbol_handler.rb +242 -0
  33. data/lib/rucoa/handlers/text_document_formatting_handler.rb +36 -5
  34. data/lib/rucoa/handlers/text_document_range_formatting_handler.rb +65 -13
  35. data/lib/rucoa/handlers/text_document_selection_range_handler.rb +124 -8
  36. data/lib/rucoa/handlers/text_document_signature_help_handler.rb +68 -0
  37. data/lib/rucoa/handlers.rb +4 -0
  38. data/lib/rucoa/node_concerns/name_full_qualifiable.rb +20 -0
  39. data/lib/rucoa/node_concerns.rb +7 -0
  40. data/lib/rucoa/node_inspector.rb +111 -0
  41. data/lib/rucoa/nodes/base.rb +43 -0
  42. data/lib/rucoa/nodes/casgn_node.rb +14 -0
  43. data/lib/rucoa/nodes/class_node.rb +8 -0
  44. data/lib/rucoa/nodes/const_node.rb +12 -0
  45. data/lib/rucoa/nodes/def_node.rb +71 -0
  46. data/lib/rucoa/nodes/defs_node.rb +12 -0
  47. data/lib/rucoa/nodes/lvar_node.rb +25 -0
  48. data/lib/rucoa/nodes/module_node.rb +21 -0
  49. data/lib/rucoa/nodes/sclass_node.rb +8 -0
  50. data/lib/rucoa/nodes/send_node.rb +60 -0
  51. data/lib/rucoa/nodes/str_node.rb +4 -0
  52. data/lib/rucoa/nodes/sym_node.rb +12 -0
  53. data/lib/rucoa/nodes.rb +10 -0
  54. data/lib/rucoa/parser_builder.rb +20 -10
  55. data/lib/rucoa/position.rb +2 -2
  56. data/lib/rucoa/range.rb +64 -14
  57. data/lib/rucoa/rbs_document_loader.rb +43 -0
  58. data/lib/rucoa/rubocop_autocorrector.rb +1 -1
  59. data/lib/rucoa/rubocop_investigator.rb +1 -1
  60. data/lib/rucoa/server.rb +20 -1
  61. data/lib/rucoa/source.rb +56 -6
  62. data/lib/rucoa/source_store.rb +6 -10
  63. data/lib/rucoa/types/method_type.rb +23 -0
  64. data/lib/rucoa/types.rb +7 -0
  65. data/lib/rucoa/version.rb +1 -1
  66. data/lib/rucoa/yard_glob_document_loader.rb +47 -0
  67. data/lib/rucoa/yard_string_document_loader.rb +70 -0
  68. data/lib/rucoa.rb +10 -5
  69. data/rucoa.gemspec +2 -0
  70. metadata +68 -7
  71. data/lib/rucoa/code_action_provider.rb +0 -102
  72. data/lib/rucoa/diagnostic_provider.rb +0 -143
  73. data/lib/rucoa/formatting_provider.rb +0 -54
  74. data/lib/rucoa/range_formatting_provider.rb +0 -67
  75. data/lib/rucoa/selection_range_provider.rb +0 -99
@@ -1,143 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rucoa
4
- class DiagnosticProvider
5
- # @param source [Rucoa::Source]
6
- # @param uri [String]
7
- # @return [Array<Hash>]
8
- def self.call(source:, uri:)
9
- new(
10
- source: source,
11
- uri: uri
12
- ).call
13
- end
14
-
15
- # @param source [Rucoa::Source]
16
- # @param uri [String]
17
- def initialize(source:, uri:)
18
- @source = source
19
- @uri = uri
20
- end
21
-
22
- # @return [Array<Hash>]
23
- def call
24
- return [] unless RubocopConfigurationChecker.call
25
-
26
- offenses.map do |offense|
27
- OffenseToDiagnosticMapper.call(
28
- offense,
29
- source: @source,
30
- uri: @uri
31
- )
32
- end
33
- end
34
-
35
- private
36
-
37
- # @return [Array<RuboCop::Cop::Offense>]
38
- def offenses
39
- RubocopInvestigator.call(source: @source)
40
- end
41
-
42
- class OffenseToDiagnosticMapper
43
- LSP_SEVERITY_NAME_TO_VALUE_MAP = {
44
- error: 1,
45
- hint: 4,
46
- information: 3,
47
- warning: 2
48
- }.freeze
49
- private_constant :LSP_SEVERITY_NAME_TO_VALUE_MAP
50
-
51
- RUBOCOP_SEVERITY_NAME_TO_LSP_SEVERITY_MAP = {
52
- convention: LSP_SEVERITY_NAME_TO_VALUE_MAP[:information],
53
- error: LSP_SEVERITY_NAME_TO_VALUE_MAP[:error],
54
- fatal: LSP_SEVERITY_NAME_TO_VALUE_MAP[:error],
55
- info: LSP_SEVERITY_NAME_TO_VALUE_MAP[:information],
56
- refactor: LSP_SEVERITY_NAME_TO_VALUE_MAP[:hint],
57
- warning: LSP_SEVERITY_NAME_TO_VALUE_MAP[:warning]
58
- }.freeze
59
- private_constant :RUBOCOP_SEVERITY_NAME_TO_LSP_SEVERITY_MAP
60
-
61
- class << self
62
- # @param offense [RuboCop::Cop::Offense]
63
- # @param source [Rucoa::Source]
64
- # @param uri [String]
65
- # @return [Hash]
66
- def call(offense, source:, uri:)
67
- new(
68
- offense,
69
- source: source,
70
- uri: uri
71
- ).call
72
- end
73
- end
74
-
75
- # @param offense [RuboCop::Cop::Offense]
76
- # @param source [Rucoa::Source]
77
- # @param uri [String]
78
- def initialize(offense, source:, uri:)
79
- @offense = offense
80
- @source = source
81
- @uri = uri
82
- end
83
-
84
- # @return [Hash]
85
- def call
86
- {
87
- code: code,
88
- data: data,
89
- message: message,
90
- range: range,
91
- severity: severity,
92
- source: source
93
- }
94
- end
95
-
96
- private
97
-
98
- # @return [String]
99
- def code
100
- @offense.cop_name
101
- end
102
-
103
- # @return [Hash]
104
- def data
105
- {
106
- cop_name: @offense.cop_name,
107
- edits: edits,
108
- uri: @uri
109
- }
110
- end
111
-
112
- # @return [Array<Hash>, nil]
113
- def edits
114
- @offense.corrector&.as_replacements&.map do |range, replacement|
115
- {
116
- newText: replacement,
117
- range: Range.from_parser_range(range).to_vscode_range
118
- }
119
- end
120
- end
121
-
122
- # @return [String]
123
- def message
124
- @offense.message.delete_prefix("#{@offense.cop_name}: ")
125
- end
126
-
127
- # @return [Hash]
128
- def range
129
- Range.from_parser_range(@offense.location).to_vscode_range
130
- end
131
-
132
- # @return [Integer]
133
- def severity
134
- RUBOCOP_SEVERITY_NAME_TO_LSP_SEVERITY_MAP.fetch(@offense.severity.name, 1)
135
- end
136
-
137
- # @return [String]
138
- def source
139
- 'RuboCop'
140
- end
141
- end
142
- end
143
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rucoa
4
- class FormattingProvider
5
- class << self
6
- # @param source [Rucoa::Source]
7
- # @return [Array<Hash>]
8
- def call(source:)
9
- new(source: source).call
10
- end
11
- end
12
-
13
- # @param source [Rucoa::Source]
14
- def initialize(source:)
15
- @source = source
16
- end
17
-
18
- # @return [Array<Hash>]
19
- def call
20
- return [] unless RubocopConfigurationChecker.call
21
-
22
- [text_edit]
23
- end
24
-
25
- private
26
-
27
- # @return [Hash]
28
- def text_edit
29
- {
30
- newText: new_text,
31
- range: range
32
- }
33
- end
34
-
35
- # @return [String]
36
- def new_text
37
- RubocopAutocorrector.call(source: @source)
38
- end
39
-
40
- # @return [Hash]
41
- def range
42
- Range.new(
43
- Position.new(
44
- column: 0,
45
- line: 1
46
- ),
47
- Position.new(
48
- column: @source.content.lines.last.length,
49
- line: @source.content.lines.count + 1
50
- )
51
- ).to_vscode_range
52
- end
53
- end
54
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rucoa
4
- class RangeFormattingProvider
5
- class << self
6
- # @param range [Rucoa::Range]
7
- # @param source [Rucoa::Source]
8
- # @return [Array<Hash>]
9
- def call(range:, source:)
10
- new(range: range, source: source).call
11
- end
12
- end
13
-
14
- # @param range [Rucoa::Range]
15
- # @param source [Rucoa::Source]
16
- def initialize(range:, source:)
17
- @range = range
18
- @source = source
19
- end
20
-
21
- # @return [Array<Hash>]
22
- def call
23
- return [] unless RubocopConfigurationChecker.call
24
-
25
- edits
26
- end
27
-
28
- private
29
-
30
- # @return [Array<RuboCop::Cop::Corrector>]
31
- def correctable_offenses
32
- offenses.select(&:corrector)
33
- end
34
-
35
- # @return [Array(Rucoa::Range, String)]
36
- def correctable_replacements
37
- replacements.select do |range, _|
38
- @range.contains?(range)
39
- end
40
- end
41
-
42
- # @return [Array<Hash>]
43
- def edits
44
- correctable_replacements.map do |range, replacement|
45
- {
46
- newText: replacement,
47
- range: range.to_vscode_range
48
- }
49
- end
50
- end
51
-
52
- # @return [Array<RuboCop::Cop::Offense>]
53
- def offenses
54
- RubocopInvestigator.call(source: @source)
55
- end
56
-
57
- # @return [Array(Rucoa::Range, String)]
58
- def replacements
59
- correctable_offenses.map(&:corrector).flat_map(&:as_replacements).map do |range, replacement|
60
- [
61
- Range.from_parser_range(range),
62
- replacement
63
- ]
64
- end
65
- end
66
- end
67
- end
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rucoa
4
- class SelectionRangeProvider
5
- class << self
6
- # @param source [Rucoa::Source]
7
- # @param position [Rucoa::Position]
8
- # @return [Hash, nil]
9
- def call(position:, source:)
10
- new(
11
- position: position,
12
- source: source
13
- ).call
14
- end
15
- end
16
-
17
- # @param position [Rucoa::Position]
18
- # @param source [Rucoa::Source]
19
- def initialize(position:, source:)
20
- @position = position
21
- @source = source
22
- end
23
-
24
- # @return [Hash, nil]
25
- def call
26
- ranges.reverse.reduce(nil) do |result, range|
27
- {
28
- parent: result,
29
- range: range.to_vscode_range
30
- }
31
- end
32
- end
33
-
34
- private
35
-
36
- # @return [Rucoa::Nodes::Base, nil]
37
- def node_at_position
38
- if instance_variable_defined?(:@node_at_position)
39
- @node_at_position
40
- else
41
- @node_at_position = @source.node_at(@position)
42
- end
43
- end
44
-
45
- # @return [Array<Rucoa::Range>]
46
- def ranges
47
- return [] unless node_at_position
48
-
49
- [node_at_position, *node_at_position.ancestors].flat_map do |node|
50
- NodeToRangesMapper.call(node)
51
- end
52
- end
53
-
54
- class NodeToRangesMapper
55
- class << self
56
- # @param node [Rucoa::Nodes::Base]
57
- # @return [Array<Rucoa::Range>]
58
- def call(node)
59
- new(node).call
60
- end
61
- end
62
-
63
- # @param node [Rucoa::Nodes::Base]
64
- def initialize(node)
65
- @node = node
66
- end
67
-
68
- # @return [Array<Rucoa::Range>]
69
- def call
70
- case @node
71
- when Nodes::StrNode
72
- [
73
- inner_range,
74
- expression_range
75
- ]
76
- else
77
- [
78
- expression_range
79
- ]
80
- end
81
- end
82
-
83
- private
84
-
85
- # @return [Rucoa::Range]
86
- def inner_range
87
- Range.new(
88
- Position.from_parser_range_ending(@node.location.begin),
89
- Position.from_parser_range_beginning(@node.location.end)
90
- )
91
- end
92
-
93
- # @return [Rucoa::Range]
94
- def expression_range
95
- Range.from_parser_range(@node.location.expression)
96
- end
97
- end
98
- end
99
- end