src/Tools/jEdit/src/jedit/scala_console.scala
author wenzelm
Sat, 09 Jan 2010 22:03:47 +0100
changeset 34849 96bcb91b45ce
parent 34846 ca76b3978540
child 34850 fdd560e80264
permissions -rw-r--r--
bind "session"; added printInfoMessage; added stop -- re-inits the interpreter;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     1
/*
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     2
 * Scala instance of Console plugin
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     3
 *
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     4
 * @author Makarius
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     5
 */
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     6
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     8
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     9
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    10
import console.{Console, ConsolePane, Shell, Output}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    11
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    12
import org.gjt.sp.jedit.{jEdit, JARClassLoader}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    13
import org.gjt.sp.jedit.MiscUtilities
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    14
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    15
import java.io.{File, Writer, PrintWriter}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    16
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    17
import scala.tools.nsc.{Interpreter, GenericRunnerSettings, NewLinePrintWriter, ConsoleWriter}
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    18
import scala.collection.mutable
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    19
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    20
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    21
class Scala_Console extends Shell("Scala")
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    22
{
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    23
  /* global state -- owned by Swing thread */
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    24
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    25
  private var interpreters = Map[Console, Interpreter]()
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    26
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    27
  private var global_console: Console = null
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    28
  private var global_out: Output = null
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    29
  private var global_err: Output = null
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    30
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    31
  private def with_console[A](console: Console, out: Output, err: Output)(e: => A): A =
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    32
  {
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    33
    global_console = console
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    34
    global_out = out
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    35
    global_err = if (err == null) out else err
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    36
    val res = Exn.capture { e }
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    37
    global_console = null
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    38
    global_out = null
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    39
    global_err = null
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    40
    Exn.release(res)
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    41
  }
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    42
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    43
  private def report_error(str: String)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    44
  {
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    45
    if (global_console == null || global_err == null) System.err.println(str)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    46
    else global_err.print(global_console.getErrorColor, str)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    47
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    48
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    49
  private def construct_classpath(): String =
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    50
  {
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    51
    def find_jars(start: String): List[String] =
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    52
      if (start != null)
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    53
        Standard_System.find_files(new File(start),
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    54
          entry => entry.isFile && entry.getName.endsWith(".jar")).map(_.getAbsolutePath)
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    55
      else Nil
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    56
    val path =
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    57
      (jEdit.getJEditHome + File.separator + "jedit.jar") ::
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    58
        (find_jars(jEdit.getSettingsDirectory) ::: find_jars(jEdit.getJEditHome))
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    59
     path.mkString(File.pathSeparator)
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    60
  }
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    61
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    62
  private class Console_Writer extends Writer
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    63
  {
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    64
    def close {}
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    65
    def flush {}
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    66
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    67
    override def write(str: String)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    68
    {
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    69
      if (global_out == null) System.out.println(str)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    70
      else global_out.print(null, str)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    71
    }
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    72
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    73
    def write(cbuf: Array[Char], off: Int, len: Int)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    74
    {
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    75
      if (len > 0) write(new String(cbuf.subArray(off, off + len)))
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    76
    }
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    77
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    78
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    79
  override def openConsole(console: Console)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    80
  {
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    81
    val settings = new GenericRunnerSettings(report_error)
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    82
    settings.classpath.value = construct_classpath()
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    83
    val printer = new PrintWriter(new Console_Writer, true)
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    84
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    85
    val interp = new Interpreter(settings, printer)
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    86
    {
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    87
      override def parentClassLoader = new JARClassLoader
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    88
    }
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    89
    interp.setContextClassLoader
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    90
    interp.bind("view", "org.gjt.sp.jedit.View", console.getView)
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    91
    interp.bind("session", "isabelle.proofdocument.Session", Isabelle.session)
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    92
    interpreters += (console -> interp)
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    93
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    94
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    95
  override def closeConsole(console: Console)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    96
  {
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    97
    interpreters -= console
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    98
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    99
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   100
  override def printInfoMessage(out: Output)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   101
  {
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   102
    out.print(null,
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   103
     "This shell evaluates Isabelle/Scala expressions.\n\n" +
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   104
     "The following special toplevel bindings are provided:\n" +
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   105
     "  view    -- current jEdit/Swing view (e.g. view.getBuffer, view.getTextArea)\n" +
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   106
     "  session -- Isabelle session (e.g. session.isabelle_system)\n")
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   107
  }
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   108
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   109
  override def printPrompt(console: Console, out: Output)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   110
	{
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   111
    out.writeAttrs(ConsolePane.colorAttributes(console.getInfoColor), "scala>")
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   112
		out.writeAttrs(ConsolePane.colorAttributes(console.getPlainColor), " ")
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   113
	}
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   114
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   115
  override def execute(console: Console, input: String, out: Output, err: Output, command: String)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   116
  {
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
   117
    val interp = interpreters(console)
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
   118
    with_console(console, out, err) { interp.interpret(command) }
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   119
    if (err != null) err.commandDone()
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   120
		out.commandDone()
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   121
  }
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   122
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   123
  override def stop(console: Console)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   124
  {
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   125
    closeConsole(console)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   126
    console.clear
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   127
    openConsole(console)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   128
    val out = console.getOutput
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   129
    out.commandDone
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   130
    printPrompt(console, out)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   131
  }
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   132
}