src/Tools/VSCode/src/vscode_resources.scala
author wenzelm
Wed, 04 Jan 2017 21:20:37 +0100
changeset 64779 6cdcc271dbd5
parent 64777 ca09695eb43c
child 64783 0be08e4cd0ec
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64623
83f012ce2567 clarified module name;
wenzelm
parents: 64605
diff changeset
     1
/*  Title:      Tools/VSCode/src/vscode_resources.scala
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     3
64729
4eccd9bc5fd9 clarified file URI operations;
wenzelm
parents: 64727
diff changeset
     4
Resources for VSCode Language Server: file-system access and global state.
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     5
*/
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     6
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     8
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     9
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    10
import isabelle._
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    11
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    12
import java.io.{File => JFile}
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    13
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    14
import scala.util.parsing.input.{Reader, CharSequenceReader}
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    15
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    16
64623
83f012ce2567 clarified module name;
wenzelm
parents: 64605
diff changeset
    17
object VSCode_Resources
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    18
{
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    19
  /* internal state */
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    20
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    21
  sealed case class State(
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    22
    models: Map[JFile, Document_Model] = Map.empty,
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    23
    pending_input: Set[JFile] = Set.empty,
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    24
    pending_output: Set[JFile] = Set.empty)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    25
}
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    26
64623
83f012ce2567 clarified module name;
wenzelm
parents: 64605
diff changeset
    27
class VSCode_Resources(
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    28
    val options: Options,
64706
wenzelm
parents: 64704
diff changeset
    29
    val text_length: Text.Length,
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    30
    loaded_theories: Set[String],
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    31
    known_theories: Map[String, Document.Node.Name],
64718
3197b68f4314 tuned signature;
wenzelm
parents: 64716
diff changeset
    32
    base_syntax: Outer_Syntax,
3197b68f4314 tuned signature;
wenzelm
parents: 64716
diff changeset
    33
    log: Logger = No_Logger)
3197b68f4314 tuned signature;
wenzelm
parents: 64716
diff changeset
    34
  extends Resources(loaded_theories, known_theories, base_syntax, log)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    35
{
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    36
  private val state = Synchronized(VSCode_Resources.State())
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    37
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    38
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    39
  /* document node name */
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    40
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    41
  def node_file(name: Document.Node.Name): JFile = new JFile(name.node)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    42
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    43
  def node_name(file: JFile): Document.Node.Name =
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    44
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    45
    val node = file.getPath
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    46
    val theory = Thy_Header.thy_name_bootstrap(node).getOrElse("")
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    47
    val master_dir = if (theory == "") "" else file.getParent
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    48
    Document.Node.Name(node, master_dir, theory)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    49
  }
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    50
64759
100941134718 clarified master_dir: file-URL;
wenzelm
parents: 64754
diff changeset
    51
  override def append(dir: String, source_path: Path): String =
64716
473793d52d97 proper import_name;
wenzelm
parents: 64710
diff changeset
    52
  {
64759
100941134718 clarified master_dir: file-URL;
wenzelm
parents: 64754
diff changeset
    53
    val path = source_path.expand
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    54
    if (dir == "" || path.is_absolute) File.platform_path(path)
64759
100941134718 clarified master_dir: file-URL;
wenzelm
parents: 64754
diff changeset
    55
    else if (path.is_current) dir
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    56
    else if (path.is_basic && !dir.endsWith("/") && !dir.endsWith(JFile.separator))
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    57
      dir + JFile.separator + File.platform_path(path)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    58
    else if (path.is_basic) dir + File.platform_path(path)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    59
    else new JFile(dir + JFile.separator + File.platform_path(path)).getCanonicalPath
64716
473793d52d97 proper import_name;
wenzelm
parents: 64710
diff changeset
    60
  }
473793d52d97 proper import_name;
wenzelm
parents: 64710
diff changeset
    61
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    62
  override def with_thy_reader[A](name: Document.Node.Name, f: Reader[Char] => A): A =
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    63
  {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    64
    val file = node_file(name)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    65
    get_model(file) match {
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    66
      case Some(model) =>
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    67
        f(new CharSequenceReader(model.doc.make_text))
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    68
      case None if file.isFile =>
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    69
        val reader = Scan.byte_reader(file)
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    70
        try { f(reader) } finally { reader.close }
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    71
      case None =>
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    72
        error("No such file: " + quote(file.toString))
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    73
    }
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    74
  }
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    75
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    76
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    77
  /* document models */
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    78
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    79
  def get_model(file: JFile): Option[Document_Model] = state.value.models.get(file)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    80
  def get_model(name: Document.Node.Name): Option[Document_Model] = get_model(node_file(name))
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    81
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    82
  def update_model(session: Session, file: JFile, text: String)
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    83
  {
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    84
    state.change(st =>
64709
5e6566ab78bf more explicit edits -- eliminated Clear;
wenzelm
parents: 64708
diff changeset
    85
      {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    86
        val model = st.models.getOrElse(file, Document_Model.init(session, node_name(file)))
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
    87
        val model1 = (model.update_text(text) getOrElse model).external(false)
64709
5e6566ab78bf more explicit edits -- eliminated Clear;
wenzelm
parents: 64708
diff changeset
    88
        st.copy(
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    89
          models = st.models + (file -> model1),
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    90
          pending_input = st.pending_input + file)
64709
5e6566ab78bf more explicit edits -- eliminated Clear;
wenzelm
parents: 64708
diff changeset
    91
      })
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    92
  }
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
    93
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    94
  def close_model(file: JFile): Option[Document_Model] =
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
    95
    state.change_result(st =>
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    96
      st.models.get(file) match {
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
    97
        case None => (None, st)
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
    98
        case Some(model) =>
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
    99
          (Some(model), st.copy(models = st.models + (file -> model.external(true))))
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   100
      })
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   101
64722
6df73de0d3c7 tuned signature;
wenzelm
parents: 64721
diff changeset
   102
  def sync_models(changed_files: Set[JFile]): Boolean =
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   103
    state.change_result(st =>
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   104
      {
64719
wenzelm
parents: 64718
diff changeset
   105
        val changed_models =
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   106
          (for {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   107
            (file, model) <- st.models.iterator
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   108
            if changed_files(file) && model.external_file
64779
wenzelm
parents: 64777
diff changeset
   109
            text <- try_read(file)
wenzelm
parents: 64777
diff changeset
   110
            model1 <- model.update_text(text)
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   111
          } yield (file, model1)).toList
64719
wenzelm
parents: 64718
diff changeset
   112
        if (changed_models.isEmpty) (false, st)
64721
4b9c96c3850b proper state update;
wenzelm
parents: 64719
diff changeset
   113
        else (true,
4b9c96c3850b proper state update;
wenzelm
parents: 64719
diff changeset
   114
          st.copy(
4b9c96c3850b proper state update;
wenzelm
parents: 64719
diff changeset
   115
            models = (st.models /: changed_models)(_ + _),
4b9c96c3850b proper state update;
wenzelm
parents: 64719
diff changeset
   116
            pending_input = (st.pending_input /: changed_models.iterator.map(_._1))(_ + _)))
64710
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   117
      })
72ca4e5f976e manage changes of external files;
wenzelm
parents: 64709
diff changeset
   118
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   119
64779
wenzelm
parents: 64777
diff changeset
   120
  /* file content */
wenzelm
parents: 64777
diff changeset
   121
wenzelm
parents: 64777
diff changeset
   122
  def try_read(file: JFile): Option[String] =
wenzelm
parents: 64777
diff changeset
   123
    try { Some(File.read(file)) }
wenzelm
parents: 64777
diff changeset
   124
    catch { case ERROR(_) => None }
wenzelm
parents: 64777
diff changeset
   125
wenzelm
parents: 64777
diff changeset
   126
  def get_file_content(file: JFile): Option[String] =
wenzelm
parents: 64777
diff changeset
   127
    get_model(file) match {
wenzelm
parents: 64777
diff changeset
   128
      case Some(model) => Some(model.doc.make_text)
wenzelm
parents: 64777
diff changeset
   129
      case None => try_read(file)
wenzelm
parents: 64777
diff changeset
   130
    }
wenzelm
parents: 64777
diff changeset
   131
wenzelm
parents: 64777
diff changeset
   132
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   133
  /* resolve dependencies */
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   134
64731
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   135
  val thy_info = new Thy_Info(this)
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   136
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   137
  def resolve_dependencies(session: Session): Boolean =
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   138
  {
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   139
    state.change_result(st =>
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   140
      {
64731
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   141
        val thys =
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   142
          (for ((_, model) <- st.models.iterator if model.is_theory)
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   143
           yield (model.node_name, Position.none)).toList
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   144
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   145
        val loaded_models =
64731
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   146
          (for {
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   147
            dep <- thy_info.dependencies("", thys).deps.iterator
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   148
            file = node_file(dep.name)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   149
            if !st.models.isDefinedAt(file)
64779
wenzelm
parents: 64777
diff changeset
   150
            text <- try_read(file)
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   151
          }
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   152
          yield {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   153
            val model = Document_Model.init(session, node_name(file))
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   154
            val model1 = (model.update_text(text) getOrElse model).external(true)
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   155
            (file, model1)
64731
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   156
          }).toList
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   157
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   158
        if (loaded_models.isEmpty) (false, st)
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   159
        else
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   160
          (true,
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   161
            st.copy(
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   162
              models = st.models ++ loaded_models,
64731
84192ecae582 just one synchronized access to global state: works recursively on JVM;
wenzelm
parents: 64729
diff changeset
   163
              pending_input = st.pending_input ++ loaded_models.iterator.map(_._1)))
64727
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   164
      })
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   165
  }
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   166
13e37567a0d6 automatically resolve dependencies from document models and file-system;
wenzelm
parents: 64726
diff changeset
   167
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   168
  /* pending input */
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   169
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   170
  def flush_input(session: Session)
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   171
  {
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   172
    state.change(st =>
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   173
      {
64719
wenzelm
parents: 64718
diff changeset
   174
        val changed_models =
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   175
          (for {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   176
            file <- st.pending_input.iterator
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   177
            model <- st.models.get(file)
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   178
            (edits, model1) <- model.flush_edits
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   179
          } yield (edits, (file, model1))).toList
64707
7157685b71e3 clarified Document_Model perspective and edits;
wenzelm
parents: 64706
diff changeset
   180
64719
wenzelm
parents: 64718
diff changeset
   181
        session.update(Document.Blobs.empty, changed_models.flatMap(_._1))
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   182
        st.copy(
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   183
          models = (st.models /: changed_models.iterator.map(_._2))(_ + _),
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   184
          pending_input = Set.empty)
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   185
      })
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   186
  }
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   187
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   188
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   189
  /* pending output */
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   190
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   191
  def update_output(changed_nodes: List[JFile]): Unit =
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   192
    state.change(st => st.copy(pending_output = st.pending_output ++ changed_nodes))
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   193
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   194
  def flush_output(channel: Channel)
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   195
  {
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   196
    state.change(st =>
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   197
      {
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   198
        val changed_iterator =
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   199
          for {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   200
            file <- st.pending_output.iterator
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   201
            model <- st.models.get(file)
64704
08c2d80428ff re-use options from resources;
wenzelm
parents: 64703
diff changeset
   202
            rendering = model.rendering()
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   203
            (diagnostics, model1) <- model.publish_diagnostics(rendering)
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   204
          } yield {
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   205
            channel.diagnostics(file, rendering.diagnostics_output(diagnostics))
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   206
            (file, model1)
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   207
          }
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   208
        st.copy(
64777
ca09695eb43c clarified Document.Node.Name (again): canonical platform file;
wenzelm
parents: 64775
diff changeset
   209
          models = (st.models /: changed_iterator)(_ + _),
64703
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   210
          pending_output = Set.empty)
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   211
      }
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   212
    )
a115391494ed moved main state to VSCode_Resources;
wenzelm
parents: 64640
diff changeset
   213
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   214
}