lib/jedit/plugin/isabelle/IsabellePlugin.scala
author wenzelm
Sun, 24 Aug 2008 18:11:20 +0200
changeset 27985 fb774d10ea4c
parent 27966 825286a7a3a4
permissions -rw-r--r--
repackaged as isabelle.jedit;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     1
/*  Title:      jedit/plugin/IsabellePlugin.scala
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     4
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     5
Isabelle/jEdit plugin -- main setup.
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     6
*/
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     7
27985
fb774d10ea4c repackaged as isabelle.jedit;
wenzelm
parents: 27966
diff changeset
     8
package isabelle.jedit
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
     9
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    10
import org.gjt.sp.jedit.EditPlugin
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    11
import org.gjt.sp.util.Log
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    12
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    13
import errorlist.DefaultErrorSource
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    14
import errorlist.ErrorSource
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    15
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    16
import java.util.Properties
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    17
import java.lang.NumberFormatException
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    18
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    19
import scala.collection.mutable.ListBuffer
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    20
import scala.io.Source
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    21
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    22
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    23
/* Global state */
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    24
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    25
object IsabellePlugin {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    26
  // unique ids
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    27
  @volatile
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    28
  private var idCount = 0
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    29
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    30
  def id() : String = synchronized { idCount += 1; "jedit:" + idCount }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    31
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    32
  def idProperties(value: String) : Properties = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    33
     val props = new Properties
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    34
     props.setProperty(Markup.ID, value)
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    35
     props
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    36
  }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    37
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    38
  def idProperties() : Properties = { idProperties(id()) }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    39
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    40
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    41
  // the error source
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    42
  @volatile
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    43
  var errors: DefaultErrorSource = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    44
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    45
  // the Isabelle process
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    46
  @volatile
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    47
  var isabelle: IsabelleProcess = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    48
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    49
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    50
  // result content
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    51
  def result_content(result: IsabelleProcess.Result) =
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    52
    XML.content(isabelle.result_tree(result)).mkString("")
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    53
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    54
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    55
  // result consumers
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    56
  type consumer = IsabelleProcess.Result => Boolean
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    57
  private var consumers = new ListBuffer[consumer]
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    58
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    59
  def addConsumer(consumer: consumer) = synchronized { consumers += consumer }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    60
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    61
  def addPermanentConsumer(consumer: IsabelleProcess.Result => Unit) = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    62
    addConsumer(result => { consumer(result); false })
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    63
  }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    64
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    65
  def delConsumer(consumer: consumer) = synchronized { consumers -= consumer }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    66
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    67
  def consume(result: IsabelleProcess.Result) : Unit = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    68
    synchronized { consumers.elements.toList } foreach (consumer =>
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    69
      {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    70
        val finished =
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    71
          try { consumer(result) }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    72
          catch { case e: Throwable => Log.log(Log.ERROR, this, e); true }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    73
        if (finished || result == null)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    74
          delConsumer(consumer)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    75
      })
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    76
  }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    77
}
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    78
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    79
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    80
/* Main plugin setup */
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    81
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    82
class IsabellePlugin extends EditPlugin {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    83
  private var thread: Thread = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    84
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    85
  override def start = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    86
    // error source
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    87
    IsabellePlugin.errors = new DefaultErrorSource("isabelle")
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    88
    ErrorSource.registerErrorSource(IsabellePlugin.errors)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    89
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    90
    IsabellePlugin.addPermanentConsumer (result =>
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    91
      if (result != null && result.props != null &&
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    92
          (result.kind == IsabelleProcess.Kind.WARNING ||
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    93
           result.kind == IsabelleProcess.Kind.ERROR)) {
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    94
        val typ =
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    95
          if (result.kind == IsabelleProcess.Kind.WARNING) ErrorSource.WARNING
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
    96
          else ErrorSource.ERROR
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    97
        (Position.line_of(result.props), Position.file_of(result.props)) match {
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    98
          case (Some(line), Some(file)) =>
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
    99
            val content = IsabellePlugin.result_content(result)
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   100
            if (content.length > 0) {
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   101
              val lines = Source.fromString(content).getLines
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   102
              val err = new DefaultErrorSource.DefaultError(IsabellePlugin.errors,
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   103
                  typ, file, line - 1, 0, 0, lines.next)
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   104
              for (msg <- lines) err.addExtraMessage(msg)
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   105
              IsabellePlugin.errors.addError(err)
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   106
            }
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   107
          case _ =>
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   108
        }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   109
      })
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   110
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   111
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   112
    // Isabelle process
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   113
    IsabellePlugin.isabelle =
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   114
      new IsabelleProcess("-mno_brackets", "-mno_type_brackets", "-mxsymbols")
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   115
    thread = new Thread (new Runnable {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   116
      def run = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   117
        var result: IsabelleProcess.Result = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   118
        do {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   119
          try {
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   120
            result = IsabellePlugin.isabelle.results.take
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   121
          }
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   122
          catch {
25948
aa65ada6f095 exceptions: assign result = null properly;
wenzelm
parents: 25851
diff changeset
   123
            case _: NullPointerException => result = null
aa65ada6f095 exceptions: assign result = null properly;
wenzelm
parents: 25851
diff changeset
   124
            case _: InterruptedException => result = null
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   125
          }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   126
          if (result != null) {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   127
            System.err.println(result)   // FIXME
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   128
            IsabellePlugin.consume(result)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   129
          }
27966
825286a7a3a4 adapted to new IsabelleProcess from Pure.jar;
wenzelm
parents: 25948
diff changeset
   130
          if (result.kind == IsabelleProcess.Kind.EXIT) {
25851
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   131
            result = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   132
            IsabellePlugin.consume(null)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   133
          }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   134
        } while (result != null)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   135
      }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   136
    })
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   137
    thread.start
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   138
  }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   139
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   140
  override def stop = {
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   141
    IsabellePlugin.isabelle.kill
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   142
    thread.interrupt; thread.join; thread = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   143
    IsabellePlugin.isabelle = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   144
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   145
    ErrorSource.unregisterErrorSource(IsabellePlugin.errors)
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   146
    IsabellePlugin.errors = null
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   147
  }
606850a6fc1a basic setup for Isabelle/jEdit plugin;
wenzelm
parents:
diff changeset
   148
}