src/Tools/Haskell/Completion.hs
author wenzelm
Mon, 12 Nov 2018 15:36:55 +0100
changeset 69290 fb77612d11eb
parent 69289 bf6937af7fe8
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     1
{- generated by Isabelle -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     2
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     3
{-  Title:      Tools/Haskell/Completion.hs
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     4
    Author:     Makarius
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     5
    LICENSE:    BSD 3-clause (Isabelle)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     6
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     7
Completion of names.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     8
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
     9
See also "$ISABELLE_HOME/src/Pure/General/completion.ML".
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    10
-}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    11
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    12
module Isabelle.Completion (
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    13
    Name, T, names, none, make, markup_element, markup_report, make_report
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    14
  ) where
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    15
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    16
import qualified Data.List as List
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    17
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    18
import Isabelle.Library
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    19
import qualified Isabelle.Properties as Properties
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    20
import qualified Isabelle.Markup as Markup
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    21
import qualified Isabelle.XML.Encode as Encode
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    22
import qualified Isabelle.XML as XML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    23
import qualified Isabelle.YXML as YXML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    24
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    25
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    26
type Name = (String, (String, String))  -- external name, kind, internal name
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    27
data T = Completion Properties.T Int [Name]  -- position, total length, names
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    28
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    29
names :: Int -> Properties.T -> [Name] -> T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    30
names limit props names = Completion props (length names) (take limit names)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    31
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    32
none :: T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    33
none = names 0 [] []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    34
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    35
make :: Int -> (String, Properties.T) -> ((String -> Bool) -> [Name]) -> T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    36
make limit (name, props) make_names =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    37
  if name /= "" && name /= "_"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    38
  then names limit props (make_names $ List.isPrefixOf $ clean_name name)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    39
  else none
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    40
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    41
markup_element :: T -> (Markup.T, XML.Body)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    42
markup_element (Completion props total names) =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    43
  if not (null names) then
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    44
    let
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    45
      markup = Markup.properties props Markup.completion
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    46
      body =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    47
        Encode.pair Encode.int
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    48
          (Encode.list (Encode.pair Encode.string (Encode.pair Encode.string Encode.string)))
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    49
          (total, names)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    50
    in (markup, body)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    51
  else (Markup.empty, [])
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents:
diff changeset
    52
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    53
markup_report :: [T] -> String
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    54
markup_report [] = ""
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    55
markup_report elems =
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
    56
  YXML.string_of $ XML.Elem (Markup.report, map (XML.Elem . markup_element) elems)
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    57
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    58
make_report :: Int -> (String, Properties.T) -> ((String -> Bool) -> [Name]) -> String
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    59
make_report limit name_props make_names =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
    60
  markup_report [make limit name_props make_names]