src/Pure/General/completion.ML
author wenzelm
Sun, 02 Mar 2014 20:34:11 +0100
changeset 55840 2982d233d798
parent 55694 a1184dfb8e00
child 55915 607948c90bf0
permissions -rw-r--r--
consider completion report as part of error message -- less stateful, may get handled;

(*  Title:      Pure/Isar/completion.ML
    Author:     Makarius

Semantic completion within the formal context.
*)

signature COMPLETION =
sig
  type T
  val names: Position.T -> (string * string) list -> T
  val none: T
  val reported_text: T -> string
  val report: T -> unit
end;

structure Completion: COMPLETION =
struct

abstype T = Completion of {pos: Position.T, total: int, names: (string * string) list}
with

fun dest (Completion args) = args;

fun names pos names =
  Completion
   {pos = pos,
    total = length names,
    names = take (Options.default_int "completion_limit") names};

end;

val none = names Position.none [];

fun reported_text completion =
  let val {pos, total, names} = dest completion in
    if Position.is_reported pos andalso not (null names) then
      let
        val markup = Position.markup pos Markup.completion;
        val body = (total, names) |>
          let open XML.Encode in pair int (list (pair string string)) end;
      in YXML.string_of (XML.Elem (markup, body)) end
    else ""
  end;

val report = Output.report o reported_text;

end;