lib/jedit/plugin/isabelle_plugin.scala
author wenzelm
Thu, 23 Jul 2009 18:44:08 +0200
changeset 32148 253f6808dabe
parent 27999 c26e0373c24f
permissions -rw-r--r--
renamed simpset_of to global_simpset_of, and local_simpset_of to simpset_of -- same for claset and clasimpset;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     1
/*  Title:      lib/jedit/plugin/isabelle_plugin.scala
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     4
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     5
Isabelle/jEdit plugin -- main setup.
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     6
*/
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     7
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     8
package isabelle.jedit
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
     9
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    10
import java.util.Properties
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    11
import java.lang.NumberFormatException
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    12
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    13
import scala.collection.mutable.ListBuffer
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    14
import scala.io.Source
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    15
27998
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    16
import org.gjt.sp.util.Log
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    17
import org.gjt.sp.jedit.{jEdit, EBPlugin, EBMessage}
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    18
import org.gjt.sp.jedit.msg.DockableWindowUpdate
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    19
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    20
import errorlist.DefaultErrorSource
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    21
import errorlist.ErrorSource
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
    22
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    23
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    24
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    25
/** global state **/
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    26
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    27
object IsabellePlugin {
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    28
27999
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    29
  /* Isabelle symbols */
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    30
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    31
  val symbols = new Symbol.Interpretation
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    32
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    33
  def result_content(result: IsabelleProcess.Result) =
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    34
    XML.content(YXML.parse_failsafe(symbols.decode(result.result))).mkString("")
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    35
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
    36
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    37
  /* Isabelle process */
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    38
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    39
  var isabelle: IsabelleProcess = null
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    40
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    41
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    42
  /* unique ids */
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    43
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    44
  private var id_count: BigInt = 0
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    45
27988
efc6d38d16d2 misc tuning of names;
wenzelm
parents: 27987
diff changeset
    46
  def id() : String = synchronized { id_count += 1; "jedit:" + id_count }
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    47
27988
efc6d38d16d2 misc tuning of names;
wenzelm
parents: 27987
diff changeset
    48
  def id_properties(value: String) : Properties = {
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    49
     val props = new Properties
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    50
     props.setProperty(Markup.ID, value)
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    51
     props
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    52
  }
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    53
27988
efc6d38d16d2 misc tuning of names;
wenzelm
parents: 27987
diff changeset
    54
  def id_properties() : Properties = { id_properties(id()) }
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    55
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    56
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    57
  /* result consumers */
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    58
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    59
  type Consumer = IsabelleProcess.Result => Boolean
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    60
  private var consumers = new ListBuffer[Consumer]
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    61
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    62
  def add_consumer(consumer: Consumer) = synchronized { consumers += consumer }
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    63
27988
efc6d38d16d2 misc tuning of names;
wenzelm
parents: 27987
diff changeset
    64
  def add_permanent_consumer(consumer: IsabelleProcess.Result => Unit) = {
efc6d38d16d2 misc tuning of names;
wenzelm
parents: 27987
diff changeset
    65
    add_consumer(result => { consumer(result); false })
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    66
  }
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    67
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    68
  def del_consumer(consumer: Consumer) = synchronized { consumers -= consumer }
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    69
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    70
  private def consume(result: IsabelleProcess.Result) = {
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    71
    synchronized { consumers.elements.toList } foreach (consumer =>
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    72
      {
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    73
        if (result != null && result.is_control) Log.log(Log.DEBUG, result, null)
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    74
        val finished =
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    75
          try { consumer(result) }
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    76
          catch { case e: Throwable => Log.log(Log.ERROR, result, e); true }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    77
        if (finished || result == null) del_consumer(consumer)
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    78
      })
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
    79
  }
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    80
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    81
  class ConsumerThread extends Thread {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    82
    override def run = {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    83
      var finished = false
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    84
      while (!finished) {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    85
        val result =
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    86
          try { IsabellePlugin.isabelle.get_result() }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    87
          catch { case _: NullPointerException => null }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    88
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    89
        if (result != null) {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    90
          consume(result)
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    91
          if (result.kind == IsabelleProcess.Kind.EXIT) {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    92
            consume(null)
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    93
            finished = true
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    94
          }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    95
        }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    96
        else finished = true
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    97
      }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    98
    }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
    99
  }
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   100
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   101
}
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   102
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   103
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   104
/* Main plugin setup */
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   105
27998
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   106
class IsabellePlugin extends EBPlugin {
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   107
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   108
  import IsabellePlugin._
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   109
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   110
  val errors = new DefaultErrorSource("isabelle")
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   111
  val consumer_thread = new ConsumerThread
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   112
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   113
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   114
  override def start = {
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   115
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   116
    /* error source */
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   117
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   118
    ErrorSource.registerErrorSource(errors)
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   119
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   120
    add_permanent_consumer (result =>
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   121
      if (result != null &&
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   122
          (result.kind == IsabelleProcess.Kind.WARNING ||
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   123
           result.kind == IsabelleProcess.Kind.ERROR)) {
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   124
        (Position.line_of(result.props), Position.file_of(result.props)) match {
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   125
          case (Some(line), Some(file)) =>
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   126
            val typ =
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   127
              if (result.kind == IsabelleProcess.Kind.WARNING) ErrorSource.WARNING
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   128
              else ErrorSource.ERROR
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   129
            val content = result_content(result)
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   130
            if (content.length > 0) {
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   131
              val lines = Source.fromString(content).getLines
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   132
              val err = new DefaultErrorSource.DefaultError(errors,
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   133
                  typ, file, line - 1, 0, 0, lines.next)
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   134
              for (msg <- lines) err.addExtraMessage(msg)
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   135
              errors.addError(err)
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   136
            }
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   137
          case _ =>
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   138
        }
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   139
      })
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   140
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   141
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   142
    /* Isabelle process */
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   143
27995
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   144
    val options =
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   145
      (for (mode <- jEdit.getProperty("isabelle.print-modes").split("\\s+") if mode != "")
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   146
        yield "-m" + mode)
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   147
    val args = {
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   148
      val logic = jEdit.getProperty("isabelle.logic")
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   149
      if (logic != "") List(logic) else Nil
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   150
    }
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   151
    isabelle = new IsabelleProcess((options ++ args): _*)
81cce44fa5d7 isabelle process: pick options/args from properties;
wenzelm
parents: 27991
diff changeset
   152
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   153
    consumer_thread.start
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   154
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   155
  }
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   156
27999
c26e0373c24f moved new Symbol.Interpretation into plugin;
wenzelm
parents: 27998
diff changeset
   157
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   158
  override def stop = {
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   159
    isabelle.kill
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   160
    consumer_thread.join
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   161
    ErrorSource.unregisterErrorSource(errors)
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   162
  }
27991
8e83800a35c8 misc reorganization;
wenzelm
parents: 27988
diff changeset
   163
27998
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   164
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   165
  override def handleMessage(message: EBMessage) = message match {
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   166
    case _: DockableWindowUpdate =>   // FIXME check isabelle process
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   167
    case _ =>
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   168
  }
2cd94c30271c promoted to EBPlugin;
wenzelm
parents: 27995
diff changeset
   169
27987
c3f7fa72af2a rearranged source files;
wenzelm
parents:
diff changeset
   170
}