solargraph 0.25.0 → 0.25.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efdf4fdf971f5d10e148b73902701dae0ce549ef38f7304455fefba0465f4e90
4
- data.tar.gz: 49c3fcc4fb9c3ad339e7e08c256275ac73907edc62f239a4b315938c18b68661
3
+ metadata.gz: 2bd332c0e24354eee990335169e5d861e470714cf3f3431b41c5d7e184f33035
4
+ data.tar.gz: a4ce050c8e2e9ef1990c9be69dc2a4a6457cf27bc9b7ba85168014c30da77480
5
5
  SHA512:
6
- metadata.gz: d3bddec5d8f6f083905349634b6a36144b5e069b1b94abf0d2ab3e3f074e8bc851ceb79a6d42cee9b2aa9af4645f3ed04347228a16db08fc3b94b7ff974aa0e3
7
- data.tar.gz: 6b384c71d2a38c4e5cd02cabb2801d0b57cf5c5f2eb81d63cb56e37fb90b24c030d308cd2e75dc3977963841d1dfcb1f1e33eb8f220a759b83580296c40fb413
6
+ metadata.gz: 9cd5cfb006e654069b88c596dea33d6be250bda7569a1193c834336345fa927d0b28b48fdfa5c37f68f3ce56ffc6cf6e647cda4e6184cbb566e8ad68ef3ac339
7
+ data.tar.gz: 9846d874b79d01132a0fdb8ad7dd6f0cf81682a1fb9e1f3d72602d8ca3330380fba455f9c4d7f9e624bb40b2dff21d39fcef42c4273832c549b296c4a98b4a24
data/lib/solargraph.rb CHANGED
@@ -8,6 +8,7 @@ module Solargraph
8
8
  class DiagnosticsError < RuntimeError; end
9
9
  class FileNotFoundError < RuntimeError; end
10
10
  class SourceNotAvailableError < StandardError; end
11
+ class ComplexTypeError < StandardError; end
11
12
  class WorkspaceTooLargeError < RuntimeError
12
13
  # @return [Integer]
13
14
  attr_reader :size
@@ -629,10 +629,12 @@ module Solargraph
629
629
  @path_macros ||= {}
630
630
  end
631
631
 
632
+ # @return [Array<Solargraph::Source>]
632
633
  def current_workspace_sources
633
634
  @sources - [@virtual_source]
634
635
  end
635
636
 
637
+ # @return [String]
636
638
  def inner_qualify name, root, skip
637
639
  return nil if name.nil?
638
640
  return nil if skip.include?(root)
@@ -21,10 +21,19 @@ module Solargraph
21
21
  def initialize name, substring = ''
22
22
  @name = name
23
23
  @substring = substring
24
- @tag = name
25
- @tag += "<#{substring}>" unless substring.empty?
24
+ @tag = name + substring
25
+ @key_types = []
26
26
  @subtypes = []
27
- @subtypes.concat(ComplexType.parse(substring)) unless substring.empty?
27
+ if parameters?
28
+ subs = ComplexType.parse(substring[1..-2])
29
+ if hash_parameters?
30
+ raise ComplexTypeError, "Bad hash type" unless subs.length == 2 and subs[0].is_a?(Array) and subs[1].is_a?(Array)
31
+ @key_types.concat subs[0]
32
+ @subtypes.concat subs[1]
33
+ else
34
+ @subtypes.concat subs
35
+ end
36
+ end
28
37
  end
29
38
 
30
39
  # @return [Boolean]
@@ -37,6 +46,36 @@ module Solargraph
37
46
  @nil_type ||= (name.downcase == 'nil')
38
47
  end
39
48
 
49
+ # @return [Boolean]
50
+ def parameters?
51
+ !substring.empty?
52
+ end
53
+
54
+ # @return [Boolean]
55
+ def list_parameters?
56
+ substring.start_with?('<')
57
+ end
58
+
59
+ # @return [Boolean]
60
+ def fixed_parameters?
61
+ substring.start_with?('(')
62
+ end
63
+
64
+ # @return [Boolean]
65
+ def hash_parameters?
66
+ substring.start_with?('{')
67
+ end
68
+
69
+ # @return [Array<ComplexType>]
70
+ def value_types
71
+ @subtypes
72
+ end
73
+
74
+ # @return [Array<ComplexType>]
75
+ def key_types
76
+ @key_types
77
+ end
78
+
40
79
  # @return [String]
41
80
  def namespace
42
81
  @namespace ||= 'Object' if duck_type?
@@ -60,37 +99,70 @@ module Solargraph
60
99
  # @return [Array<ComplexType>]
61
100
  def parse *strings
62
101
  types = []
102
+ key_types = nil
63
103
  strings.each do |type_string|
64
104
  point_stack = 0
65
105
  curly_stack = 0
106
+ paren_stack = 0
66
107
  base = ''
67
108
  subtype_string = ''
68
109
  type_string.each_char do |char|
69
- if char == '<'
110
+ if char == '='
111
+ #raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
112
+ elsif char == '<'
70
113
  point_stack += 1
71
- next if point_stack == 1
72
114
  elsif char == '>'
73
- point_stack -= 1
74
- raise "Invalid close in type #{type_string}" if point_stack < 0
115
+ if subtype_string.end_with?('=') and curly_stack > 0
116
+ subtype_string += char
117
+ elsif base.end_with?('=')
118
+ raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
119
+ types.push ComplexType.new(base[0..-2].strip)
120
+ key_types = types
121
+ types = []
122
+ base = ''
123
+ subtype_string = ''
124
+ next
125
+ else
126
+ point_stack -= 1
127
+ subtype_string += char if point_stack == 0
128
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack < 0
129
+ end
130
+ next
75
131
  elsif char == '{'
76
- # @todo Temporarily short-circuiting types with {}
77
- break
78
- elsif char == ',' and point_stack == 0
132
+ curly_stack += 1
133
+ elsif char == '}'
134
+ curly_stack -= 1
135
+ subtype_string += char
136
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
137
+ # types.push ComplexType.parse(subtype_string[1..-2]) if curly_stack == 0
138
+ next
139
+ elsif char == '('
140
+ paren_stack += 1
141
+ elsif char == ')'
142
+ paren_stack -= 1
143
+ subtype_string += char if paren_stack == 0
144
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
145
+ next
146
+ elsif char == ',' and point_stack == 0 and curly_stack == 0 and paren_stack == 0
79
147
  types.push ComplexType.new base.strip, subtype_string.strip
80
148
  base = ''
81
149
  subtype_string = ''
82
150
  next
83
151
  end
84
- if point_stack == 0 and char != '>'
152
+ if point_stack == 0 and curly_stack == 0 and paren_stack == 0
85
153
  base += char
86
- elsif point_stack != 0
154
+ else
87
155
  subtype_string += char
88
156
  end
89
157
  end
90
158
  base.strip!
91
159
  subtype_string.strip!
92
- raise 'Unclosed subtype' if point_stack != 0
93
- types.push ComplexType.new base, subtype_string
160
+ raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 or curly_stack != 0 or paren_stack != 0
161
+ types.push ComplexType.new(base, subtype_string)
162
+ end
163
+ unless key_types.nil?
164
+ return key_types if types.empty?
165
+ return [key_types, types]
94
166
  end
95
167
  types
96
168
  end
@@ -492,17 +492,17 @@ module Solargraph
492
492
  @diagnostics_queue.push change['textDocument']['uri']
493
493
  changed = true
494
494
  next true
495
- # elsif change['textDocument']['version'] == source.version + 1 #and change['contentChanges'].length == 0
496
- # # HACK: This condition fixes the fact that formatting
497
- # # increments the version by one regardless of the number
498
- # # of changes
499
- # STDERR.puts "Warning: change applied to #{uri_to_file(change['textDocument']['uri'])} is possibly out of sync"
500
- # pending[change['textDocument']['uri']] -= 1
501
- # updater = generate_updater(change)
502
- # library.synchronize updater, pending[change['textDocument']['uri']] == 0
503
- # @diagnostics_queue.push change['textDocument']['uri']
504
- # changed = true
505
- # next true
495
+ elsif change['textDocument']['version'] == source.version + 1
496
+ # HACK: This condition fixes the fact that certain changes
497
+ # increment the version by one regardless of the number of
498
+ # changes
499
+ STDERR.puts "Warning: change applied to #{uri_to_file(change['textDocument']['uri'])} is possibly out of sync"
500
+ pending[change['textDocument']['uri']] -= 1
501
+ updater = generate_updater(change)
502
+ library.synchronize updater, pending[change['textDocument']['uri']] == 0
503
+ @diagnostics_queue.push change['textDocument']['uri']
504
+ changed = true
505
+ next true
506
506
  elsif change['textDocument']['version'] <= source.version
507
507
  # @todo Is deleting outdated changes correct behavior?
508
508
  STDERR.puts "Warning: outdated change to #{change['textDocument']['uri']} was ignored"
@@ -510,6 +510,7 @@ module Solargraph
510
510
  next true
511
511
  else
512
512
  # @todo Change is out of order. Save it for later
513
+ STDERR.puts "Skipping out of order change to #{change['textDocument']['uri']}"
513
514
  next false
514
515
  end
515
516
  end
@@ -72,6 +72,7 @@ module Solargraph
72
72
 
73
73
  private
74
74
 
75
+ # @return [Array<ComplexType>]
75
76
  def generate_complex_types
76
77
  tag = docstring.tag(:return)
77
78
  if tag.nil?
@@ -79,7 +80,12 @@ module Solargraph
79
80
  tag = ol.tag(:return) unless ol.nil?
80
81
  end
81
82
  return [] if tag.nil?
82
- ComplexType.parse *tag.types
83
+ begin
84
+ ComplexType.parse *tag.types
85
+ rescue Solargraph::ComplexTypeError => e
86
+ STDERR.puts e.message
87
+ []
88
+ end
83
89
  end
84
90
  end
85
91
  end
@@ -343,6 +343,7 @@ module Solargraph
343
343
  @locals = new_locals
344
344
  @requires = new_requires
345
345
  @symbols = new_symbols
346
+ @all_symbols = nil # Reset for future queries
346
347
  @domains = []
347
348
  @path_macros = {}
348
349
  dirpins = []
@@ -84,7 +84,7 @@ module Solargraph
84
84
  #
85
85
  # @return [String]
86
86
  def signature
87
- @signature ||= signature_data[1]
87
+ @signature ||= signature_data[1].to_s
88
88
  end
89
89
 
90
90
  def valid?
@@ -128,7 +128,7 @@ module Solargraph
128
128
 
129
129
  # @return [String]
130
130
  def chain
131
- @chain ||= signature.split('.')[1..-1].join('.')
131
+ @chain ||= ( signature.empty? ? '' : signature.split('.')[1..-1].join('.') )
132
132
  end
133
133
 
134
134
  # @return [String]
@@ -393,7 +393,7 @@ module Solargraph
393
393
  # @param index [Integer]
394
394
  # @return [String]
395
395
  def word_at index
396
- @code[beginning_of_word_at(index)..index - 1]
396
+ @code[beginning_of_word_at(index)..index - 1].to_s
397
397
  end
398
398
 
399
399
  def beginning_of_word_at index
@@ -442,6 +442,7 @@ module Solargraph
442
442
  Solargraph::Source::Range.from_to(start_pos[0], start_pos[1], end_pos[0], end_pos[1])
443
443
  end
444
444
 
445
+ # @return [String]
445
446
  def remainder_at index
446
447
  cursor = index
447
448
  while cursor < @code.length
@@ -450,7 +451,7 @@ module Solargraph
450
451
  break unless char.match(/[a-z0-9_\?\!]/i)
451
452
  cursor += 1
452
453
  end
453
- @code[index..cursor-1]
454
+ @code[index..cursor-1].to_s
454
455
  end
455
456
 
456
457
  def signature_position
@@ -50,9 +50,13 @@ module Solargraph
50
50
  # @param node [Parser::AST::Node]
51
51
  # @return [String]
52
52
  def code_for node
53
+ # @todo Using node locations on code with converted EOLs seems
54
+ # slightly more efficient than calculating offsets.
53
55
  b = node.location.expression.begin.begin_pos
54
56
  e = node.location.expression.end.end_pos
55
- frag = @code[b..e-1].to_s
57
+ # b = Source::Position.line_char_to_offset(@code, node.location.line - 1, node.location.column)
58
+ # e = Source::Position.line_char_to_offset(@code, node.location.last_line - 1, node.location.last_column)
59
+ frag = source_from_parser[b..e-1].to_s
56
60
  frag.strip.gsub(/,$/, '')
57
61
  end
58
62
 
@@ -406,6 +410,10 @@ module Solargraph
406
410
  }
407
411
  args
408
412
  end
413
+
414
+ def source_from_parser
415
+ @source_from_parser ||= @code.gsub(/\r\n/, "\n")
416
+ end
409
417
  end
410
418
  end
411
419
  end
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.25.0'
2
+ VERSION = '0.25.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.25.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-17 00:00:00.000000000 Z
11
+ date: 2018-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser