class Solargraph::SourceMap
An index of pins and other ApiMap-related data for a Source
.
Attributes
@return [Array<Pin::Base>]
@return [Array<Pin::Base>]
@return [Source]
Public Class Methods
@param filename [String] @return [SourceMap]
# File lib/solargraph/source_map.rb, line 140 def load filename source = Solargraph::Source.load(filename) SourceMap.map(source) end
@param code [String] @param filename [String, nil] @return [SourceMap]
# File lib/solargraph/source_map.rb, line 148 def load_string code, filename = nil source = Solargraph::Source.load_string(code, filename) SourceMap.map(source) end
@param source [Source] @return [SourceMap]
# File lib/solargraph/source_map.rb, line 155 def map source result = SourceMap::Mapper.map(source) new(source, *result) end
@param source [Source] @param pins [Array<Pin::Base>] @param locals [Array<Pin::Base>]
# File lib/solargraph/source_map.rb, line 28 def initialize source, pins, locals # HACK: Keep the library from changing this @source = source.dup @pins = pins @locals = locals environ.merge Convention.for_local(self) unless filename.nil? @pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a) @pin_select_cache = {} end
Public Instance Methods
@return [String]
# File lib/solargraph/source_map.rb, line 55 def code source.code end
@param position [Position] @return [Source::Cursor]
# File lib/solargraph/source_map.rb, line 85 def cursor_at position Source::Cursor.new(source, position) end
@return [Array<Pin::Base>]
# File lib/solargraph/source_map.rb, line 70 def document_symbols @document_symbols ||= pins.select { |pin| pin.path && !pin.path.empty? } end
@return [Environ]
# File lib/solargraph/source_map.rb, line 65 def environ @environ ||= Environ.new end
@return [String]
# File lib/solargraph/source_map.rb, line 50 def filename source.filename end
@param path [String] @return [Pin::Base]
# File lib/solargraph/source_map.rb, line 91 def first_pin path pins.select { |p| p.path == path }.first end
@param location [Location] @return [Array<Pin::LocalVariable>]
# File lib/solargraph/source_map.rb, line 132 def locals_at(location) return [] if location.filename != filename locals.select { |pin| pin.visible_at?(location) } end
# File lib/solargraph/source_map.rb, line 106 def locate_block_pin line, character _locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block end
# File lib/solargraph/source_map.rb, line 102 def locate_named_path_pin line, character _locate_pin line, character, Pin::Namespace, Pin::Method end
@param location [Solargraph::Location] @return [Array<Solargraph::Pin::Base>]
# File lib/solargraph/source_map.rb, line 97 def locate_pins location # return nil unless location.start_with?("#{filename}:") (pins + locals).select { |pin| pin.location == location } end
# File lib/solargraph/source_map.rb, line 38 def pins_by_class klass @pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten end
@param query [String] @return [Array<Pin::Base>]
# File lib/solargraph/source_map.rb, line 78 def query_symbols query return document_symbols if query && query.empty? document_symbols.select{ |pin| fuzzy_string_match(pin.path, query) || fuzzy_string_match(pin.name, query) } end
# File lib/solargraph/source_map.rb, line 42 def rebindable_method_names @rebindable_method_names ||= pins_by_class(Pin::Method) .select { |pin| pin.comments && pin.comments.include?('@yieldself') } .map(&:name) .to_set end
@param name [String] @return [Array<Location>]
# File lib/solargraph/source_map.rb, line 126 def references name source.references name end
@return [Array<Pin::Reference::Require>]
# File lib/solargraph/source_map.rb, line 60 def requires pins_by_class(Pin::Reference::Require) end
@param other_map [SourceMap] @return [Boolean]
# File lib/solargraph/source_map.rb, line 112 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
Private Instance Methods
@param line [Integer] @param character [Integer] @param klasses [Array<Class>] @return [Pin::Base]
# File lib/solargraph/source_map.rb, line 167 def _locate_pin line, character, *klasses position = Position.new(line, character) found = nil pins.each do |pin| # @todo Attribute pins should not be treated like closures, but # there's probably a better way to handle it next if pin.is_a?(Pin::Method) && pin.attribute? found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position) break if pin.location.range.start.line > line end # Assuming the root pin is always valid found || pins.first end
@param str1 [String] @param str2 [String] @return [Boolean]
# File lib/solargraph/source_map.rb, line 184 def fuzzy_string_match str1, str2 JaroWinkler.distance(str1, str2) > 0.6 end