solargraph 0.46.0 → 0.54.5
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/FUNDING.yml +1 -0
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +37 -41
- data/.github/workflows/typecheck.yml +34 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.yardopts +2 -2
- data/CHANGELOG.md +1338 -1115
- data/Gemfile +0 -0
- data/LICENSE +1 -1
- data/README.md +131 -128
- data/Rakefile +0 -0
- data/SPONSORS.md +10 -18
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/cache.rb +109 -70
- data/lib/solargraph/api_map/index.rb +167 -0
- data/lib/solargraph/api_map/source_to_yard.rb +88 -81
- data/lib/solargraph/api_map/store.rb +260 -256
- data/lib/solargraph/api_map.rb +870 -686
- data/lib/solargraph/bench.rb +44 -27
- data/lib/solargraph/cache.rb +77 -0
- data/lib/solargraph/complex_type/type_methods.rb +217 -130
- data/lib/solargraph/complex_type/unique_type.rb +386 -75
- data/lib/solargraph/complex_type.rb +394 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rakefile.rb +17 -0
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +17 -12
- data/lib/solargraph/converters/dl.rb +15 -12
- data/lib/solargraph/converters/dt.rb +15 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +113 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +55 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/doc_map.rb +188 -0
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/equality.rb +33 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- 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 +128 -111
- data/lib/solargraph/language_server/host/message_worker.rb +106 -59
- data/lib/solargraph/language_server/host/sources.rb +99 -156
- data/lib/solargraph/language_server/host.rb +861 -865
- data/lib/solargraph/language_server/message/base.rb +96 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +191 -162
- data/lib/solargraph/language_server/message/initialized.rb +28 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +94 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/progress.rb +135 -0
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +68 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +20 -19
- data/lib/solargraph/library.rb +663 -546
- data/lib/solargraph/location.rb +58 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +89 -83
- data/lib/solargraph/parser/comment_ripper.rb +56 -52
- data/lib/solargraph/parser/node_methods.rb +83 -43
- data/lib/solargraph/parser/node_processor/base.rb +87 -77
- data/lib/solargraph/parser/node_processor.rb +45 -43
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/snippet.rb +15 -13
- data/lib/solargraph/parser.rb +22 -26
- data/lib/solargraph/pin/base.rb +378 -296
- data/lib/solargraph/pin/base_variable.rb +118 -84
- data/lib/solargraph/pin/block.rb +101 -72
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +57 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +123 -96
- data/lib/solargraph/pin/delegated_method.rb +101 -0
- data/lib/solargraph/pin/documenting.rb +98 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +34 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +67 -55
- data/lib/solargraph/pin/method.rb +527 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +107 -91
- data/lib/solargraph/pin/parameter.rb +212 -201
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +22 -14
- data/lib/solargraph/pin/search.rb +56 -56
- data/lib/solargraph/pin/signature.rb +17 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +41 -37
- data/lib/solargraph/position.rb +107 -100
- data/lib/solargraph/range.rb +98 -95
- data/lib/solargraph/rbs_map/conversions.rb +646 -0
- data/lib/solargraph/rbs_map/core_fills.rb +50 -0
- data/lib/solargraph/rbs_map/core_map.rb +28 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
- data/lib/solargraph/rbs_map.rb +93 -0
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +269 -226
- data/lib/solargraph/source/chain/array.rb +33 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +303 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +89 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +33 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/if.rb +28 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +98 -71
- data/lib/solargraph/source/chain/literal.rb +28 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +252 -164
- data/lib/solargraph/source/change.rb +82 -79
- data/lib/solargraph/source/cursor.rb +167 -164
- data/lib/solargraph/source/source_chainer.rb +194 -191
- data/lib/solargraph/source/updater.rb +55 -54
- data/lib/solargraph/source.rb +495 -522
- data/lib/solargraph/source_map/clip.rb +232 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map/mapper.rb +255 -212
- data/lib/solargraph/source_map.rb +217 -180
- data/lib/solargraph/type_checker/checks.rb +120 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +62 -57
- data/lib/solargraph/type_checker.rb +672 -543
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +56 -58
- data/lib/solargraph/workspace/config.rb +239 -231
- data/lib/solargraph/workspace.rb +239 -215
- data/lib/solargraph/yard_map/cache.rb +25 -19
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
- data/lib/solargraph/yard_map/mapper.rb +78 -77
- data/lib/solargraph/yard_map/to_method.rb +86 -79
- data/lib/solargraph/yard_map.rb +18 -460
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +72 -69
- data/solargraph.gemspec +21 -10
- metadata +184 -115
- data/.travis.yml +0 -19
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/compat.rb +0 -37
- data/lib/solargraph/convention/rspec.rb +0 -30
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/yard_map/core_docs.rb +0 -170
- data/lib/solargraph/yard_map/core_fills.rb +0 -208
- data/lib/solargraph/yard_map/core_gen.rb +0 -76
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
- data/lib/yard-solargraph.rb +0 -33
- data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,191 +1,194 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
class Source
|
5
|
-
# Information about a location in a source, including the location's word
|
6
|
-
# and signature, literal values at the base of signatures, and whether the
|
7
|
-
# location is inside a string or comment. ApiMaps use Fragments to provide
|
8
|
-
# results for completion and definition queries.
|
9
|
-
#
|
10
|
-
class SourceChainer
|
11
|
-
# include Source::NodeMethods
|
12
|
-
|
13
|
-
private_class_method :new
|
14
|
-
|
15
|
-
class << self
|
16
|
-
# @param source [Source]
|
17
|
-
# @param position [Position]
|
18
|
-
# @return [Source::Chain]
|
19
|
-
def chain source, position
|
20
|
-
new(source, position).chain
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# @param source [Source]
|
25
|
-
# @param position [Position]
|
26
|
-
def initialize source, position
|
27
|
-
@source = source
|
28
|
-
@position = position
|
29
|
-
@calculated_literal = false
|
30
|
-
end
|
31
|
-
|
32
|
-
# @return [Source::Chain]
|
33
|
-
def chain
|
34
|
-
# Special handling for files that end with an integer and a period
|
35
|
-
return Chain.new([Chain::Literal.new('Integer'), Chain::UNDEFINED_CALL]) if phrase =~ /^[0-9]+\.$/
|
36
|
-
return Chain.new([Chain::Literal.new('Symbol')]) if phrase.start_with?(':') && !phrase.start_with?('::')
|
37
|
-
return SourceChainer.chain(source, Position.new(position.line, position.character + 1)) if end_of_phrase.strip == '::' && source.code[Position.to_offset(source.code, position)].to_s.match?(/[a-z]/i)
|
38
|
-
begin
|
39
|
-
return Chain.new([]) if phrase.end_with?('..')
|
40
|
-
node = nil
|
41
|
-
parent = nil
|
42
|
-
if !source.repaired? && source.parsed? && source.synchronized?
|
43
|
-
tree = source.tree_at(position.line, position.column)
|
44
|
-
|
45
|
-
|
46
|
-
node, parent =
|
47
|
-
|
48
|
-
|
49
|
-
node = Parser.parse(fixed_phrase)
|
50
|
-
else
|
51
|
-
node, parent = source.tree_at(fixed_position.line, fixed_position.column)[0..2] unless source.error_ranges.any?{|r| r.nil? || r.include?(fixed_position)}
|
52
|
-
# Exception for positions that chain literal nodes in unsynchronized sources
|
53
|
-
node = nil unless source.synchronized? || !Parser.infer_literal_node_type(node).nil?
|
54
|
-
node = Parser.parse(fixed_phrase) if node.nil?
|
55
|
-
end
|
56
|
-
rescue Parser::SyntaxError
|
57
|
-
return Chain.new([Chain::UNDEFINED_CALL])
|
58
|
-
end
|
59
|
-
return Chain.new([Chain::UNDEFINED_CALL]) if node.nil? || (node.type == :sym && !phrase.start_with?(':'))
|
60
|
-
# chain = NodeChainer.chain(node, source.filename, parent && parent.type == :block)
|
61
|
-
chain = Parser.chain(node, source.filename, parent
|
62
|
-
if source.repaired? || !source.parsed? || !source.synchronized?
|
63
|
-
if end_of_phrase.strip == '.'
|
64
|
-
chain.links.push Chain::UNDEFINED_CALL
|
65
|
-
elsif end_of_phrase.strip == '::'
|
66
|
-
chain.links.push Chain::UNDEFINED_CONSTANT
|
67
|
-
end
|
68
|
-
elsif chain.links.last.is_a?(Source::Chain::Constant) && end_of_phrase.strip == '::'
|
69
|
-
chain.links.push Source::Chain::UNDEFINED_CONSTANT
|
70
|
-
end
|
71
|
-
chain
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
# @return [Position]
|
77
|
-
attr_reader :position
|
78
|
-
|
79
|
-
# @return [Solargraph::Source]
|
80
|
-
attr_reader :source
|
81
|
-
|
82
|
-
# @return [String]
|
83
|
-
def phrase
|
84
|
-
@phrase ||= source.code[signature_data..offset-1]
|
85
|
-
end
|
86
|
-
|
87
|
-
# @return [String]
|
88
|
-
def fixed_phrase
|
89
|
-
@fixed_phrase ||= phrase[0..-(end_of_phrase.length+1)]
|
90
|
-
end
|
91
|
-
|
92
|
-
# @return [Position]
|
93
|
-
def fixed_position
|
94
|
-
@fixed_position ||= Position.from_offset(source.code, offset - end_of_phrase.length)
|
95
|
-
end
|
96
|
-
|
97
|
-
# @return [String]
|
98
|
-
def end_of_phrase
|
99
|
-
@end_of_phrase ||= begin
|
100
|
-
match = phrase.match(/[\s]*(\.{1}|::)[\s]*$/)
|
101
|
-
if match
|
102
|
-
match[0]
|
103
|
-
else
|
104
|
-
''
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
# True if the current offset is inside a string.
|
110
|
-
#
|
111
|
-
# @return [Boolean]
|
112
|
-
def string?
|
113
|
-
# @string ||= (node.type == :str or node.type == :dstr)
|
114
|
-
@string ||= @source.string_at?(position)
|
115
|
-
end
|
116
|
-
|
117
|
-
# @return [Integer]
|
118
|
-
def offset
|
119
|
-
@offset ||= get_offset(position.line, position.column)
|
120
|
-
end
|
121
|
-
|
122
|
-
# @param line [Integer]
|
123
|
-
# @param column [Integer]
|
124
|
-
# @return [Integer]
|
125
|
-
def get_offset line, column
|
126
|
-
Position.line_char_to_offset(@source.code, line, column)
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
break if
|
145
|
-
if brackets
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
if
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class Source
|
5
|
+
# Information about a location in a source, including the location's word
|
6
|
+
# and signature, literal values at the base of signatures, and whether the
|
7
|
+
# location is inside a string or comment. ApiMaps use Fragments to provide
|
8
|
+
# results for completion and definition queries.
|
9
|
+
#
|
10
|
+
class SourceChainer
|
11
|
+
# include Source::NodeMethods
|
12
|
+
|
13
|
+
private_class_method :new
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# @param source [Source]
|
17
|
+
# @param position [Position, Array(Integer, Integer)]
|
18
|
+
# @return [Source::Chain]
|
19
|
+
def chain source, position
|
20
|
+
new(source, Solargraph::Position.normalize(position)).chain
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param source [Source]
|
25
|
+
# @param position [Position]
|
26
|
+
def initialize source, position
|
27
|
+
@source = source
|
28
|
+
@position = position
|
29
|
+
@calculated_literal = false
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Source::Chain]
|
33
|
+
def chain
|
34
|
+
# Special handling for files that end with an integer and a period
|
35
|
+
return Chain.new([Chain::Literal.new('Integer'), Chain::UNDEFINED_CALL]) if phrase =~ /^[0-9]+\.$/
|
36
|
+
return Chain.new([Chain::Literal.new('Symbol')]) if phrase.start_with?(':') && !phrase.start_with?('::')
|
37
|
+
return SourceChainer.chain(source, Position.new(position.line, position.character + 1)) if end_of_phrase.strip == '::' && source.code[Position.to_offset(source.code, position)].to_s.match?(/[a-z]/i)
|
38
|
+
begin
|
39
|
+
return Chain.new([]) if phrase.end_with?('..')
|
40
|
+
node = nil
|
41
|
+
parent = nil
|
42
|
+
if !source.repaired? && source.parsed? && source.synchronized?
|
43
|
+
tree = source.tree_at(position.line, position.column)
|
44
|
+
node, parent = tree[0..2]
|
45
|
+
elsif source.parsed? && source.repaired? && end_of_phrase == '.'
|
46
|
+
node, parent = source.tree_at(fixed_position.line, fixed_position.column)[0..2]
|
47
|
+
node = Parser.parse(fixed_phrase) if node.nil?
|
48
|
+
elsif source.repaired?
|
49
|
+
node = Parser.parse(fixed_phrase)
|
50
|
+
else
|
51
|
+
node, parent = source.tree_at(fixed_position.line, fixed_position.column)[0..2] unless source.error_ranges.any?{|r| r.nil? || r.include?(fixed_position)}
|
52
|
+
# Exception for positions that chain literal nodes in unsynchronized sources
|
53
|
+
node = nil unless source.synchronized? || !Parser.infer_literal_node_type(node).nil?
|
54
|
+
node = Parser.parse(fixed_phrase) if node.nil?
|
55
|
+
end
|
56
|
+
rescue Parser::SyntaxError
|
57
|
+
return Chain.new([Chain::UNDEFINED_CALL])
|
58
|
+
end
|
59
|
+
return Chain.new([Chain::UNDEFINED_CALL]) if node.nil? || (node.type == :sym && !phrase.start_with?(':'))
|
60
|
+
# chain = NodeChainer.chain(node, source.filename, parent && parent.type == :block)
|
61
|
+
chain = Parser.chain(node, source.filename, parent)
|
62
|
+
if source.repaired? || !source.parsed? || !source.synchronized?
|
63
|
+
if end_of_phrase.strip == '.'
|
64
|
+
chain.links.push Chain::UNDEFINED_CALL
|
65
|
+
elsif end_of_phrase.strip == '::'
|
66
|
+
chain.links.push Chain::UNDEFINED_CONSTANT
|
67
|
+
end
|
68
|
+
elsif chain.links.last.is_a?(Source::Chain::Constant) && end_of_phrase.strip == '::'
|
69
|
+
chain.links.push Source::Chain::UNDEFINED_CONSTANT
|
70
|
+
end
|
71
|
+
chain
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
# @return [Position]
|
77
|
+
attr_reader :position
|
78
|
+
|
79
|
+
# @return [Solargraph::Source]
|
80
|
+
attr_reader :source
|
81
|
+
|
82
|
+
# @return [String]
|
83
|
+
def phrase
|
84
|
+
@phrase ||= source.code[signature_data..offset-1]
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [String]
|
88
|
+
def fixed_phrase
|
89
|
+
@fixed_phrase ||= phrase[0..-(end_of_phrase.length+1)]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Position]
|
93
|
+
def fixed_position
|
94
|
+
@fixed_position ||= Position.from_offset(source.code, offset - end_of_phrase.length)
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [String]
|
98
|
+
def end_of_phrase
|
99
|
+
@end_of_phrase ||= begin
|
100
|
+
match = phrase.match(/[\s]*(\.{1}|::)[\s]*$/)
|
101
|
+
if match
|
102
|
+
match[0]
|
103
|
+
else
|
104
|
+
''
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# True if the current offset is inside a string.
|
110
|
+
#
|
111
|
+
# @return [Boolean]
|
112
|
+
def string?
|
113
|
+
# @string ||= (node.type == :str or node.type == :dstr)
|
114
|
+
@string ||= @source.string_at?(position)
|
115
|
+
end
|
116
|
+
|
117
|
+
# @return [Integer]
|
118
|
+
def offset
|
119
|
+
@offset ||= get_offset(position.line, position.column)
|
120
|
+
end
|
121
|
+
|
122
|
+
# @param line [Integer]
|
123
|
+
# @param column [Integer]
|
124
|
+
# @return [Integer]
|
125
|
+
def get_offset line, column
|
126
|
+
Position.line_char_to_offset(@source.code, line, column)
|
127
|
+
end
|
128
|
+
|
129
|
+
# @return [Integer]
|
130
|
+
def signature_data
|
131
|
+
@signature_data ||= get_signature_data_at(offset)
|
132
|
+
end
|
133
|
+
|
134
|
+
# @param index [Integer]
|
135
|
+
# @return [Integer]
|
136
|
+
def get_signature_data_at index
|
137
|
+
brackets = 0
|
138
|
+
squares = 0
|
139
|
+
parens = 0
|
140
|
+
index -=1
|
141
|
+
in_whitespace = false
|
142
|
+
while index >= 0
|
143
|
+
pos = Position.from_offset(@source.code, index)
|
144
|
+
break if index > 0 and @source.comment_at?(pos)
|
145
|
+
break if brackets > 0 or parens > 0 or squares > 0
|
146
|
+
char = @source.code[index, 1]
|
147
|
+
break if char.nil? # @todo Is this the right way to handle this?
|
148
|
+
if brackets.zero? and parens.zero? and squares.zero? and [' ', "\r", "\n", "\t"].include?(char)
|
149
|
+
in_whitespace = true
|
150
|
+
else
|
151
|
+
if brackets.zero? and parens.zero? and squares.zero? and in_whitespace
|
152
|
+
unless char == '.' or @source.code[index+1..-1].strip.start_with?('.')
|
153
|
+
old = @source.code[index+1..-1]
|
154
|
+
nxt = @source.code[index+1..-1].lstrip
|
155
|
+
index += (@source.code[index+1..-1].length - @source.code[index+1..-1].lstrip.length)
|
156
|
+
break
|
157
|
+
end
|
158
|
+
end
|
159
|
+
if char == ')'
|
160
|
+
parens -=1
|
161
|
+
elsif char == ']'
|
162
|
+
squares -=1
|
163
|
+
elsif char == '}'
|
164
|
+
brackets -= 1
|
165
|
+
elsif char == '('
|
166
|
+
parens += 1
|
167
|
+
elsif char == '{'
|
168
|
+
brackets += 1
|
169
|
+
elsif char == '['
|
170
|
+
squares += 1
|
171
|
+
end
|
172
|
+
if brackets.zero? and parens.zero? and squares.zero?
|
173
|
+
break if ['"', "'", ',', ';', '%'].include?(char)
|
174
|
+
break if ['!', '?'].include?(char) && index < offset - 1
|
175
|
+
break if char == '$'
|
176
|
+
if char == '@'
|
177
|
+
index -= 1
|
178
|
+
if @source.code[index, 1] == '@'
|
179
|
+
index -= 1
|
180
|
+
end
|
181
|
+
break
|
182
|
+
end
|
183
|
+
elsif parens == 1 || brackets == 1 || squares == 1
|
184
|
+
break
|
185
|
+
end
|
186
|
+
in_whitespace = false
|
187
|
+
end
|
188
|
+
index -= 1
|
189
|
+
end
|
190
|
+
index + 1
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -1,54 +1,55 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
class Source
|
5
|
-
# Updaters contain changes to be applied to a source. The source applies
|
6
|
-
# the update via the Source#synchronize method.
|
7
|
-
#
|
8
|
-
class Updater
|
9
|
-
# @return [String]
|
10
|
-
attr_reader :filename
|
11
|
-
|
12
|
-
# @return [Integer]
|
13
|
-
attr_reader :version
|
14
|
-
|
15
|
-
# @return [Array<Change>]
|
16
|
-
attr_reader :changes
|
17
|
-
|
18
|
-
# @param filename [String] The file to update.
|
19
|
-
# @param version [Integer] A version number associated with this update.
|
20
|
-
# @param changes [Array<Solargraph::Source::Change>] The changes.
|
21
|
-
def initialize filename, version, changes
|
22
|
-
@filename = filename
|
23
|
-
@version = version
|
24
|
-
@changes = changes
|
25
|
-
@input = nil
|
26
|
-
@did_nullify = nil
|
27
|
-
@output = nil
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param text [String]
|
31
|
-
# @param nullable [Boolean]
|
32
|
-
# @return [String]
|
33
|
-
def write text, nullable = false
|
34
|
-
can_nullify = (nullable and changes.length == 1)
|
35
|
-
return @output if @input == text and can_nullify == @did_nullify
|
36
|
-
@input = text
|
37
|
-
@output = text
|
38
|
-
@did_nullify = can_nullify
|
39
|
-
changes.each do |ch|
|
40
|
-
@output = ch.write(@output, can_nullify)
|
41
|
-
end
|
42
|
-
@output
|
43
|
-
end
|
44
|
-
|
45
|
-
# @
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class Source
|
5
|
+
# Updaters contain changes to be applied to a source. The source applies
|
6
|
+
# the update via the Source#synchronize method.
|
7
|
+
#
|
8
|
+
class Updater
|
9
|
+
# @return [String]
|
10
|
+
attr_reader :filename
|
11
|
+
|
12
|
+
# @return [Integer]
|
13
|
+
attr_reader :version
|
14
|
+
|
15
|
+
# @return [Array<Change>]
|
16
|
+
attr_reader :changes
|
17
|
+
|
18
|
+
# @param filename [String] The file to update.
|
19
|
+
# @param version [Integer] A version number associated with this update.
|
20
|
+
# @param changes [Array<Solargraph::Source::Change>] The changes.
|
21
|
+
def initialize filename, version, changes
|
22
|
+
@filename = filename
|
23
|
+
@version = version
|
24
|
+
@changes = changes
|
25
|
+
@input = nil
|
26
|
+
@did_nullify = nil
|
27
|
+
@output = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param text [String]
|
31
|
+
# @param nullable [Boolean]
|
32
|
+
# @return [String]
|
33
|
+
def write text, nullable = false
|
34
|
+
can_nullify = (nullable and changes.length == 1)
|
35
|
+
return @output if @input == text and can_nullify == @did_nullify
|
36
|
+
@input = text
|
37
|
+
@output = text
|
38
|
+
@did_nullify = can_nullify
|
39
|
+
changes.each do |ch|
|
40
|
+
@output = ch.write(@output, can_nullify)
|
41
|
+
end
|
42
|
+
@output
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param text [String]
|
46
|
+
# @return [String]
|
47
|
+
def repair text
|
48
|
+
changes.each do |ch|
|
49
|
+
text = ch.repair(text)
|
50
|
+
end
|
51
|
+
text
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|