solargraph 0.59.0.dev.1 → 0.59.0.dev.2
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/.github/workflows/plugins.yml +4 -1
- data/.github/workflows/rspec.yml +3 -14
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +37 -931
- data/CHANGELOG.md +7 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/index.rb +5 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +22 -20
- data/lib/solargraph/api_map.rb +50 -37
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +12 -15
- data/lib/solargraph/complex_type/unique_type.rb +54 -43
- data/lib/solargraph/complex_type.rb +69 -61
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- 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 +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- 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/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +9 -10
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +7 -5
- 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 +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- 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 +10 -11
- 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 +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- 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 +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- 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 +27 -19
- 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 +28 -33
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +78 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +71 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +16 -19
- data/lib/solargraph/position.rb +35 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +312 -206
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +3 -12
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +63 -53
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- 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 +24 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +52 -46
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -101
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +10 -9
- data/lib/solargraph/workspace/gemspecs.rb +1 -1
- data/lib/solargraph/workspace.rb +21 -44
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph.rb +5 -5
- data/solargraph.gemspec +35 -34
- metadata +28 -28
data/lib/solargraph/location.rb
CHANGED
|
@@ -17,18 +17,14 @@ module Solargraph
|
|
|
17
17
|
# @param filename [String, nil]
|
|
18
18
|
# @param range [Solargraph::Range]
|
|
19
19
|
def initialize filename, range
|
|
20
|
-
raise
|
|
20
|
+
raise 'Use nil to represent no-file' if filename&.empty?
|
|
21
21
|
|
|
22
22
|
@filename = filename
|
|
23
23
|
@range = range
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
protected def equality_fields
|
|
27
|
-
[filename, range]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
26
|
# @param other [self]
|
|
31
|
-
def <=>
|
|
27
|
+
def <=> other
|
|
32
28
|
return nil unless other.is_a?(Location)
|
|
33
29
|
if filename == other.filename
|
|
34
30
|
range <=> other.range
|
|
@@ -46,10 +42,6 @@ module Solargraph
|
|
|
46
42
|
range.contain?(location.range.start) && range.contain?(location.range.ending) && filename == location.filename
|
|
47
43
|
end
|
|
48
44
|
|
|
49
|
-
def inspect
|
|
50
|
-
"<#{self.class.name}: filename=#{filename}, range=#{range.inspect}>"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
45
|
def to_s
|
|
54
46
|
inspect
|
|
55
47
|
end
|
|
@@ -64,14 +56,14 @@ module Solargraph
|
|
|
64
56
|
|
|
65
57
|
# @param node [Parser::AST::Node, nil]
|
|
66
58
|
# @return [Location, nil]
|
|
67
|
-
def self.from_node
|
|
59
|
+
def self.from_node node
|
|
68
60
|
return nil if node.nil? || node.loc.nil?
|
|
69
61
|
filename = node.loc.expression.source_buffer.name
|
|
70
62
|
# @sg-ignore flow sensitive typing needs to create separate ranges for postfix if
|
|
71
63
|
filename = nil if filename.empty?
|
|
72
64
|
range = Range.from_node(node)
|
|
73
65
|
# @sg-ignore Need to add nil check here
|
|
74
|
-
|
|
66
|
+
new(filename, range)
|
|
75
67
|
end
|
|
76
68
|
|
|
77
69
|
# @param other [BasicObject]
|
|
@@ -83,5 +75,11 @@ module Solargraph
|
|
|
83
75
|
def inspect
|
|
84
76
|
"#<#{self.class} #{filename}, #{range.inspect}>"
|
|
85
77
|
end
|
|
78
|
+
|
|
79
|
+
protected
|
|
80
|
+
|
|
81
|
+
def equality_fields
|
|
82
|
+
[filename, range]
|
|
83
|
+
end
|
|
86
84
|
end
|
|
87
85
|
end
|
data/lib/solargraph/logging.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Solargraph
|
|
|
10
10
|
'warn' => Logger::WARN,
|
|
11
11
|
'info' => Logger::INFO,
|
|
12
12
|
'debug' => Logger::DEBUG
|
|
13
|
-
}
|
|
13
|
+
}.freeze
|
|
14
14
|
configured_level = ENV.fetch('SOLARGRAPH_LOG', nil)
|
|
15
15
|
level = if LOG_LEVELS.keys.include?(configured_level)
|
|
16
16
|
LOG_LEVELS.fetch(configured_level)
|
|
@@ -21,9 +21,9 @@ module Solargraph
|
|
|
21
21
|
end
|
|
22
22
|
DEFAULT_LOG_LEVEL
|
|
23
23
|
end
|
|
24
|
-
@@logger = Logger.new(
|
|
24
|
+
@@logger = Logger.new($stderr, level: level)
|
|
25
25
|
# @sg-ignore Fix cvar issue
|
|
26
|
-
@@logger.formatter = proc do |severity,
|
|
26
|
+
@@logger.formatter = proc do |severity, _datetime, _progname, msg|
|
|
27
27
|
"[#{severity}] #{msg}\n"
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -45,7 +45,7 @@ module Solargraph
|
|
|
45
45
|
@@logger
|
|
46
46
|
else
|
|
47
47
|
new_log_level = LOG_LEVELS[log_level.to_s]
|
|
48
|
-
logger = Logger.new(
|
|
48
|
+
logger = Logger.new($stderr, level: new_log_level)
|
|
49
49
|
|
|
50
50
|
# @sg-ignore Wrong argument type for Logger#formatter=: arg_0
|
|
51
51
|
# expected nil, received Logger::_Formatter, nil
|
data/lib/solargraph/page.rb
CHANGED
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'ostruct'
|
|
4
|
-
require 'tilt'
|
|
5
|
-
require 'yard'
|
|
6
|
-
require 'cgi'
|
|
7
|
-
|
|
8
|
-
module Solargraph
|
|
9
|
-
class Page
|
|
10
|
-
# @todo This method directive is necessary because OpenStruct.new confuses
|
|
11
|
-
# the typechecker.
|
|
12
|
-
# @!method self.new(locals, render_method)
|
|
13
|
-
# @param locals[Hash]
|
|
14
|
-
# @param render_method [Proc]
|
|
15
|
-
# @return [Binder]
|
|
16
|
-
class Binder < OpenStruct
|
|
17
|
-
# @param locals [Hash]
|
|
18
|
-
# @param render_method [Proc]
|
|
19
|
-
def initialize locals, render_method
|
|
20
|
-
super(locals)
|
|
21
|
-
define_singleton_method :render do |template, layout: false, locals: {}|
|
|
22
|
-
render_method.call(template, layout: layout, locals: locals)
|
|
23
|
-
end
|
|
24
|
-
define_singleton_method :erb do |template, layout: false, locals: {}|
|
|
25
|
-
render_method.call(template, layout: layout, locals: locals)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# @param text [String]
|
|
30
|
-
# @return [String]
|
|
31
|
-
def htmlify text
|
|
32
|
-
# @type [String]
|
|
33
|
-
YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @param text [String]
|
|
37
|
-
# @return [String]
|
|
38
|
-
def escape text
|
|
39
|
-
CGI.escapeHTML(text)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# @param code [String]
|
|
43
|
-
# @return [String]
|
|
44
|
-
def ruby_to_html code
|
|
45
|
-
code
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
private_constant :Binder
|
|
49
|
-
|
|
50
|
-
# @param directory [String]
|
|
51
|
-
def initialize directory = VIEWS_PATH
|
|
52
|
-
directory = VIEWS_PATH if directory.nil?
|
|
53
|
-
directories = [directory]
|
|
54
|
-
directories.push VIEWS_PATH if directory != VIEWS_PATH
|
|
55
|
-
# @type [Proc]
|
|
56
|
-
# @param template [String]
|
|
57
|
-
# @param layout [Boolean]
|
|
58
|
-
# @param locals [Hash]
|
|
59
|
-
@render_method = proc { |template, layout: false, locals: {}|
|
|
60
|
-
binder = Binder.new(locals, @render_method)
|
|
61
|
-
if layout
|
|
62
|
-
Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
|
|
63
|
-
Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
|
|
64
|
-
end
|
|
65
|
-
else
|
|
66
|
-
Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
|
|
67
|
-
end
|
|
68
|
-
}
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# @param template [String]
|
|
72
|
-
# @param layout [Boolean]
|
|
73
|
-
# @param locals [Hash]
|
|
74
|
-
# @sg-ignore
|
|
75
|
-
# @return [String]
|
|
76
|
-
def render template, layout: true, locals: {}
|
|
77
|
-
# @type [String]
|
|
78
|
-
@render_method.call(template, layout: layout, locals: locals)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# @param directories [Array<String>]
|
|
82
|
-
# @param name [String]
|
|
83
|
-
# @return [String]
|
|
84
|
-
def self.select_template directories, name
|
|
85
|
-
directories.each do |dir|
|
|
86
|
-
path = File.join(dir, "#{name}.erb")
|
|
87
|
-
return path if File.file?(path)
|
|
88
|
-
end
|
|
89
|
-
raise FileNotFoundError, "Template not found: #{name}"
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ostruct'
|
|
4
|
+
require 'tilt'
|
|
5
|
+
require 'yard'
|
|
6
|
+
require 'cgi'
|
|
7
|
+
|
|
8
|
+
module Solargraph
|
|
9
|
+
class Page
|
|
10
|
+
# @todo This method directive is necessary because OpenStruct.new confuses
|
|
11
|
+
# the typechecker.
|
|
12
|
+
# @!method self.new(locals, render_method)
|
|
13
|
+
# @param locals[Hash]
|
|
14
|
+
# @param render_method [Proc]
|
|
15
|
+
# @return [Binder]
|
|
16
|
+
class Binder < OpenStruct
|
|
17
|
+
# @param locals [Hash]
|
|
18
|
+
# @param render_method [Proc]
|
|
19
|
+
def initialize locals, render_method
|
|
20
|
+
super(locals)
|
|
21
|
+
define_singleton_method :render do |template, layout: false, locals: {}|
|
|
22
|
+
render_method.call(template, layout: layout, locals: locals)
|
|
23
|
+
end
|
|
24
|
+
define_singleton_method :erb do |template, layout: false, locals: {}|
|
|
25
|
+
render_method.call(template, layout: layout, locals: locals)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param text [String]
|
|
30
|
+
# @return [String]
|
|
31
|
+
def htmlify text
|
|
32
|
+
# @type [String]
|
|
33
|
+
YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param text [String]
|
|
37
|
+
# @return [String]
|
|
38
|
+
def escape text
|
|
39
|
+
CGI.escapeHTML(text)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @param code [String]
|
|
43
|
+
# @return [String]
|
|
44
|
+
def ruby_to_html code
|
|
45
|
+
code
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
private_constant :Binder
|
|
49
|
+
|
|
50
|
+
# @param directory [String]
|
|
51
|
+
def initialize directory = VIEWS_PATH
|
|
52
|
+
directory = VIEWS_PATH if directory.nil? || !File.directory?(directory)
|
|
53
|
+
directories = [directory]
|
|
54
|
+
directories.push VIEWS_PATH if directory != VIEWS_PATH
|
|
55
|
+
# @type [Proc]
|
|
56
|
+
# @param template [String]
|
|
57
|
+
# @param layout [Boolean]
|
|
58
|
+
# @param locals [Hash]
|
|
59
|
+
@render_method = proc { |template, layout: false, locals: {}|
|
|
60
|
+
binder = Binder.new(locals, @render_method)
|
|
61
|
+
if layout
|
|
62
|
+
Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
|
|
63
|
+
Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @param template [String]
|
|
72
|
+
# @param layout [Boolean]
|
|
73
|
+
# @param locals [Hash]
|
|
74
|
+
# @sg-ignore
|
|
75
|
+
# @return [String]
|
|
76
|
+
def render template, layout: true, locals: {}
|
|
77
|
+
# @type [String]
|
|
78
|
+
@render_method.call(template, layout: layout, locals: locals)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @param directories [Array<String>]
|
|
82
|
+
# @param name [String]
|
|
83
|
+
# @return [String]
|
|
84
|
+
def self.select_template directories, name
|
|
85
|
+
directories.each do |dir|
|
|
86
|
+
path = File.join(dir, "#{name}.erb")
|
|
87
|
+
return path if File.file?(path)
|
|
88
|
+
end
|
|
89
|
+
raise FileNotFoundError, "Template not found: #{name}"
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'ripper'
|
|
2
4
|
|
|
3
5
|
module Solargraph
|
|
@@ -26,19 +28,25 @@ module Solargraph
|
|
|
26
28
|
# @sg-ignore Need to add nil check here
|
|
27
29
|
if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
|
|
28
30
|
chomped = result[1].chomp
|
|
29
|
-
if result[2][0]
|
|
31
|
+
if result[2][0].zero? && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace,
|
|
32
|
+
replace: '').match(/^#\s*frozen_string_literal:/)
|
|
30
33
|
chomped = '#'
|
|
31
34
|
end
|
|
32
|
-
@comments[result[2][0]] =
|
|
35
|
+
@comments[result[2][0]] =
|
|
36
|
+
Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
|
|
33
37
|
end
|
|
34
38
|
result
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
# @param result [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
|
|
38
42
|
# @return [void]
|
|
39
|
-
def create_snippet
|
|
43
|
+
def create_snippet result
|
|
40
44
|
chomped = result[1].chomp
|
|
41
|
-
@comments[result[2][0]] =
|
|
45
|
+
@comments[result[2][0]] =
|
|
46
|
+
Snippet.new(
|
|
47
|
+
Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0,
|
|
48
|
+
(result[2][1] || 0) + chomped.length), chomped
|
|
49
|
+
)
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
# @sg-ignore @override is adding, not overriding
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Solargraph
|
|
2
4
|
module Parser
|
|
3
5
|
class FlowSensitiveTyping
|
|
@@ -7,7 +9,7 @@ module Solargraph
|
|
|
7
9
|
# @param ivars [Array<Solargraph::Pin::InstanceVariable>]
|
|
8
10
|
# @param enclosing_breakable_pin [Solargraph::Pin::Breakable, nil]
|
|
9
11
|
# @param enclosing_compound_statement_pin [Solargraph::Pin::CompoundStatement, nil]
|
|
10
|
-
def initialize
|
|
12
|
+
def initialize locals, ivars, enclosing_breakable_pin, enclosing_compound_statement_pin
|
|
11
13
|
@locals = locals
|
|
12
14
|
@ivars = ivars
|
|
13
15
|
@enclosing_breakable_pin = enclosing_breakable_pin
|
|
@@ -19,7 +21,7 @@ module Solargraph
|
|
|
19
21
|
# @param false_ranges [Array<Range>]
|
|
20
22
|
#
|
|
21
23
|
# @return [void]
|
|
22
|
-
def process_and
|
|
24
|
+
def process_and and_node, true_ranges = [], false_ranges = []
|
|
23
25
|
return unless and_node.type == :and
|
|
24
26
|
|
|
25
27
|
# @type [Parser::AST::Node]
|
|
@@ -45,7 +47,7 @@ module Solargraph
|
|
|
45
47
|
# @param false_ranges [Array<Range>]
|
|
46
48
|
#
|
|
47
49
|
# @return [void]
|
|
48
|
-
def process_or
|
|
50
|
+
def process_or or_node, true_ranges = [], false_ranges = []
|
|
49
51
|
return unless or_node.type == :or
|
|
50
52
|
|
|
51
53
|
# @type [Parser::AST::Node]
|
|
@@ -74,7 +76,7 @@ module Solargraph
|
|
|
74
76
|
# @param false_presences [Array<Range>]
|
|
75
77
|
#
|
|
76
78
|
# @return [void]
|
|
77
|
-
def process_calls
|
|
79
|
+
def process_calls node, true_presences, false_presences
|
|
78
80
|
return unless node.type == :send
|
|
79
81
|
|
|
80
82
|
process_isa(node, true_presences, false_presences)
|
|
@@ -87,7 +89,7 @@ module Solargraph
|
|
|
87
89
|
# @param false_ranges [Array<Range>]
|
|
88
90
|
#
|
|
89
91
|
# @return [void]
|
|
90
|
-
def process_if
|
|
92
|
+
def process_if if_node, true_ranges = [], false_ranges = []
|
|
91
93
|
return if if_node.type != :if
|
|
92
94
|
|
|
93
95
|
#
|
|
@@ -111,13 +113,9 @@ module Solargraph
|
|
|
111
113
|
rest_of_breakable_body = Range.new(get_node_end_position(if_node),
|
|
112
114
|
get_node_end_position(enclosing_breakable_pin.node))
|
|
113
115
|
|
|
114
|
-
if always_breaks?(then_clause)
|
|
115
|
-
false_ranges << rest_of_breakable_body
|
|
116
|
-
end
|
|
116
|
+
false_ranges << rest_of_breakable_body if always_breaks?(then_clause)
|
|
117
117
|
|
|
118
|
-
if always_breaks?(else_clause)
|
|
119
|
-
true_ranges << rest_of_breakable_body
|
|
120
|
-
end
|
|
118
|
+
true_ranges << rest_of_breakable_body if always_breaks?(else_clause)
|
|
121
119
|
end
|
|
122
120
|
|
|
123
121
|
unless enclosing_compound_statement_pin.node.nil?
|
|
@@ -129,13 +127,9 @@ module Solargraph
|
|
|
129
127
|
# statement, we can assume things about the rest of the
|
|
130
128
|
# compound statement
|
|
131
129
|
#
|
|
132
|
-
if always_leaves_compound_statement?(then_clause)
|
|
133
|
-
false_ranges << rest_of_returnable_body
|
|
134
|
-
end
|
|
130
|
+
false_ranges << rest_of_returnable_body if always_leaves_compound_statement?(then_clause)
|
|
135
131
|
|
|
136
|
-
if always_leaves_compound_statement?(else_clause)
|
|
137
|
-
true_ranges << rest_of_returnable_body
|
|
138
|
-
end
|
|
132
|
+
true_ranges << rest_of_returnable_body if always_leaves_compound_statement?(else_clause)
|
|
139
133
|
end
|
|
140
134
|
|
|
141
135
|
unless then_clause.nil?
|
|
@@ -166,7 +160,7 @@ module Solargraph
|
|
|
166
160
|
# @param false_ranges [Array<Range>]
|
|
167
161
|
#
|
|
168
162
|
# @return [void]
|
|
169
|
-
def process_while
|
|
163
|
+
def process_while while_node, true_ranges = [], false_ranges = []
|
|
170
164
|
return if while_node.type != :while
|
|
171
165
|
|
|
172
166
|
#
|
|
@@ -210,7 +204,7 @@ module Solargraph
|
|
|
210
204
|
# @param downcast_not_type [ComplexType, nil]
|
|
211
205
|
#
|
|
212
206
|
# @return [void]
|
|
213
|
-
def add_downcast_var
|
|
207
|
+
def add_downcast_var pin, presence:, downcast_type:, downcast_not_type:
|
|
214
208
|
new_pin = pin.downcast(exclude_return_type: downcast_not_type,
|
|
215
209
|
intersection_return_type: downcast_type,
|
|
216
210
|
source: :flow_sensitive_typing,
|
|
@@ -228,7 +222,7 @@ module Solargraph
|
|
|
228
222
|
# @param presences [Array<Range>]
|
|
229
223
|
#
|
|
230
224
|
# @return [void]
|
|
231
|
-
def process_facts
|
|
225
|
+
def process_facts facts_by_pin, presences
|
|
232
226
|
#
|
|
233
227
|
# Add specialized vars for the rest of the block
|
|
234
228
|
#
|
|
@@ -251,7 +245,7 @@ module Solargraph
|
|
|
251
245
|
# @param false_ranges [Array<Range>]
|
|
252
246
|
#
|
|
253
247
|
# @return [void]
|
|
254
|
-
def process_expression
|
|
248
|
+
def process_expression expression_node, true_ranges, false_ranges
|
|
255
249
|
process_calls(expression_node, true_ranges, false_ranges)
|
|
256
250
|
process_and(expression_node, true_ranges, false_ranges)
|
|
257
251
|
process_or(expression_node, true_ranges, false_ranges)
|
|
@@ -263,7 +257,7 @@ module Solargraph
|
|
|
263
257
|
# @return [Array(String, String), nil] Tuple of rgument to
|
|
264
258
|
# function, then receiver of function if it's a variable,
|
|
265
259
|
# otherwise nil if no simple variable receiver
|
|
266
|
-
def parse_call
|
|
260
|
+
def parse_call call_node, method_name
|
|
267
261
|
return unless call_node&.type == :send && call_node.children[1] == method_name
|
|
268
262
|
# Check if conditional node follows this pattern:
|
|
269
263
|
# s(:send,
|
|
@@ -282,7 +276,7 @@ module Solargraph
|
|
|
282
276
|
# or like this:
|
|
283
277
|
# (lvar :repr)
|
|
284
278
|
# @sg-ignore Need to look at Tuple#include? handling
|
|
285
|
-
variable_name = call_receiver.children[0].to_s if [
|
|
279
|
+
variable_name = call_receiver.children[0].to_s if %i[lvar ivar].include?(call_receiver&.type)
|
|
286
280
|
return unless variable_name
|
|
287
281
|
|
|
288
282
|
[call_arg, variable_name]
|
|
@@ -290,7 +284,7 @@ module Solargraph
|
|
|
290
284
|
|
|
291
285
|
# @param isa_node [Parser::AST::Node]
|
|
292
286
|
# @return [Array(String, String), nil]
|
|
293
|
-
def parse_isa
|
|
287
|
+
def parse_isa isa_node
|
|
294
288
|
call_type_name, variable_name = parse_call(isa_node, :is_a?)
|
|
295
289
|
|
|
296
290
|
return unless call_type_name
|
|
@@ -304,7 +298,7 @@ module Solargraph
|
|
|
304
298
|
# @sg-ignore Solargraph::Parser::FlowSensitiveTyping#find_var
|
|
305
299
|
# return type could not be inferred
|
|
306
300
|
# @return [Solargraph::Pin::LocalVariable, Solargraph::Pin::InstanceVariable, nil]
|
|
307
|
-
def find_var
|
|
301
|
+
def find_var variable_name, position
|
|
308
302
|
if variable_name.start_with?('@')
|
|
309
303
|
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
310
304
|
ivars.find { |ivar| ivar.name == variable_name && (!ivar.presence || ivar.presence.include?(position)) }
|
|
@@ -319,7 +313,7 @@ module Solargraph
|
|
|
319
313
|
# @param false_presences [Array<Range>]
|
|
320
314
|
#
|
|
321
315
|
# @return [void]
|
|
322
|
-
def process_isa
|
|
316
|
+
def process_isa isa_node, true_presences, false_presences
|
|
323
317
|
isa_type_name, variable_name = parse_isa(isa_node)
|
|
324
318
|
return if variable_name.nil? || variable_name.empty?
|
|
325
319
|
# @sg-ignore Need to add nil check here
|
|
@@ -343,7 +337,7 @@ module Solargraph
|
|
|
343
337
|
|
|
344
338
|
# @param nilp_node [Parser::AST::Node]
|
|
345
339
|
# @return [Array(String, String), nil]
|
|
346
|
-
def parse_nilp
|
|
340
|
+
def parse_nilp nilp_node
|
|
347
341
|
parse_call(nilp_node, :nil?)
|
|
348
342
|
end
|
|
349
343
|
|
|
@@ -352,7 +346,7 @@ module Solargraph
|
|
|
352
346
|
# @param false_presences [Array<Range>]
|
|
353
347
|
#
|
|
354
348
|
# @return [void]
|
|
355
|
-
def process_nilp
|
|
349
|
+
def process_nilp nilp_node, true_presences, false_presences
|
|
356
350
|
nilp_arg, variable_name = parse_nilp(nilp_node)
|
|
357
351
|
return if variable_name.nil? || variable_name.empty?
|
|
358
352
|
# if .nil? got an argument, move on, this isn't the situation
|
|
@@ -380,7 +374,7 @@ module Solargraph
|
|
|
380
374
|
|
|
381
375
|
# @param bang_node [Parser::AST::Node]
|
|
382
376
|
# @return [Array(String, String), nil]
|
|
383
|
-
def parse_bang
|
|
377
|
+
def parse_bang bang_node
|
|
384
378
|
parse_call(bang_node, :!)
|
|
385
379
|
end
|
|
386
380
|
|
|
@@ -389,7 +383,7 @@ module Solargraph
|
|
|
389
383
|
# @param false_presences [Array<Range>]
|
|
390
384
|
#
|
|
391
385
|
# @return [void]
|
|
392
|
-
def process_bang
|
|
386
|
+
def process_bang bang_node, true_presences, false_presences
|
|
393
387
|
# pry(main)> require 'parser/current'; Parser::CurrentRuby.parse("!2")
|
|
394
388
|
# => s(:send,
|
|
395
389
|
# s(:int, 2), :!)
|
|
@@ -405,7 +399,7 @@ module Solargraph
|
|
|
405
399
|
# @param var_node [Parser::AST::Node]
|
|
406
400
|
#
|
|
407
401
|
# @return [String, nil] Variable name referenced
|
|
408
|
-
def parse_variable
|
|
402
|
+
def parse_variable var_node
|
|
409
403
|
return if var_node.children.length != 1
|
|
410
404
|
|
|
411
405
|
var_node.children[0]&.to_s
|
|
@@ -415,8 +409,8 @@ module Solargraph
|
|
|
415
409
|
# @param node [Parser::AST::Node]
|
|
416
410
|
# @param true_presences [Array<Range>]
|
|
417
411
|
# @param false_presences [Array<Range>]
|
|
418
|
-
def process_variable
|
|
419
|
-
return unless [
|
|
412
|
+
def process_variable node, true_presences, false_presences
|
|
413
|
+
return unless %i[lvar ivar cvar gvar].include?(node.type)
|
|
420
414
|
|
|
421
415
|
variable_name = parse_variable(node)
|
|
422
416
|
return if variable_name.nil?
|
|
@@ -443,7 +437,7 @@ module Solargraph
|
|
|
443
437
|
# @param node [Parser::AST::Node]
|
|
444
438
|
#
|
|
445
439
|
# @return [String, nil]
|
|
446
|
-
def type_name
|
|
440
|
+
def type_name node
|
|
447
441
|
# e.g.,
|
|
448
442
|
# s(:const, nil, :Baz)
|
|
449
443
|
return unless node&.type == :const
|
|
@@ -462,22 +456,18 @@ module Solargraph
|
|
|
462
456
|
|
|
463
457
|
# @param clause_node [Parser::AST::Node, nil]
|
|
464
458
|
# @sg-ignore need boolish support for ? methods
|
|
465
|
-
def always_breaks?
|
|
459
|
+
def always_breaks? clause_node
|
|
466
460
|
clause_node&.type == :break
|
|
467
461
|
end
|
|
468
462
|
|
|
469
463
|
# @param clause_node [Parser::AST::Node, nil]
|
|
470
|
-
def always_leaves_compound_statement?
|
|
464
|
+
def always_leaves_compound_statement? clause_node
|
|
471
465
|
# https://docs.ruby-lang.org/en/2.2.0/keywords_rdoc.html
|
|
472
466
|
# @sg-ignore Need to look at Tuple#include? handling
|
|
473
|
-
[
|
|
467
|
+
%i[return raise next redo retry].include?(clause_node&.type)
|
|
474
468
|
end
|
|
475
469
|
|
|
476
|
-
attr_reader :locals
|
|
477
|
-
|
|
478
|
-
attr_reader :ivars
|
|
479
|
-
|
|
480
|
-
attr_reader :enclosing_breakable_pin, :enclosing_compound_statement_pin
|
|
470
|
+
attr_reader :locals, :ivars, :enclosing_breakable_pin, :enclosing_compound_statement_pin
|
|
481
471
|
end
|
|
482
472
|
end
|
|
483
473
|
end
|
|
@@ -58,13 +58,13 @@ module Solargraph
|
|
|
58
58
|
# @sg-ignore downcast output of Enumerable#select
|
|
59
59
|
# @return [Solargraph::Pin::Breakable, nil]
|
|
60
60
|
def enclosing_breakable_pin
|
|
61
|
-
pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position)}.last
|
|
61
|
+
pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# @todo downcast output of Enumerable#select
|
|
65
65
|
# @return [Solargraph::Pin::CompoundStatement, nil]
|
|
66
66
|
def enclosing_compound_statement_pin
|
|
67
|
-
pins.select{|pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position)}.last
|
|
67
|
+
pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# @param subregion [Region]
|
|
@@ -80,14 +80,14 @@ module Solargraph
|
|
|
80
80
|
|
|
81
81
|
# @param node [Parser::AST::Node]
|
|
82
82
|
# @return [Solargraph::Location]
|
|
83
|
-
def get_node_location
|
|
83
|
+
def get_node_location node
|
|
84
84
|
range = Parser.node_range(node)
|
|
85
85
|
Location.new(region.filename, range)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# @param node [Parser::AST::Node]
|
|
89
89
|
# @return [String, nil]
|
|
90
|
-
def comments_for
|
|
90
|
+
def comments_for node
|
|
91
91
|
region.source.comments_for(node)
|
|
92
92
|
end
|
|
93
93
|
|
|
@@ -54,7 +54,7 @@ module Solargraph
|
|
|
54
54
|
# @param name [String]
|
|
55
55
|
# @return [Array<Location>]
|
|
56
56
|
def references source, name
|
|
57
|
-
if name.end_with?(
|
|
57
|
+
if name.end_with?('=')
|
|
58
58
|
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
|
59
59
|
# @param code [String]
|
|
60
60
|
# @param offset [Integer]
|
|
@@ -98,17 +98,17 @@ module Solargraph
|
|
|
98
98
|
|
|
99
99
|
# @return [Source::Chain]
|
|
100
100
|
def chain *args
|
|
101
|
-
NodeChainer.chain
|
|
101
|
+
NodeChainer.chain(*args)
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
# @return [Source::Chain]
|
|
105
105
|
def chain_string *args
|
|
106
|
-
NodeChainer.load_string
|
|
106
|
+
NodeChainer.load_string(*args)
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
|
110
110
|
def process_node *args
|
|
111
|
-
Solargraph::Parser::NodeProcessor.process
|
|
111
|
+
Solargraph::Parser::NodeProcessor.process(*args)
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
# @param node [Parser::AST::Node, nil]
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
# A custom builder for source parsers that ignores character encoding
|
|
7
|
-
# issues in literal strings.
|
|
8
|
-
#
|
|
9
|
-
class FlawedBuilder < ::Parser::Builders::Default
|
|
10
|
-
# @param token [::Parser::AST::Node]
|
|
11
|
-
# @return [String]
|
|
12
|
-
# @sg-ignore
|
|
13
|
-
def string_value
|
|
14
|
-
value(token)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
# A custom builder for source parsers that ignores character encoding
|
|
7
|
+
# issues in literal strings.
|
|
8
|
+
#
|
|
9
|
+
class FlawedBuilder < ::Parser::Builders::Default
|
|
10
|
+
# @param token [::Parser::AST::Node]
|
|
11
|
+
# @return [String]
|
|
12
|
+
# @sg-ignore
|
|
13
|
+
def string_value token
|
|
14
|
+
value(token)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|