did_open.pony

use "files"
use "logger"

use rpc_data = "../../rpc/data"
use "../.."

class DidOpen
  let _log: Logger[String]
  let _server: Server
  let _config: ServerConfig

  new create(log: Logger[String], server: Server, config: ServerConfig) =>
    _log = log
    _server = server
    _config = config

  fun apply(
    auth: FileAuth,
    workspaces: Workspaces,
    src_files: SrcFiles,
    task_id: USize,
    params: rpc_data.DidOpenTextDocumentParams)
    : ((ServerState | None), (I32 | None))
  =>
    _log(Fine) and _log.log(
      task_id.string() + ": notification: textDocument/didOpen " +
      params.textDocument().uri())
    let src_file_info =
      if
        src_files.by_client_uri.contains(params.textDocument().uri())
      then
        try
          src_files.by_client_uri(params.textDocument().uri())?
        end
      else
        let info = SrcFileInfo(
          _log,
          auth,
          _server,
          params.textDocument().uri())
        src_files.by_client_uri.update(info.client_uri, info)

        if
          src_files.by_canonical_path.contains(info.canonical_path.path)
        then
          try
            let actual =
              src_files.by_canonical_path(info.canonical_path.path)?
            src_files.by_client_uri.update(params.textDocument().uri(), actual)
            actual
          end
        else
          src_files.by_canonical_path.update(
            info.canonical_path.path, info)
          info
        end
      end
    match src_file_info
    | let sfi: SrcFileInfo =>
      let parse = sfi.did_open(
        task_id,
        params.textDocument().version(),
        params.textDocument().text())
      try
        let workspace = workspaces.get_workspace(
          auth, _config, sfi.canonical_path)?
        workspace.analyze.open_file(task_id, sfi.canonical_path, parse)
      else
        _log(Error) and _log.log("unable to get workspace")
      end
    else
      _log(Error) and _log.log("unable to open " + params.textDocument().uri())
    end
    (None, None)