1
1
mirror of https://github.com/github/semantic.git synced 2024-12-23 06:41:45 +03:00
semantic/src/Renderer.hs

91 lines
4.0 KiB
Haskell
Raw Normal View History

2017-04-20 21:00:02 +03:00
{-# LANGUAGE GADTs, MultiParamTypeClasses #-}
2017-03-31 22:55:57 +03:00
module Renderer
( DiffRenderer(..)
, resolveDiffRenderer
, runDiffRenderer
2017-04-20 04:27:36 +03:00
, ParseTreeRenderer(..)
, resolveParseTreeRenderer
2017-04-20 04:27:36 +03:00
, runParseTreeRenderer
2017-04-03 22:31:46 +03:00
, Summaries(..)
, File(..)
2017-03-31 22:55:57 +03:00
) where
2017-04-03 23:00:00 +03:00
import Data.Aeson (ToJSON, Value)
import Data.Functor.Both
import Data.Functor.Classes
import Text.Show
2016-08-24 21:30:29 +03:00
import Data.Map as Map hiding (null)
import Data.Record
2017-04-01 06:02:41 +03:00
import Diff
import Info
2017-03-09 01:45:47 +03:00
import Prologue
2017-03-31 23:49:29 +03:00
import Renderer.JSON as R
import Renderer.Patch as R
import Renderer.SExpression as R
import Renderer.Split as R
import Renderer.Summary as R
import Renderer.TOC as R
import Source (SourceBlob)
import Syntax
2017-04-20 04:27:36 +03:00
import Term
2017-04-20 21:00:02 +03:00
data DiffRenderer fields output where
SplitRenderer :: (HasField fields Category, HasField fields Range) => DiffRenderer fields File
PatchRenderer :: HasField fields Range => DiffRenderer fields File
JSONDiffRenderer :: (ToJSON (Record fields), HasField fields Category, HasField fields Range) => DiffRenderer fields (Map Text Value)
SummaryRenderer :: HasDefaultFields fields => DiffRenderer fields Summaries
SExpressionDiffRenderer :: (HasField fields Category, HasField fields SourceSpan) => SExpressionFormat -> DiffRenderer fields ByteString
ToCRenderer :: HasDefaultFields fields => DiffRenderer fields Summaries
resolveDiffRenderer :: (Monoid output, StringConv output ByteString) => DiffRenderer fields output -> (Both SourceBlob -> Diff (Syntax Text) (Record fields) -> output)
resolveDiffRenderer renderer = case renderer of
SplitRenderer -> (File .) . R.split
PatchRenderer -> (File .) . R.patch
JSONDiffRenderer -> R.json
SummaryRenderer -> R.summary
SExpressionDiffRenderer format -> R.sExpression format
ToCRenderer -> R.toc
runDiffRenderer :: (Monoid output, StringConv output ByteString) => DiffRenderer fields output -> [(Both SourceBlob, Diff (Syntax Text) (Record fields))] -> output
runDiffRenderer = foldMap . uncurry . resolveDiffRenderer
2017-04-22 02:24:14 +03:00
2017-04-20 04:27:36 +03:00
data ParseTreeRenderer fields output where
SExpressionParseTreeRenderer :: (HasField fields Category, HasField fields SourceSpan) => SExpressionFormat -> ParseTreeRenderer fields ByteString
JSONParseTreeRenderer :: HasDefaultFields fields => Bool -> ParseTreeRenderer fields Value
JSONIndexParseTreeRenderer :: HasDefaultFields fields => Bool -> ParseTreeRenderer fields Value
2017-04-20 04:27:36 +03:00
resolveParseTreeRenderer :: (Monoid output, StringConv output ByteString) => ParseTreeRenderer fields output -> (SourceBlob -> Term (Syntax Text) (Record fields) -> output)
resolveParseTreeRenderer renderer = case renderer of
2017-04-20 21:00:02 +03:00
SExpressionParseTreeRenderer format -> R.sExpressionParseTree format
JSONParseTreeRenderer debug -> R.jsonParseTree debug
JSONIndexParseTreeRenderer debug -> R.jsonIndexParseTree debug
2017-04-20 04:27:36 +03:00
runParseTreeRenderer :: (Monoid output, StringConv output ByteString) => ParseTreeRenderer fields output -> [(SourceBlob, Term (Syntax Text) (Record fields))] -> output
runParseTreeRenderer = foldMap . uncurry . resolveParseTreeRenderer
2017-04-22 02:24:14 +03:00
newtype File = File { unFile :: Text }
deriving Show
2017-04-20 21:00:02 +03:00
instance StringConv File ByteString where
strConv _ = encodeUtf8 . unFile
instance Show (DiffRenderer fields output) where
showsPrec _ SplitRenderer = showString "SplitRenderer"
showsPrec _ PatchRenderer = showString "PatchRenderer"
showsPrec _ JSONDiffRenderer = showString "JSONDiffRenderer"
showsPrec _ SummaryRenderer = showString "SummaryRenderer"
showsPrec d (SExpressionDiffRenderer format) = showsUnaryWith showsPrec "SExpressionDiffRenderer" d format
showsPrec _ ToCRenderer = showString "ToCRenderer"
2017-04-20 04:27:36 +03:00
instance Show (ParseTreeRenderer fields output) where
showsPrec d (SExpressionParseTreeRenderer format) = showsUnaryWith showsPrec "SExpressionParseTreeRenderer" d format
showsPrec d (JSONParseTreeRenderer debug) = showsUnaryWith showsPrec "JSONParseTreeRenderer" d debug
showsPrec d (JSONIndexParseTreeRenderer debug) = showsUnaryWith showsPrec "JSONIndexParseTreeRenderer" d debug
2017-04-20 04:27:36 +03:00
instance Monoid File where
mempty = File mempty
mappend (File a) (File b) = File (a <> "\n" <> b)