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