class Solargraph::SourceMap
An index of Pins and other ApiMap-related data for a single Source that can be queried.
Attributes
@return [Array<Pin::Base>]
@return [Source]
Public Class Methods
Source
# File lib/solargraph/source_map.rb, line 153 def load filename source = Solargraph::Source.load(filename) SourceMap.map(source) end
@param filename [String] @return [SourceMap]
Source
# File lib/solargraph/source_map.rb, line 161 def load_string code, filename = nil source = Solargraph::Source.load_string(code, filename) SourceMap.map(source) end
@param code [String] @param filename [String, nil] @return [SourceMap]
Source
# File lib/solargraph/source_map.rb, line 169 def map source new(source) end
@deprecated @param source [Source] @return [SourceMap]
Source
# File lib/solargraph/source_map.rb, line 35 def initialize source @source = source conventions_environ.merge Convention.for_local(self) unless filename.nil? # FIXME: unmemoizing the document_symbols in case it was called and memoized from any of conventions above # this is to ensure that the convention_pins from all conventions are used in the document_symbols. # solargraph-rails is known to use this method to get the document symbols. It should probably be removed. @document_symbols = nil self.convention_pins = conventions_environ.pins # @type [Hash{Class<Pin::Base> => Array<Pin::Base>}] @pin_select_cache = {} end
@param source [Source]
Public Instance Methods
Source
# File lib/solargraph/source_map.rb, line 25 def all_pins pins + convention_pins end
@return [Array<Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 62 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) + locals).hash end
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.
@return [Integer]
Source
# File lib/solargraph/source_map.rb, line 72 def code source.code end
@return [String]
Source
# File lib/solargraph/source_map.rb, line 82 def conventions_environ @conventions_environ ||= Environ.new end
@return [Environ]
Source
# File lib/solargraph/source_map.rb, line 102 def cursor_at position Source::Cursor.new(source, position) end
@param position [Position] @return [Source::Cursor]
Source
# File lib/solargraph/source_map.rb, line 88 def document_symbols @document_symbols ||= (pins + convention_pins).select do |pin| pin.path && !pin.path.empty? end end
all pins except Solargraph::Pin::Reference::Reference @return [Array<Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 67 def filename source.filename end
@return [String]
Source
# File lib/solargraph/source_map.rb, line 108 def first_pin path pins.select { |p| p.path == path }.first end
@param path [String] @return [Pin::Base]
Source
# File lib/solargraph/source_map.rb, line 30 def locals data.locals end
@return [Array<Pin::LocalVariable>]
Source
# File lib/solargraph/source_map.rb, line 144 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
@param location [Location] @return [Array<Pin::LocalVariable>]
@deprecated Please use locate_closure_pin instead
Source
# File lib/solargraph/source_map.rb, line 129 def locate_closure_pin line, character _locate_pin line, character, Pin::Closure end
@param line [Integer] @param character [Integer] @return [Pin::Namespace,Pin::Method,Pin::Block]
Source
# File lib/solargraph/source_map.rb, line 122 def locate_named_path_pin line, character _locate_pin line, character, Pin::Namespace, Pin::Method end
@param line [Integer] @param character [Integer] @return [Pin::Method,Pin::Namespace]
Source
# File lib/solargraph/source_map.rb, line 114 def locate_pins location # return nil unless location.start_with?("#{filename}:") (pins + locals).select { |pin| pin.location == location } end
@param location [Solargraph::Location] @return [Array<Solargraph::Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 20 def pins data.pins end
@return [Array<Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 52 def pins_by_class klass @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten end
@generic T @param klass [Class<generic<T>>]
@return [Array<generic<T>>]
Source
# File lib/solargraph/source_map.rb, line 96 def query_symbols query Pin::Search.new(document_symbols, query).results end
@param query [String] @return [Array<Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 138 def references name source.references name end
@param name [String] @return [Array<Location>]
Source
# File lib/solargraph/source_map.rb, line 77 def requires pins_by_class(Pin::Reference::Require) end
@return [Array<Pin::Reference::Require>]
Private Instance Methods
Source
# File lib/solargraph/source_map.rb, line 198 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 line [Integer] @param character [Integer] @param klasses [Array<Class>] @return [Pin::Base, nil]
Source
# File lib/solargraph/source_map.rb, line 190 def convention_pins @convention_pins || [] end
@return [Array<Pin::Base>]
Source
# File lib/solargraph/source_map.rb, line 185 def data @data ||= Data.new(source) end
@return [Data]
Source
# File lib/solargraph/source_map.rb, line 180 def pin_class_hash @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a) end
@return [Hash{Class<Pin::Base> => Array<Pin::Base>}]