solargraph 0.58.0 → 0.59.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/.envrc +3 -0
- data/.gitattributes +2 -0
- data/.github/workflows/linting.yml +6 -5
- data/.github/workflows/plugins.yml +48 -35
- data/.github/workflows/rspec.yml +15 -28
- data/.github/workflows/typecheck.yml +3 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +53 -966
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +9 -8
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +288 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +110 -97
- data/lib/solargraph/api_map/store.rb +395 -384
- data/lib/solargraph/api_map.rb +1029 -945
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +240 -228
- data/lib/solargraph/complex_type/unique_type.rb +641 -482
- data/lib/solargraph/complex_type.rb +557 -444
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +438 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +886 -878
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +702 -683
- data/lib/solargraph/location.rb +85 -82
- data/lib/solargraph/logging.rb +55 -37
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +84 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +19 -17
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +773 -729
- data/lib/solargraph/pin/base_variable.rb +375 -126
- data/lib/solargraph/pin/block.rb +127 -104
- data/lib/solargraph/pin/breakable.rb +15 -9
- data/lib/solargraph/pin/callable.rb +275 -231
- data/lib/solargraph/pin/closure.rb +69 -72
- data/lib/solargraph/pin/common.rb +97 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +129 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +116 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +724 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +122 -115
- data/lib/solargraph/pin/parameter.rb +339 -275
- data/lib/solargraph/pin/proxy_type.rb +42 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +59 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +64 -61
- data/lib/solargraph/pin/symbol.rb +54 -53
- data/lib/solargraph/pin/until.rb +16 -18
- data/lib/solargraph/pin/while.rb +16 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +248 -245
- data/lib/solargraph/position.rb +139 -119
- data/lib/solargraph/range.rb +113 -112
- data/lib/solargraph/rbs_map/conversions.rb +952 -823
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
- data/lib/solargraph/rbs_map.rb +207 -163
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +555 -352
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +377 -337
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +30 -26
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +37 -34
- data/lib/solargraph/source/chain/if.rb +30 -28
- data/lib/solargraph/source/chain/instance_variable.rb +36 -13
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +51 -48
- data/lib/solargraph/source/chain/or.rb +29 -23
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +304 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/encoding_fixes.rb +22 -23
- data/lib/solargraph/source/source_chainer.rb +218 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +522 -498
- data/lib/solargraph/source_map/clip.rb +245 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +286 -259
- data/lib/solargraph/source_map.rb +224 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +888 -814
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/workspace/config.rb +258 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +242 -220
- data/lib/solargraph/yard_map/helpers.rb +49 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +90 -87
- data/lib/solargraph.rb +128 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +37 -35
- metadata +52 -51
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,40 +1,49 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class Definition < Base
|
|
8
|
+
def process
|
|
9
|
+
@line = params['position']['line']
|
|
10
|
+
@column = params['position']['character']
|
|
11
|
+
set_result(code_location || require_location || [])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
# @return [Array<Hash>, nil]
|
|
17
|
+
def code_location
|
|
18
|
+
suggestions = host.definitions_at(params['textDocument']['uri'], @line, @column)
|
|
19
|
+
# @sg-ignore Need to add nil check here
|
|
20
|
+
return nil if suggestions.empty?
|
|
21
|
+
# @sg-ignore Need to add nil check here
|
|
22
|
+
suggestions.reject { |pin| pin.best_location.nil? || pin.best_location.filename.nil? }.map do |pin|
|
|
23
|
+
{
|
|
24
|
+
uri: file_to_uri(pin.best_location.filename),
|
|
25
|
+
range: pin.best_location.range.to_hash
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Array<Hash>, nil]
|
|
31
|
+
def require_location
|
|
32
|
+
# @todo Terrible hack
|
|
33
|
+
lib = host.library_for(params['textDocument']['uri'])
|
|
34
|
+
rloc = Solargraph::Location.new(uri_to_file(params['textDocument']['uri']),
|
|
35
|
+
Solargraph::Range.from_to(@line, @column, @line, @column))
|
|
36
|
+
dloc = lib.locate_ref(rloc)
|
|
37
|
+
return nil if dloc.nil?
|
|
38
|
+
[
|
|
39
|
+
{
|
|
40
|
+
uri: file_to_uri(dloc.filename),
|
|
41
|
+
range: dloc.range.to_hash
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class DocumentHighlight < Base
|
|
8
|
+
def process
|
|
9
|
+
locs = host.references_from(params['textDocument']['uri'], params['position']['line'],
|
|
10
|
+
params['position']['character'], strip: true, only: true)
|
|
11
|
+
result = locs.map do |loc|
|
|
12
|
+
{
|
|
13
|
+
range: loc.range.to_hash,
|
|
14
|
+
kind: 1
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
set_result result
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,26 +1,36 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class DocumentSymbol < Solargraph::LanguageServer::Message::Base
|
|
8
|
+
include Solargraph::LanguageServer::UriHelpers
|
|
9
|
+
|
|
10
|
+
def process
|
|
11
|
+
pins = host.document_symbols params['textDocument']['uri']
|
|
12
|
+
info = pins.map do |pin|
|
|
13
|
+
next nil unless pin.best_location&.filename
|
|
14
|
+
|
|
15
|
+
result = {
|
|
16
|
+
name: pin.name,
|
|
17
|
+
containerName: pin.namespace,
|
|
18
|
+
kind: pin.symbol_kind,
|
|
19
|
+
location: {
|
|
20
|
+
# @sg-ignore Need to add nil check here
|
|
21
|
+
uri: file_to_uri(pin.best_location.filename),
|
|
22
|
+
# @sg-ignore Need to add nil check here
|
|
23
|
+
range: pin.best_location.range.to_hash
|
|
24
|
+
},
|
|
25
|
+
deprecated: pin.deprecated?
|
|
26
|
+
}
|
|
27
|
+
result
|
|
28
|
+
end.compact
|
|
29
|
+
|
|
30
|
+
set_result info
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,148 +1,150 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'securerandom'
|
|
4
|
-
require 'tmpdir'
|
|
5
|
-
|
|
6
|
-
module Solargraph
|
|
7
|
-
module LanguageServer
|
|
8
|
-
module Message
|
|
9
|
-
module TextDocument
|
|
10
|
-
class Formatting < Base
|
|
11
|
-
include Solargraph::Diagnostics::RubocopHelpers
|
|
12
|
-
|
|
13
|
-
def process
|
|
14
|
-
file_uri = params['textDocument']['uri']
|
|
15
|
-
config = config_for(file_uri)
|
|
16
|
-
original = host.read_text(file_uri)
|
|
17
|
-
args = cli_args(file_uri, config)
|
|
18
|
-
|
|
19
|
-
require_rubocop(config['version'])
|
|
20
|
-
options, paths = ::RuboCop::Options.new.parse(args)
|
|
21
|
-
# @sg-ignore Unresolved call to []=
|
|
22
|
-
options[:stdin] = original
|
|
23
|
-
|
|
24
|
-
# Ensure only one instance of RuboCop::Runner is running at
|
|
25
|
-
# a time - it uses 'chdir' to read config files with ERB,
|
|
26
|
-
# which can conflict with other chdirs.
|
|
27
|
-
corrections = Solargraph::CHDIR_MUTEX.synchronize do
|
|
28
|
-
redirect_stdout do
|
|
29
|
-
::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
# @sg-ignore Unresolved call to []=
|
|
33
|
-
result = options[:stdin]
|
|
34
|
-
|
|
35
|
-
log_corrections(corrections)
|
|
36
|
-
|
|
37
|
-
format original, result
|
|
38
|
-
rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
|
|
39
|
-
set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
# @param corrections [String]
|
|
45
|
-
# @return [void]
|
|
46
|
-
def log_corrections
|
|
47
|
-
corrections = corrections&.strip
|
|
48
|
-
return if corrections&.empty?
|
|
49
|
-
|
|
50
|
-
Solargraph.logger.info('Formatting result:')
|
|
51
|
-
corrections.each_line do |line|
|
|
52
|
-
next if line.strip.empty?
|
|
53
|
-
Solargraph.logger.info(line.strip)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @param file_uri [String]
|
|
58
|
-
# @return [Hash{String => undefined}]
|
|
59
|
-
def config_for
|
|
60
|
-
conf = host.formatter_config(file_uri)
|
|
61
|
-
return {} unless conf.is_a?(Hash)
|
|
62
|
-
|
|
63
|
-
conf['rubocop'] || {}
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# @param file_uri [String]
|
|
67
|
-
# @param config [Hash{String => String}]
|
|
68
|
-
# @return [Array<String>]
|
|
69
|
-
def cli_args file_uri, config
|
|
70
|
-
file = UriHelpers.uri_to_file(file_uri)
|
|
71
|
-
args = [
|
|
72
|
-
config['cops'] == 'all' ? '-A' : '-a',
|
|
73
|
-
'--cache', 'false',
|
|
74
|
-
'--format', formatter_class(config).name
|
|
75
|
-
]
|
|
76
|
-
|
|
77
|
-
[
|
|
78
|
-
cops = cop_list(config[arg])
|
|
79
|
-
args += ["--#{arg}", cops] if cops
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
args += config['extra_args'] if config['extra_args']
|
|
83
|
-
args + [file]
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# @param config [Hash{String => String}]
|
|
87
|
-
# @sg-ignore
|
|
88
|
-
# @return [Class<RuboCop::Formatter::BaseFormatter>]
|
|
89
|
-
def formatter_class
|
|
90
|
-
if self.class.const_defined?('BlankRubocopFormatter')
|
|
91
|
-
# @sg-ignore
|
|
92
|
-
BlankRubocopFormatter
|
|
93
|
-
else
|
|
94
|
-
require_rubocop(config['version'])
|
|
95
|
-
klass = Class.new(::RuboCop::Formatter::BaseFormatter)
|
|
96
|
-
self.class.const_set 'BlankRubocopFormatter', klass
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# @param value [Array, String]
|
|
101
|
-
#
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
value
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
# @
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
require 'tmpdir'
|
|
5
|
+
|
|
6
|
+
module Solargraph
|
|
7
|
+
module LanguageServer
|
|
8
|
+
module Message
|
|
9
|
+
module TextDocument
|
|
10
|
+
class Formatting < Base
|
|
11
|
+
include Solargraph::Diagnostics::RubocopHelpers
|
|
12
|
+
|
|
13
|
+
def process
|
|
14
|
+
file_uri = params['textDocument']['uri']
|
|
15
|
+
config = config_for(file_uri)
|
|
16
|
+
original = host.read_text(file_uri)
|
|
17
|
+
args = cli_args(file_uri, config)
|
|
18
|
+
|
|
19
|
+
require_rubocop(config['version'])
|
|
20
|
+
options, paths = ::RuboCop::Options.new.parse(args)
|
|
21
|
+
# @sg-ignore Unresolved call to []=
|
|
22
|
+
options[:stdin] = original
|
|
23
|
+
|
|
24
|
+
# Ensure only one instance of RuboCop::Runner is running at
|
|
25
|
+
# a time - it uses 'chdir' to read config files with ERB,
|
|
26
|
+
# which can conflict with other chdirs.
|
|
27
|
+
corrections = Solargraph::CHDIR_MUTEX.synchronize do
|
|
28
|
+
redirect_stdout do
|
|
29
|
+
::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
# @sg-ignore Unresolved call to []=
|
|
33
|
+
result = options[:stdin]
|
|
34
|
+
|
|
35
|
+
log_corrections(corrections)
|
|
36
|
+
|
|
37
|
+
format original, result
|
|
38
|
+
rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
|
|
39
|
+
set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# @param corrections [String]
|
|
45
|
+
# @return [void]
|
|
46
|
+
def log_corrections corrections
|
|
47
|
+
corrections = corrections&.strip
|
|
48
|
+
return if corrections&.empty?
|
|
49
|
+
|
|
50
|
+
Solargraph.logger.info('Formatting result:')
|
|
51
|
+
corrections.each_line do |line|
|
|
52
|
+
next if line.strip.empty?
|
|
53
|
+
Solargraph.logger.info(line.strip)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @param file_uri [String]
|
|
58
|
+
# @return [Hash{String => undefined}]
|
|
59
|
+
def config_for file_uri
|
|
60
|
+
conf = host.formatter_config(file_uri)
|
|
61
|
+
return {} unless conf.is_a?(Hash)
|
|
62
|
+
|
|
63
|
+
conf['rubocop'] || {}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# @param file_uri [String]
|
|
67
|
+
# @param config [Hash{String => String}]
|
|
68
|
+
# @return [Array<String>]
|
|
69
|
+
def cli_args file_uri, config
|
|
70
|
+
file = UriHelpers.uri_to_file(file_uri)
|
|
71
|
+
args = [
|
|
72
|
+
config['cops'] == 'all' ? '-A' : '-a',
|
|
73
|
+
'--cache', 'false',
|
|
74
|
+
'--format', formatter_class(config).name
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
%w[except only].each do |arg|
|
|
78
|
+
cops = cop_list(config[arg])
|
|
79
|
+
args += ["--#{arg}", cops] if cops
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
args += config['extra_args'] if config['extra_args']
|
|
83
|
+
args + [file]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @param config [Hash{String => String}]
|
|
87
|
+
# @sg-ignore
|
|
88
|
+
# @return [Class<RuboCop::Formatter::BaseFormatter>]
|
|
89
|
+
def formatter_class config
|
|
90
|
+
if self.class.const_defined?('BlankRubocopFormatter')
|
|
91
|
+
# @sg-ignore
|
|
92
|
+
BlankRubocopFormatter
|
|
93
|
+
else
|
|
94
|
+
require_rubocop(config['version'])
|
|
95
|
+
klass = Class.new(::RuboCop::Formatter::BaseFormatter)
|
|
96
|
+
self.class.const_set 'BlankRubocopFormatter', klass
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @param value [Array, String]
|
|
101
|
+
#
|
|
102
|
+
# @return [String, nil]
|
|
103
|
+
def cop_list value
|
|
104
|
+
# @type [String]
|
|
105
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
106
|
+
value = value.join(',') if value.respond_to?(:join)
|
|
107
|
+
return nil if value == '' || !value.is_a?(String)
|
|
108
|
+
value
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# @param original [String]
|
|
112
|
+
# @param result [String]
|
|
113
|
+
# @return [void]
|
|
114
|
+
def format original, result
|
|
115
|
+
ending = if original.end_with?("\n")
|
|
116
|
+
{
|
|
117
|
+
line: original.lines.length,
|
|
118
|
+
character: 0
|
|
119
|
+
}
|
|
120
|
+
elsif original.lines.empty?
|
|
121
|
+
{
|
|
122
|
+
line: 0,
|
|
123
|
+
character: 0
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
{
|
|
127
|
+
line: original.lines.length - 1,
|
|
128
|
+
character: original.lines.last.length
|
|
129
|
+
}
|
|
130
|
+
end
|
|
131
|
+
set_result(
|
|
132
|
+
[
|
|
133
|
+
{
|
|
134
|
+
range: {
|
|
135
|
+
start: {
|
|
136
|
+
line: 0,
|
|
137
|
+
character: 0
|
|
138
|
+
},
|
|
139
|
+
end: ending
|
|
140
|
+
},
|
|
141
|
+
newText: result
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
module TextDocument
|
|
7
|
-
class Hover < Base
|
|
8
|
-
def process
|
|
9
|
-
line = params['position']['line']
|
|
10
|
-
col = params['position']['character']
|
|
11
|
-
contents = []
|
|
12
|
-
suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
|
|
13
|
-
last_link = nil
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
parts.push
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Logging.logger.warn e.backtrace.join("\n")
|
|
35
|
-
set_result nil
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
private
|
|
39
|
-
|
|
40
|
-
# @param contents [Array<String>]
|
|
41
|
-
# @return [Hash{Symbol => Hash{Symbol => String}}, nil]
|
|
42
|
-
def contents_or_nil contents
|
|
43
|
-
stripped = contents
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return nil if stripped.empty?
|
|
47
|
-
{
|
|
48
|
-
contents: {
|
|
49
|
-
kind: 'markdown',
|
|
50
|
-
value: stripped.join("\n\n")
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class Hover < Base
|
|
8
|
+
def process
|
|
9
|
+
line = params['position']['line']
|
|
10
|
+
col = params['position']['character']
|
|
11
|
+
contents = []
|
|
12
|
+
suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
|
|
13
|
+
last_link = nil
|
|
14
|
+
# @sg-ignore Need to add nil check here
|
|
15
|
+
suggestions.each do |pin|
|
|
16
|
+
parts = []
|
|
17
|
+
this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
|
|
18
|
+
parts.push this_link if !this_link.nil? && this_link != last_link
|
|
19
|
+
parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
|
|
20
|
+
parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
|
|
21
|
+
unless parts.empty?
|
|
22
|
+
data = parts.join("\n\n")
|
|
23
|
+
next if contents.last&.end_with?(data)
|
|
24
|
+
contents.push data
|
|
25
|
+
end
|
|
26
|
+
last_link = this_link unless this_link.nil?
|
|
27
|
+
end
|
|
28
|
+
set_result(
|
|
29
|
+
contents_or_nil(contents)
|
|
30
|
+
)
|
|
31
|
+
rescue FileNotFoundError => e
|
|
32
|
+
Logging.logger.warn "[#{e.class}] #{e.message}"
|
|
33
|
+
# @sg-ignore Need to add nil check here
|
|
34
|
+
Logging.logger.warn e.backtrace.join("\n")
|
|
35
|
+
set_result nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# @param contents [Array<String>]
|
|
41
|
+
# @return [Hash{Symbol => Hash{Symbol => String}}, nil]
|
|
42
|
+
def contents_or_nil contents
|
|
43
|
+
stripped = contents
|
|
44
|
+
.map(&:strip)
|
|
45
|
+
.reject(&:empty?)
|
|
46
|
+
return nil if stripped.empty?
|
|
47
|
+
{
|
|
48
|
+
contents: {
|
|
49
|
+
kind: 'markdown',
|
|
50
|
+
value: stripped.join("\n\n")
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class PrepareRename < Base
|
|
8
|
+
def process
|
|
9
|
+
line = params['position']['line']
|
|
10
|
+
col = params['position']['character']
|
|
11
|
+
set_result host.sources.find(params['textDocument']['uri']).cursor_at(Solargraph::Position.new(line,
|
|
12
|
+
col)).range.to_hash
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|