did_change.pony

use "files"
use "logger"

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

class DidChange
  let _log: Logger[String]
  let _config: ServerConfig

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

  fun apply(
    auth: FileAuth,
    workspaces: Workspaces,
    src_files: SrcFiles,
    task_id: USize,
    params: rpc_data.DidChangeTextDocumentParams)
    : ((ServerState | None), (I32 | None))
  =>
    _log(Fine) and _log.log(
      task_id.string() + ": notification : textDocument/didChange")

    let uri = params.textDocument().uri()
    try
      let info = src_files.by_client_uri(uri)?
      try
        info.did_change(
          task_id,
          params.textDocument(),
          params.contentChanges())
        let workspace = workspaces.get_workspace(
          auth, _config, info.canonical_path)?
        match info.parse
        | let parse': parser.Parser =>
          workspace.analyze.update_file(task_id, info.canonical_path, parse')
        end
      else
        _log(Error) and _log.log(task_id.string() + ": error getting workspace")
      end
    else
      _log(Error) and _log.log(
        task_id.string() +  ": no open info found for " + uri)
    end

    (None, None)