class Solargraph::Pin::Base


The base class for map pins.

def == other


requiring both pins to have the same location.
Pin equality is determined using the #nearly? method and also
def == other
  return false unless nearly? other
  comments == other.comments and location == other.location
end

def all_rooted?

def all_rooted?
  !return_type || return_type.all_rooted?
end

def best_location

Returns:
  • (Location, nil) -
def best_location
  location || type_location
end

def collect_macros

Returns:
  • (::Array) -
def collect_macros
  return [] unless maybe_directives?
  parse = Solargraph::Source.parse_docstring(comments)
  parse.directives.select{ |d| d.tag.tag_name == 'macro' }
end

def comments

Returns:
  • (String) -
def comments
  @comments ||= ''
end

def compare_directives dir1, dir2

Returns:
  • (Boolean) -

Parameters:
  • dir2 (::Array) --
  • dir1 (::Array) --
def compare_directives dir1, dir2
  return false if dir1.length != dir2.length
  dir1.each_index do |i|
    return false unless compare_tags(dir1[i].tag, dir2[i].tag)
  end
  true
end

def compare_docstring_tags d1, d2

Returns:
  • (Boolean) -

Parameters:
  • d2 (YARD::Docstring) --
  • d1 (YARD::Docstring) --
def compare_docstring_tags d1, d2
  return false if d1.tags.length != d2.tags.length
  d1.tags.each_index do |i|
    return false unless compare_tags(d1.tags[i], d2.tags[i])
  end
  true
end

def compare_tags tag1, tag2

Returns:
  • (Boolean) -

Parameters:
  • tag2 (YARD::Tags::Tag) --
  • tag1 (YARD::Tags::Tag) --
def compare_tags tag1, tag2
  tag1.class == tag2.class &&
    tag1.tag_name == tag2.tag_name &&
    tag1.text == tag2.text &&
    tag1.name == tag2.name &&
    tag1.types == tag2.types
end

def completion_item_kind

Returns:
  • (Integer) -
def completion_item_kind
  LanguageServer::CompletionItemKinds::KEYWORD
end

def deprecated?

Returns:
  • (Boolean) -
def deprecated?
  @deprecated ||= docstring.has_tag?('deprecated')
end

def desc

Returns:
  • (String, nil) -
def desc
  if path
    if to_rbs
      path + ' ' + to_rbs
    else
      path
    end
  else
    to_rbs
  end
end

def directives

Returns:
  • (::Array) -
def directives
  parse_comments unless defined?(@directives)
  @directives
end

def docstring

Returns:
  • (YARD::Docstring) -
def docstring
  parse_comments unless defined?(@docstring)
  @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
end

def erase_generics(generics_to_erase)

Returns:
  • (self) -

Parameters:
  • generics_to_erase (Enumerable) --
def erase_generics(generics_to_erase)
  return self if generics_to_erase.empty?
  transform_types { |t| t.erase_generics(generics_to_erase) }
end

def filename

Returns:
  • (String, nil) -
def filename
  return nil if location.nil?
  location.filename
end

def identity

Returns:
  • (String) -
def identity
  @identity ||= "#{closure.path}|#{name}"
end

def infer api_map

Returns:
  • (ComplexType) -

Parameters:
  • api_map (ApiMap) --

Deprecated:
  • Use #typify and/or #probe instead
def infer api_map
  Solargraph::Logging.logger.warn "WARNING: Pin #infer methods are deprecated. Use #typify or #probe instead."
  type = typify(api_map)
  return type unless type.undefined?
  probe api_map
end

def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''

Parameters:
  • comments (String) --
  • name (String) --
  • closure (Solargraph::Pin::Closure, nil) --
  • type_location (Solargraph::Location, nil) --
  • location (Solargraph::Location, nil) --
def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
  @location = location
  @type_location = type_location
  @closure = closure
  @name = name
  @comments = comments
end

def inspect

def inspect
  "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
end

def macros

Returns:
  • (::Array) -
def macros
  @macros ||= collect_macros
end

def maybe_directives?

Returns:
  • (Boolean) -
def maybe_directives?
  return !@directives.empty? if defined?(@directives)
  @maybe_directives ||= comments.include?('@!')
end

def nearly? other

Returns:
  • (Boolean) -

Parameters:
  • other (Solargraph::Pin::Base, Object) --
def nearly? other
  self.class == other.class &&
    name == other.name &&
    (closure == other.closure || (closure && closure.nearly?(other.closure))) &&
    (comments == other.comments ||
      (((maybe_directives? == false && other.maybe_directives? == false) || compare_directives(directives, other.directives)) &&
      compare_docstring_tags(docstring, other.docstring))
    )
end

def parse_comments

Returns:
  • (void) -
def parse_comments
  # HACK: Avoid a NoMethodError on nil with empty overload tags

  if comments.nil? || comments.empty? || comments.strip.end_with?('@overload')
    @docstring = nil
    @directives = []
  else
    # HACK: Pass a dummy code object to the parser for plugins that

    # expect it not to be nil

    parse = Solargraph::Source.parse_docstring(comments)
    @docstring = parse.to_docstring
    @directives = parse.directives
  end
end

def probe api_map

Returns:
  • (ComplexType) -

Parameters:
  • api_map (ApiMap) --
def probe api_map
  typify api_map
end

def probed?

def probed?
  @probed ||= false
end

def proxied?

def proxied?
  @proxied ||= false
end

def proxy return_type

Returns:
  • (self) -

Parameters:
  • return_type (ComplexType) --
def proxy return_type
  result = dup
  result.return_type = return_type
  result.proxied = true
  result
end

def realize api_map

Returns:
  • (self) -

Parameters:
  • api_map (ApiMap) --
def realize api_map
  return self if return_type.defined?
  type = typify(api_map)
  return proxy(type) if type.defined?
  type = probe(api_map)
  return self if type.undefined?
  result = proxy(type)
  result.probed = true
  result
end

def resolve_generics definitions, context_type

Returns:
  • (self) -

Parameters:
  • context_type (ComplexType) -- The receiver type
  • definitions (Pin::Namespace) -- The module/class which uses generic types
def resolve_generics definitions, context_type
  transform_types { |t| t.resolve_generics(definitions, context_type) if t }
end

def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})

Returns:
  • (self) -

Parameters:
  • resolved_generic_values (Hash{String => ComplexType}) --
  • context (ComplexType) --
  • return_type_context (ComplexType, nil) --
  • generics_to_resolve (Enumerable) --
def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
  proxy return_type.resolve_generics_from_context(generics_to_resolve,
                                                  return_type_context,
                                                  resolved_generic_values: resolved_generic_values)
end

def return_type

Returns:
  • (ComplexType) -
def return_type
  @return_type ||= ComplexType::UNDEFINED
end

def symbol_kind

Returns:
  • (Integer, nil) -
def symbol_kind
  nil
end

def to_rbs

Returns:
  • (String, nil) -
def to_rbs
  return_type.to_rbs
end

def to_s

def to_s
  to_rbs
end

def transform_types(&transform)

Returns:
  • (self) -

Other tags:
    Yieldreturn: -

Other tags:
    Yieldparam: -
def transform_types(&transform)
  proxy return_type.transform(&transform)
end

def try_merge! pin

Returns:
  • (Boolean) - True if the pins were merged

Parameters:
  • pin (Pin::Base) -- The pin to merge into this one
def try_merge! pin
  return false unless nearly?(pin)
  @location = pin.location
  @closure = pin.closure
  return true if comments == pin.comments
  @comments = pin.comments
  @docstring = pin.docstring
  @return_type = pin.return_type
  @documentation = nil
  @deprecated = nil
  reset_conversions
  true
end

def typify api_map

Returns:
  • (ComplexType) -

Parameters:
  • api_map (ApiMap) --
def typify api_map
  return_type.qualify(api_map, namespace)
end

def variable?

Returns:
  • (Boolean) -
def variable?
  false
end