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