src/Tools/VSCode/src/vscode_rendering.scala
author wenzelm
Fri, 10 Mar 2017 21:47:48 +0100
changeset 65176 908d8be90533
parent 65174 c0388fbd8096
child 65196 e8760a98db78
permissions -rw-r--r--
suppress irrelevant markup for VSCode;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64622
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/VSCode/src/vscode_rendering.scala
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     3
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     4
Isabelle/VSCode-specific implementation of quasi-abstract rendering and
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     5
markup interpretation.
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     6
*/
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     7
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     8
package isabelle.vscode
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
     9
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
    10
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
    11
import isabelle._
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
    12
64778
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
    13
import java.io.{File => JFile}
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
    14
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
    15
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
    16
object VSCode_Rendering
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
    17
{
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    18
  /* decorations */
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    19
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
    20
  private def color_decorations(prefix: String, types: Set[Rendering.Color.Value],
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    21
    colors: List[Text.Info[Rendering.Color.Value]]): List[Document_Model.Decoration] =
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    22
  {
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    23
    val color_ranges =
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    24
      (Map.empty[Rendering.Color.Value, List[Text.Range]] /: colors) {
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    25
        case (m, Text.Info(range, c)) => m + (c -> (range :: m.getOrElse(c, Nil)))
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    26
      }
65105
1f47b92021de clarified signature;
wenzelm
parents: 65104
diff changeset
    27
    types.toList.map(c =>
65140
1191df79aa1c tuned signature;
wenzelm
parents: 65137
diff changeset
    28
      Document_Model.Decoration.ranges(prefix + c.toString, color_ranges.getOrElse(c, Nil).reverse))
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    29
  }
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    30
65176
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    31
  private val background_colors =
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    32
    Rendering.Color.background_colors - Rendering.Color.active - Rendering.Color.active_result -
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    33
      Rendering.Color.entity
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    34
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
    35
  private val dotted_colors =
65134
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    36
    Set(Rendering.Color.writeln, Rendering.Color.information, Rendering.Color.warning)
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
    37
65104
66b19d05dcee decorations for background and foreground colors;
wenzelm
parents: 65095
diff changeset
    38
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    39
  /* diagnostic messages */
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    40
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    41
  private val message_severity =
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    42
    Map(
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    43
      Markup.LEGACY -> Protocol.DiagnosticSeverity.Warning,
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
    44
      Markup.ERROR -> Protocol.DiagnosticSeverity.Error)
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    45
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    46
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    47
  /* markup elements */
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    48
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    49
  private val diagnostics_elements =
65134
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    50
    Markup.Elements(Markup.LEGACY, Markup.ERROR)
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
    51
65176
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    52
  private val background_elements =
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    53
    Rendering.background_elements - Markup.ENTITY -- Rendering.active_elements
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
    54
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
    55
  private val dotted_elements =
65134
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    56
    Markup.Elements(Markup.WRITELN, Markup.INFORMATION, Markup.WARNING)
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
    57
65134
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    58
  val tooltip_elements =
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    59
    Markup.Elements(Markup.WRITELN, Markup.INFORMATION, Markup.WARNING, Markup.BAD) ++
511bf19348d3 clarified messages (with improved scalability): legacy/error as diagnostics, writeln/information/warning/bad as tooltips (dynamic hover);
wenzelm
parents: 65122
diff changeset
    60
    Rendering.tooltip_elements
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    61
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
    62
  private val hyperlink_elements =
64833
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
    63
    Markup.Elements(Markup.ENTITY, Markup.PATH, Markup.POSITION, Markup.CITATION)
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
    64
}
64622
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
    65
64649
d67c3094a0c2 tuned signature -- more explicit types;
wenzelm
parents: 64648
diff changeset
    66
class VSCode_Rendering(
d67c3094a0c2 tuned signature -- more explicit types;
wenzelm
parents: 64648
diff changeset
    67
    val model: Document_Model,
d67c3094a0c2 tuned signature -- more explicit types;
wenzelm
parents: 64648
diff changeset
    68
    snapshot: Document.Snapshot,
64702
d95b9117cb5b re-use resources from session;
wenzelm
parents: 64688
diff changeset
    69
    resources: VSCode_Resources)
64704
08c2d80428ff re-use options from resources;
wenzelm
parents: 64702
diff changeset
    70
  extends Rendering(snapshot, resources.options, resources)
64622
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
    71
{
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    72
  /* completion */
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    73
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    74
  def completion(range: Text.Range): List[Protocol.CompletionItem] =
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    75
    semantic_completion(None, range) match {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    76
      case Some(Text.Info(complete_range, names: Completion.Names)) =>
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    77
        model.content.try_get_text(complete_range) match {
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    78
          case Some(original) =>
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    79
            names.complete(complete_range, Completion.History.empty,
65137
812c35fbffa8 clarified options;
wenzelm
parents: 65134
diff changeset
    80
                resources.unicode_symbols, original) match {
64877
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    81
              case Some(result) =>
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    82
                result.items.map(item =>
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    83
                  Protocol.CompletionItem(
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    84
                    label = item.replacement,
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    85
                    detail = Some(item.description.mkString(" ")),
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    86
                    range = Some(model.content.doc.range(item.range))))
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    87
              case None => Nil
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    88
            }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    89
          case None => Nil
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    90
        }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    91
      case _ => Nil
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    92
    }
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    93
31e9920a0dc1 support for semantic completion;
wenzelm
parents: 64870
diff changeset
    94
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    95
  /* diagnostics */
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    96
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    97
  def diagnostics: List[Text.Info[Command.Results]] =
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
    98
    snapshot.cumulate[Command.Results](
64830
9bc44bef99e6 more explocit Document_Model.Content;
wenzelm
parents: 64821
diff changeset
    99
      model.content.text_range, Command.Results.empty, VSCode_Rendering.diagnostics_elements, _ =>
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   100
      {
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   101
        case (res, Text.Info(_, msg @ XML.Elem(Markup(_, Markup.Serial(i)), body)))
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   102
        if body.nonEmpty => Some(res + (i -> msg))
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   103
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   104
        case _ => None
64802
adc4c84b692c suppress empty results;
wenzelm
parents: 64779
diff changeset
   105
      }).filterNot(info => info.info.is_empty)
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   106
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   107
  def diagnostics_output(results: List[Text.Info[Command.Results]]): List[Protocol.Diagnostic] =
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   108
  {
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   109
    (for {
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   110
      Text.Info(text_range, res) <- results.iterator
64830
9bc44bef99e6 more explocit Document_Model.Content;
wenzelm
parents: 64821
diff changeset
   111
      range = model.content.doc.range(text_range)
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   112
      (_, XML.Elem(Markup(name, _), body)) <- res.iterator
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   113
    } yield {
65107
70b0113fa4ef clarified pretty margin;
wenzelm
parents: 65106
diff changeset
   114
      val message = resources.output_pretty_message(body)
64679
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   115
      val severity = VSCode_Rendering.message_severity.get(name)
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   116
      Protocol.Diagnostic(range, message, severity = severity)
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   117
    }).toList
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   118
  }
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   119
b2bf280b7e13 more uniform treatment of input/output wrt. client;
wenzelm
parents: 64668
diff changeset
   120
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   121
  /* text color */
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   122
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   123
  def text_color(range: Text.Range): List[Text.Info[Rendering.Color.Value]] =
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   124
  {
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   125
    snapshot.select(range, Rendering.text_color_elements, _ =>
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   126
      {
65174
c0388fbd8096 avoid extra decorations for regular command keywords;
wenzelm
parents: 65173
diff changeset
   127
        case Text.Info(_, XML.Elem(Markup(name, props), _)) =>
c0388fbd8096 avoid extra decorations for regular command keywords;
wenzelm
parents: 65173
diff changeset
   128
          if (name != Markup.IMPROPER && props.contains((Markup.KIND, Markup.COMMAND))) None
c0388fbd8096 avoid extra decorations for regular command keywords;
wenzelm
parents: 65173
diff changeset
   129
          else Rendering.text_color.get(name)
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   130
      })
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   131
  }
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   132
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   133
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   134
  /* dotted underline */
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   135
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   136
  def dotted(range: Text.Range): List[Text.Info[Rendering.Color.Value]] =
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   137
    message_underline_color(VSCode_Rendering.dotted_elements, range)
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   138
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   139
65142
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   140
  /* spell checker */
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   141
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   142
  def spell_checker: Document_Model.Decoration =
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   143
  {
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   144
    val ranges =
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   145
      (for {
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   146
        spell_checker <- resources.spell_checker.get.iterator
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   147
        spell_range <- spell_checker_ranges(model.content.text_range).iterator
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   148
        text <- model.content.try_get_text(spell_range).iterator
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   149
        info <- spell_checker.marked_words(spell_range.start, text).iterator
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   150
      } yield info.range).toList
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   151
    Document_Model.Decoration.ranges("spell_checker", ranges)
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   152
  }
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   153
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   154
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   155
  /* decorations */
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   156
65120
db6cc23fcf33 proper reset of published decorations: initial value is Nil, afterwards it is a list of canonical length and order;
wenzelm
parents: 65107
diff changeset
   157
  def decorations: List[Document_Model.Decoration] = // list of canonical length and order
65176
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
   158
    VSCode_Rendering.color_decorations("background_", VSCode_Rendering.background_colors,
908d8be90533 suppress irrelevant markup for VSCode;
wenzelm
parents: 65174
diff changeset
   159
      background(VSCode_Rendering.background_elements, model.content.text_range, Set.empty)) :::
65143
wenzelm
parents: 65142
diff changeset
   160
    VSCode_Rendering.color_decorations("foreground_", Rendering.Color.foreground_colors,
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   161
      foreground(model.content.text_range)) :::
65146
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   162
    VSCode_Rendering.color_decorations("text_", Rendering.Color.text_colors,
69ea3f1715be decorations for text color;
wenzelm
parents: 65143
diff changeset
   163
      text_color(model.content.text_range)) :::
65122
1edb570f5b17 decorations for dotted underline: less intrusive;
wenzelm
parents: 65120
diff changeset
   164
    VSCode_Rendering.color_decorations("dotted_", VSCode_Rendering.dotted_colors,
65142
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   165
      dotted(model.content.text_range)) :::
368004bed323 decorations for spell-checker;
wenzelm
parents: 65140
diff changeset
   166
    List(spell_checker)
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   167
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   168
  def decoration_output(decoration: Document_Model.Decoration): Protocol.Decoration =
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   169
  {
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   170
    val content =
65105
1f47b92021de clarified signature;
wenzelm
parents: 65104
diff changeset
   171
      for (Text.Info(text_range, msgs) <- decoration.content)
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   172
      yield {
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   173
        val range = model.content.doc.range(text_range)
65173
3700be571a01 more compact protocol message;
wenzelm
parents: 65146
diff changeset
   174
        Protocol.DecorationOpts(range,
65107
70b0113fa4ef clarified pretty margin;
wenzelm
parents: 65106
diff changeset
   175
          msgs.map(msg => Protocol.MarkedString(resources.output_pretty_tooltip(msg))))
65095
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   176
      }
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   177
    Protocol.Decoration(decoration.typ, content)
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   178
  }
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   179
eb21a4f70b0e publish decorations like diagnostics;
wenzelm
parents: 64877
diff changeset
   180
64622
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
   181
  /* tooltips */
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
   182
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
   183
  def timing_threshold: Double = options.real("vscode_timing_threshold")
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   184
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   185
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   186
  /* hyperlinks */
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   187
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   188
  def hyperlink_source_file(source_name: String, line1: Int, range: Symbol.Range)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   189
    : Option[Line.Node_Range] =
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   190
  {
64775
dd3797f1e0d6 clarified file URIs;
wenzelm
parents: 64762
diff changeset
   191
    for {
64779
wenzelm
parents: 64778
diff changeset
   192
      platform_path <- resources.source_file(source_name)
64778
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
   193
      file <-
64779
wenzelm
parents: 64778
diff changeset
   194
        (try { Some(new JFile(platform_path).getCanonicalFile) }
64778
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
   195
         catch { case ERROR(_) => None })
64775
dd3797f1e0d6 clarified file URIs;
wenzelm
parents: 64762
diff changeset
   196
    }
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   197
    yield {
64778
7884a19de325 proper interpretation of Resources.source_file as platform file;
wenzelm
parents: 64777
diff changeset
   198
      Line.Node_Range(file.getPath,
64841
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   199
        if (range.start > 0) {
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   200
          resources.get_file_content(file) match {
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   201
            case Some(text) =>
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   202
              val chunk = Symbol.Text_Chunk(text)
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   203
              val doc = Line.Document(text, resources.text_length)
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   204
              doc.range(chunk.decode(range))
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   205
            case _ =>
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   206
              Line.Range(Line.Position((line1 - 1) max 0))
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   207
          }
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   208
        }
d53696aed874 added node_name(String): imitate jEdit buffer operations;
wenzelm
parents: 64833
diff changeset
   209
        else Line.Range(Line.Position((line1 - 1) max 0)))
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   210
    }
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   211
  }
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   212
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   213
  def hyperlink_command(id: Document_ID.Generic, range: Symbol.Range): Option[Line.Node_Range] =
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   214
  {
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   215
    if (snapshot.is_outdated) None
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   216
    else
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   217
      for {
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   218
        start <- snapshot.find_command_position(id, range.start)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   219
        stop <- snapshot.find_command_position(id, range.stop)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   220
      } yield Line.Node_Range(start.name, Line.Range(start.pos, stop.pos))
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   221
  }
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   222
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   223
  def hyperlink_position(pos: Position.T): Option[Line.Node_Range] =
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   224
    pos match {
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   225
      case Position.Item_File(name, line, range) => hyperlink_source_file(name, line, range)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   226
      case Position.Item_Id(id, range) => hyperlink_command(id, range)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   227
      case _ => None
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   228
    }
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   229
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   230
  def hyperlink_def_position(pos: Position.T): Option[Line.Node_Range] =
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   231
    pos match {
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   232
      case Position.Item_Def_File(name, line, range) => hyperlink_source_file(name, line, range)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   233
      case Position.Item_Def_Id(id, range) => hyperlink_command(id, range)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   234
      case _ => None
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   235
    }
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   236
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   237
  def hyperlinks(range: Text.Range): List[Line.Node_Range] =
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   238
  {
64651
ea5620f7b0d8 clarified signature;
wenzelm
parents: 64649
diff changeset
   239
    snapshot.cumulate[List[Line.Node_Range]](
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   240
      range, Nil, VSCode_Rendering.hyperlink_elements, _ =>
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   241
        {
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   242
          case (links, Text.Info(_, XML.Elem(Markup.Path(name), _))) =>
64759
100941134718 clarified master_dir: file-URL;
wenzelm
parents: 64730
diff changeset
   243
            val file = resources.append_file(snapshot.node_name.master_dir, name)
64654
31b681e38c70 clarified signature;
wenzelm
parents: 64652
diff changeset
   244
            Some(Line.Node_Range(file) :: links)
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   245
64667
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   246
          case (links, Text.Info(info_range, XML.Elem(Markup(Markup.ENTITY, props), _))) =>
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   247
            hyperlink_def_position(props).map(_ :: links)
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   248
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   249
          case (links, Text.Info(info_range, XML.Elem(Markup(Markup.POSITION, props), _))) =>
cdb0d559a24b full range for Position.Item;
wenzelm
parents: 64659
diff changeset
   250
            hyperlink_position(props).map(_ :: links)
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   251
64833
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   252
          case (links, Text.Info(info_range, XML.Elem(Markup.Citation(name), _))) =>
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   253
            val iterator =
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   254
              for {
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   255
                Text.Info(entry_range, (entry, model)) <- resources.bibtex_entries_iterator
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   256
                if entry == name
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   257
              } yield Line.Node_Range(model.node_name.node, model.content.doc.range(entry_range))
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   258
            if (iterator.isEmpty) None else Some((links /: iterator)(_ :+ _))
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64830
diff changeset
   259
64648
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   260
          case _ => None
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   261
        }) match { case Text.Info(_, links) :: _ => links.reverse case _ => Nil }
5d7f741aaccb basic support for hyperlinks / Goto Definition Request;
wenzelm
parents: 64622
diff changeset
   262
  }
64622
529bbb8977c7 more uniform rendering for Isabelle/jEdit and Isabelle/VSCode;
wenzelm
parents:
diff changeset
   263
}