module Agda.Interaction.EmacsCommand
( displayInfo
, clearRunningInfo
, displayRunningInfo
) where
import Prelude hiding (null)
import Data.Bifunctor (second)
import Data.Text qualified as Text
import Agda.Syntax.Common.Pretty (DocTree)
import Agda.Interaction.Emacs.Lisp
import Agda.Interaction.Highlighting.Emacs (HighlightingInfo, lispifyHighlightingInfo_)
import Agda.TypeChecking.Monad.Base.Types (ModuleToSource)
import Agda.Utils.Null
import Agda.Utils.String (quote)
import Agda.Utils.DocTree (treeToTextNoAnn, treeToTextWithAnn)
displayInfo :: String -> DocTree -> Bool -> Maybe ModuleToSource -> Lisp String
displayInfo :: String -> DocTree -> Bool -> Maybe ModuleToSource -> Lisp String
displayInfo String
header DocTree
content Bool
append Maybe ModuleToSource
m = [Lisp String] -> Lisp String
forall a. [Lisp a] -> Lisp a
L ([Lisp String] -> Lisp String) -> [Lisp String] -> Lisp String
forall a b. (a -> b) -> a -> b
$ [[Lisp String]] -> [Lisp String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [ String -> Lisp String
forall a. a -> Lisp a
A String
"agda2-info-action"
, String -> Lisp String
forall a. a -> Lisp a
A (String -> String
quote String
header)
, String -> Lisp String
forall a. a -> Lisp a
A (String -> String
quote (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Text -> String
Text.unpack Text
t)
, String -> Lisp String
forall a. a -> Lisp a
A (if Bool
append then String
"t" else String
"nil")
]
, (Lisp String -> Lisp String) -> [Lisp String] -> [Lisp String]
forall a b. (a -> b) -> [a] -> [b]
map Lisp String -> Lisp String
forall a. Lisp a -> Lisp a
Q [Lisp String]
ann
]
where
(Text
t, [Lisp String]
ann) = case Maybe ModuleToSource
m of
Maybe ModuleToSource
Nothing -> (, []) (Text -> (Text, [Lisp String])) -> Text -> (Text, [Lisp String])
forall a b. (a -> b) -> a -> b
$ DocTree -> Text
forall ann. DocTree ann -> Text
treeToTextNoAnn DocTree
content
Just ModuleToSource
m2s -> (HighlightingInfo -> [Lisp String])
-> (Text, HighlightingInfo) -> (Text, [Lisp String])
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (ModuleToSource -> HighlightingInfo -> [Lisp String]
lispifyHighlightingInfo_ ModuleToSource
m2s) ((Text, HighlightingInfo) -> (Text, [Lisp String]))
-> (Text, HighlightingInfo) -> (Text, [Lisp String])
forall a b. (a -> b) -> a -> b
$ DocTree -> (Text, HighlightingInfo)
forall ann.
(Monoid ann, Null ann) =>
DocTree ann -> (Text, RangeMap ann)
treeToTextWithAnn DocTree
content
runningInfoHeader :: String
= String
"*Type-checking*"
clearRunningInfo :: Lisp String
clearRunningInfo :: Lisp String
clearRunningInfo = String -> DocTree -> Bool -> Maybe ModuleToSource -> Lisp String
displayInfo String
runningInfoHeader DocTree
forall a. Null a => a
empty Bool
False Maybe ModuleToSource
forall a. Maybe a
Nothing
displayRunningInfo :: DocTree -> Maybe ModuleToSource -> Lisp String
displayRunningInfo :: DocTree -> Maybe ModuleToSource -> Lisp String
displayRunningInfo DocTree
t = String -> DocTree -> Bool -> Maybe ModuleToSource -> Lisp String
displayInfo String
runningInfoHeader DocTree
t Bool
True