class Solargraph::CodeMap

def infer_signature_from_node signature, node

def infer_signature_from_node signature, node
  inferred = nil
  parts = signature.split('.')
  ns_here = namespace_from(node)
  start = parts[0]
  return nil if start.nil?
  remainder = parts[1..-1]
  if start.start_with?('@@')
    type = api_map.infer_class_variable(start, ns_here)
    return nil if type.nil?
    return type if remainder.empty?
    return api_map.infer_signature_type(remainder.join('.'), type, scope: :instance)
  elsif start.start_with?('@')
    scope = (node.type == :def ? :instance : :scope)
    type = api_map.infer_instance_variable(start, ns_here, scope)
    return nil if type.nil?
    return type if remainder.empty?
    return api_map.infer_signature_type(remainder.join('.'), type, scope: :instance)
  end
  var = find_local_variable_node(start, node)
  if var.nil?
    scope = (node.type == :def ? :instance : :class)
    type = api_map.infer_signature_type(signature, ns_here, scope: scope)
    return type unless type.nil?
  else
    # Signature starts with a local variable

    type = get_type_comment(var)
    type = infer_literal_node_type(var.children[1]) if type.nil?
    if type.nil?
      vsig = resolve_node_signature(var.children[1])
      type = infer_signature_from_node vsig, node
    end
  end
  unless type.nil?
    if remainder[0] == 'new'
      remainder.shift
      if remainder.empty?
        inferred = type
      else
        inferred = api_map.infer_signature_type(remainder.join('.'), type, scope: :instance)
      end
    elsif remainder.empty?
      inferred = type
    else
      inferred = api_map.infer_signature_type(remainder.join('.'), type, scope: :instance)
    end
  end
  inferred
end