Class: Solargraph::SourceMap
- Inherits:
-
Object
- Object
- Solargraph::SourceMap
show all
- Defined in:
- lib/solargraph/source_map.rb,
lib/solargraph/source_map/clip.rb,
lib/solargraph/source_map/mapper.rb,
lib/solargraph/source_map/completion.rb
Overview
An index of pins and other ApiMap-related data for a Source.
Defined Under Namespace
Classes: Clip, Completion, Mapper
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(source, pins, locals) ⇒ SourceMap
Returns a new instance of SourceMap.
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/solargraph/source_map.rb', line 26
def initialize source, pins, locals
@source = source.dup
@pins = pins
@locals = locals
environ.merge Convention.for_local(self) unless filename.nil?
self.convention_pins = environ.pins
@pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a)
@pin_select_cache = {}
end
|
Instance Attribute Details
21
22
23
|
# File 'lib/solargraph/source_map.rb', line 21
def locals
@locals
end
|
18
19
20
|
# File 'lib/solargraph/source_map.rb', line 18
def pins
@pins
end
|
15
16
17
|
# File 'lib/solargraph/source_map.rb', line 15
def source
@source
end
|
Class Method Details
.load_string(code, filename = nil) ⇒ SourceMap
166
167
168
169
|
# File 'lib/solargraph/source_map.rb', line 166
def map source
result = SourceMap::Mapper.map(source)
new(source, *result)
end
|
Instance Method Details
#api_hash ⇒ Integer
A hash representing the state of the source map’s API.
ApiMap#catalog uses this value to determine whether it needs to clear its cache.
49
50
51
|
# File 'lib/solargraph/source_map.rb', line 49
def api_hash
@api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node)).hash
end
|
#code ⇒ String
59
60
61
|
# File 'lib/solargraph/source_map.rb', line 59
def code
source.code
end
|
89
90
91
|
# File 'lib/solargraph/source_map.rb', line 89
def cursor_at position
Source::Cursor.new(source, position)
end
|
#document_symbols ⇒ Array<Pin::Base>
all pins except Solargraph::Pin::Reference::Reference
75
76
77
78
79
|
# File 'lib/solargraph/source_map.rb', line 75
def document_symbols
@document_symbols ||= (pins + convention_pins).select do |pin|
pin.path && !pin.path.empty?
end
end
|
69
70
71
|
# File 'lib/solargraph/source_map.rb', line 69
def environ
@environ ||= Environ.new
end
|
#filename ⇒ String
54
55
56
|
# File 'lib/solargraph/source_map.rb', line 54
def filename
source.filename
end
|
#first_pin(path) ⇒ Pin::Base
95
96
97
|
# File 'lib/solargraph/source_map.rb', line 95
def first_pin path
pins.select { |p| p.path == path }.first
end
|
142
143
144
145
146
|
# File 'lib/solargraph/source_map.rb', line 142
def locals_at(location)
return [] if location.filename != filename
closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
locals.select { |pin| pin.visible_at?(closure, location) }
end
|
#locate_block_pin(line, character) ⇒ Pin::Namespace, ...
116
117
118
|
# File 'lib/solargraph/source_map.rb', line 116
def locate_block_pin line, character
_locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
end
|
109
110
111
|
# File 'lib/solargraph/source_map.rb', line 109
def locate_named_path_pin line, character
_locate_pin line, character, Pin::Namespace, Pin::Method
end
|
101
102
103
104
|
# File 'lib/solargraph/source_map.rb', line 101
def locate_pins location
(pins + locals).select { |pin| pin.location == location }
end
|
#pins_by_class(klass) ⇒ Array<Pin::Base>
39
40
41
|
# File 'lib/solargraph/source_map.rb', line 39
def pins_by_class klass
@pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten
end
|
#query_symbols(query) ⇒ Array<Pin::Base>
83
84
85
|
# File 'lib/solargraph/source_map.rb', line 83
def query_symbols query
Pin::Search.new(document_symbols, query).results
end
|
#references(name) ⇒ Array<Location>
136
137
138
|
# File 'lib/solargraph/source_map.rb', line 136
def references name
source.references name
end
|
64
65
66
|
# File 'lib/solargraph/source_map.rb', line 64
def requires
pins_by_class(Pin::Reference::Require)
end
|
#try_merge!(other_map) ⇒ Boolean
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/solargraph/source_map.rb', line 122
def try_merge! other_map
return false if pins.length != other_map.pins.length || locals.length != other_map.locals.length || requires.map(&:name).uniq.sort != other_map.requires.map(&:name).uniq.sort
pins.each_index do |i|
return false unless pins[i].try_merge!(other_map.pins[i])
end
locals.each_index do |i|
return false unless locals[i].try_merge!(other_map.locals[i])
end
@source = other_map.source
true
end
|