Class: Solargraph::ApiMap::Store
- Inherits:
-
Object
- Object
- Solargraph::ApiMap::Store
- Defined in:
- lib/solargraph/api_map/store.rb
Overview
Queryable collection of Pins representing a Workspace, gems and the Ruby core.
Constant Summary collapse
- BOOLEAN_SUPERCLASS_PIN =
Pin::Reference::Superclass.new(name: 'Boolean', closure: Pin::ROOT_PIN, source: :solargraph)
- OBJECT_SUPERCLASS_PIN =
Pin::Reference::Superclass.new(name: 'Object', closure: Pin::ROOT_PIN, source: :solargraph)
Instance Method Summary collapse
- #block_pins ⇒ Enumerable<Pin::Block>
- #constants ⇒ Constants
- #domains(fqns) ⇒ Array<String>
- #fqns_pins(fqns) ⇒ Array<Solargraph::Pin::Namespace>
- #get_ancestor_references(fqns) ⇒ Array<Solargraph::Pin::Reference>
-
#get_ancestors(fqns) ⇒ Array<String>
Get all ancestors (superclasses, includes, prepends, extends) for a namespace.
- #get_class_variables(fqns) ⇒ Enumerable<Solargraph::Pin::ClassVariable>
- #get_constants(fqns, visibility = [:public]) ⇒ Enumerable<Solargraph::Pin::Namespace, Solargraph::Pin::Constant>
- #get_extends(fqns) ⇒ Array<Pin::Reference::Extend>
- #get_includes(fqns) ⇒ Array<Pin::Reference::Include>
- #get_instance_variables(fqns, scope = :instance) ⇒ Enumerable<Solargraph::Pin::Base>
- #get_methods(fqns, scope: :instance, visibility: [:public]) ⇒ Enumerable<Solargraph::Pin::Method>
- #get_path_pins(path) ⇒ Array<Solargraph::Pin::Base>
- #get_prepends(fqns) ⇒ Array<Pin::Reference::Prepend>
- #get_superclass(fqns) ⇒ Pin::Reference::Superclass?
- #get_symbols ⇒ Enumerable<Solargraph::Pin::Base>
-
#initialize(*pinsets) ⇒ Store
constructor
A new instance of Store.
- #inspect ⇒ Object
- #method_pins ⇒ Enumerable<Solargraph::Pin::Method>
- #named_macros ⇒ Hash{String => YARD::Tags::MacroDirective}
- #namespace_exists?(fqns) ⇒ Boolean
- #namespace_pins ⇒ Enumerable<Solargraph::Pin::Namespace>
- #pins ⇒ Array<Solargraph::Pin::Base>
- #pins_by_class(klass) ⇒ Set<generic<T>>
- #qualify_superclass(fq_sub_tag) ⇒ String?
- #to_s ⇒ Object
- #unalias(name) ⇒ ComplexType?
-
#update(*pinsets) ⇒ Boolean
True if the index was updated.
Constructor Details
#initialize(*pinsets) ⇒ Store
Returns a new instance of Store.
10 11 12 13 |
# File 'lib/solargraph/api_map/store.rb', line 10 def initialize *pinsets @pinsets = pinsets catalog pinsets end |
Instance Method Details
#block_pins ⇒ Enumerable<Pin::Block>
193 194 195 |
# File 'lib/solargraph/api_map/store.rb', line 193 def block_pins pins_by_class(Pin::Block) end |
#constants ⇒ Constants
270 271 272 |
# File 'lib/solargraph/api_map/store.rb', line 270 def constants @constants ||= Constants.new(self) end |
#domains(fqns) ⇒ Array<String>
170 171 172 173 174 175 176 |
# File 'lib/solargraph/api_map/store.rb', line 170 def domains fqns result = [] fqns_pins(fqns).each do |nspin| result.concat nspin.domains end result end |
#fqns_pins(fqns) ⇒ Array<Solargraph::Pin::Namespace>
206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/solargraph/api_map/store.rb', line 206 def fqns_pins fqns return [] if fqns.nil? if fqns.include?('::') parts = fqns.split('::') name = parts.pop base = parts.join('::') else base = '' name = fqns end fqns_pins_map[[base, name]] end |
#get_ancestor_references(fqns) ⇒ Array<Solargraph::Pin::Reference>
265 266 267 |
# File 'lib/solargraph/api_map/store.rb', line 265 def get_ancestor_references fqns (get_prepends(fqns) + get_includes(fqns) + [get_superclass(fqns)]).compact end |
#get_ancestors(fqns) ⇒ Array<String>
Get all ancestors (superclasses, includes, prepends, extends) for a namespace
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'lib/solargraph/api_map/store.rb', line 222 def get_ancestors fqns return [] if fqns.nil? || fqns.empty? ancestors = [fqns] visited = Set.new queue = [fqns] until queue.empty? current = queue.shift next if current.nil? || current.empty? || visited.include?(current) visited.add(current) current = current.gsub(/^::/, '') # Add superclass ref = get_superclass(current) superclass = ref && constants.dereference(ref) if superclass && !superclass.empty? && !visited.include?(superclass) ancestors << superclass queue << superclass end # Add includes, prepends, and extends [get_includes(current), get_prepends(current), get_extends(current)].each do |refs| next if refs.nil? # @param ref [String] refs.map(&:type).map(&:to_s).each do |ref| # @sg-ignore flow sensitive typing should be able to handle redefinition next if ref.nil? || ref.empty? || visited.include?(ref) # @sg-ignore flow sensitive typing should be able to handle redefinition ancestors << ref # @sg-ignore flow sensitive typing should be able to handle redefinition queue << ref end end end ancestors.compact.uniq end |
#get_class_variables(fqns) ⇒ Enumerable<Solargraph::Pin::ClassVariable>
143 144 145 |
# File 'lib/solargraph/api_map/store.rb', line 143 def get_class_variables fqns namespace_children(fqns).select { |pin| pin.is_a?(Pin::ClassVariable) } end |
#get_constants(fqns, visibility = [:public]) ⇒ Enumerable<Solargraph::Pin::Namespace, Solargraph::Pin::Constant>
62 63 64 65 66 67 |
# File 'lib/solargraph/api_map/store.rb', line 62 def get_constants fqns, visibility = [:public] namespace_children(fqns).select do |pin| # @sg-ignore flow sensitive typing not smart enough to handle this case !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility) end end |
#get_extends(fqns) ⇒ Array<Pin::Reference::Extend>
121 122 123 |
# File 'lib/solargraph/api_map/store.rb', line 121 def get_extends fqns extend_references[fqns] || [] end |
#get_includes(fqns) ⇒ Array<Pin::Reference::Include>
109 110 111 |
# File 'lib/solargraph/api_map/store.rb', line 109 def get_includes fqns include_references[fqns] || [] end |
#get_instance_variables(fqns, scope = :instance) ⇒ Enumerable<Solargraph::Pin::Base>
134 135 136 137 138 |
# File 'lib/solargraph/api_map/store.rb', line 134 def get_instance_variables fqns, scope = :instance all_instance_variables.select do |pin| pin.binder.namespace == fqns && pin.binder.scope == scope end end |
#get_methods(fqns, scope: :instance, visibility: [:public]) ⇒ Enumerable<Solargraph::Pin::Method>
73 74 75 76 77 78 |
# File 'lib/solargraph/api_map/store.rb', line 73 def get_methods fqns, scope: :instance, visibility: [:public] all_pins = namespace_children(fqns).select do |pin| pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility) end GemPins.combine_method_pins_by_path(all_pins) end |
#get_path_pins(path) ⇒ Array<Solargraph::Pin::Base>
127 128 129 |
# File 'lib/solargraph/api_map/store.rb', line 127 def get_path_pins path index.path_pin_hash[path] end |
#get_prepends(fqns) ⇒ Array<Pin::Reference::Prepend>
115 116 117 |
# File 'lib/solargraph/api_map/store.rb', line 115 def get_prepends fqns prepend_references[fqns] || [] end |
#get_superclass(fqns) ⇒ Pin::Reference::Superclass?
87 88 89 90 91 92 |
# File 'lib/solargraph/api_map/store.rb', line 87 def get_superclass fqns return nil if fqns.nil? || fqns.empty? return BOOLEAN_SUPERCLASS_PIN if %w[TrueClass FalseClass].include?(fqns) superclass_references[fqns].first || try_special_superclasses(fqns) end |
#get_symbols ⇒ Enumerable<Solargraph::Pin::Base>
148 149 150 |
# File 'lib/solargraph/api_map/store.rb', line 148 def get_symbols symbols.uniq(&:name) end |
#inspect ⇒ Object
55 56 57 |
# File 'lib/solargraph/api_map/store.rb', line 55 def inspect to_s end |
#method_pins ⇒ Enumerable<Solargraph::Pin::Method>
164 165 166 |
# File 'lib/solargraph/api_map/store.rb', line 164 def method_pins pins_by_class(Solargraph::Pin::Method) end |
#named_macros ⇒ Hash{String => YARD::Tags::MacroDirective}
179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/solargraph/api_map/store.rb', line 179 def named_macros @named_macros ||= begin result = {} pins.each do |pin| pin.macros.select { |m| m.tag.tag_name == 'macro' && !m.tag.text.empty? }.each do |macro| next if macro.tag.name.nil? || macro.tag.name.empty? result[macro.tag.name] = macro end end result end end |
#namespace_exists?(fqns) ⇒ Boolean
154 155 156 |
# File 'lib/solargraph/api_map/store.rb', line 154 def namespace_exists? fqns fqns_pins(fqns).any? end |
#namespace_pins ⇒ Enumerable<Solargraph::Pin::Namespace>
159 160 161 |
# File 'lib/solargraph/api_map/store.rb', line 159 def namespace_pins pins_by_class(Solargraph::Pin::Namespace) end |
#pins ⇒ Array<Solargraph::Pin::Base>
16 17 18 |
# File 'lib/solargraph/api_map/store.rb', line 16 def pins index.pins end |
#pins_by_class(klass) ⇒ Set<generic<T>>
200 201 202 |
# File 'lib/solargraph/api_map/store.rb', line 200 def pins_by_class klass index.pins_by_class klass end |
#qualify_superclass(fq_sub_tag) ⇒ String?
96 97 98 99 100 101 102 103 104 105 |
# File 'lib/solargraph/api_map/store.rb', line 96 def qualify_superclass fq_sub_tag cached_qualify_superclass[fq_sub_tag] || qualify_and_cache_superclass(fq_sub_tag) type = ComplexType.try_parse(fq_sub_tag) return type.simplify_literals.to_s if type.literal? ref = get_superclass(fq_sub_tag) return unless ref res = constants.dereference(ref) return unless res res end |
#to_s ⇒ Object
51 52 53 |
# File 'lib/solargraph/api_map/store.rb', line 51 def to_s self.class.to_s end |
#unalias(name) ⇒ ComplexType?
276 277 278 |
# File 'lib/solargraph/api_map/store.rb', line 276 def unalias name index.alias_hash[name] end |
#update(*pinsets) ⇒ Boolean
Returns True if the index was updated.
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/solargraph/api_map/store.rb', line 27 def update *pinsets return catalog(pinsets) if pinsets.length != @pinsets.length changed = pinsets.find_index.with_index { |pinset, idx| @pinsets[idx] != pinset } return false unless changed # @todo Fix this map @fqns_pins_map = nil return catalog(pinsets) if changed.zero? # @sg-ignore Need to add nil check here pinsets[changed..].each_with_index do |pins, idx| @pinsets[changed + idx] = pins @indexes[changed + idx] = if pins.empty? @indexes[changed + idx - 1] else @indexes[changed + idx - 1].merge(pins) end end constants.clear cached_qualify_superclass.clear true end |