class Solargraph::Arc::RailsApi

Public Class Methods

instance() click to toggle source
# File lib/solargraph/arc/rails_api.rb, line 4
def self.instance
  @instance ||= self.new
end

Public Instance Methods

global(yard_map) click to toggle source
# File lib/solargraph/arc/rails_api.rb, line 8
def global yard_map
  return [] if yard_map.required.empty?

  ann    = File.read(File.dirname(__FILE__) + "/annotations.rb")
  source = Solargraph::Source.load_string(ann, "annotations.rb")
  map    = Solargraph::SourceMap.map(source)

  Solargraph.logger.debug("[Arc][Rails] found #{map.pins.size} pins in annotations")

  overrides = YAML.load_file(File.dirname(__FILE__) + "/types.yml").map do |meth, data|
    if data["return"]
      Util.method_return(meth, data["return"])
    elsif data["yieldself"]
      Solargraph::Pin::Reference::Override.from_comment(
        meth,
        "@yieldself [#{data['yieldself'].join(',')}]"
      )
    elsif data["yieldparam"]
      Solargraph::Pin::Reference::Override.from_comment(
        meth,
        "@yieldparam [#{data['yieldparam'].join(',')}]"
      )
    end
  end

  ns = Solargraph::Pin::Namespace.new(
    name:  "ActionController::Base",
    gates: ["ActionController::Base"]
  )

  definitions = [
    Util.build_public_method(
      ns,
      "response",
      types: ["ActionDispatch::Response"],
      location: Util.dummy_location("whatever.rb")
    ),
    Util.build_public_method(
      ns,
      "request",
      types: ["ActionDispatch::Request"],
      location: Util.dummy_location("whatever.rb")
    ),
    Util.build_public_method(
      ns,
      "session",
      types: ["ActionDispatch::Request::Session"],
      location: Util.dummy_location("whatever.rb")
    ),
    Util.build_public_method(
      ns,
      "flash",
      types: ["ActionDispatch::Flash::FlashHash"],
      location: Util.dummy_location("whatever.rb")
    )
  ]

  map.pins + definitions + overrides
end
local(source_map, ns) click to toggle source
# File lib/solargraph/arc/rails_api.rb, line 68
def local(source_map, ns)
  return [] unless source_map.filename.include?("db/migrate")
  node = Walker.normalize_ast(source_map.source)

  pins = [
    Util.build_module_include(
      ns,
      "ActiveRecord::ConnectionAdapters::SchemaStatements",
      Util.build_location(node, ns.filename)
    ),
    Util.build_module_extend(
      ns,
      "ActiveRecord::ConnectionAdapters::SchemaStatements",
      Util.build_location(node, ns.filename)
    )
  ]

  Solargraph.logger.debug("[ARC][RailsApi] added #{pins.map(&:name)} to #{ns.path}")
  pins
end