mxxun/ghc-9.2
mrkun 2022-02-12 17:44:54 +03:00
parent 6210024d24
commit 16a89cdfeb
2 changed files with 38 additions and 28 deletions

View File

@ -8,12 +8,13 @@ import qualified Data.Data
import qualified Data.Semigroup as Semigroup import qualified Data.Semigroup as Semigroup
import qualified Data.Sequence as Seq import qualified Data.Sequence as Seq
import qualified Data.Text as Text import qualified Data.Text as Text
import GHC (AnnKeywordId(..), GenLocated(L), RdrName(..), SrcSpan) import GHC (GenLocated(L), RdrName(..))
import qualified GHC.Data.FastString as FastString import qualified GHC.Data.FastString as FastString
import GHC.Hs import GHC.Hs
import qualified GHC.OldList as List import qualified GHC.OldList as List
import GHC.Types.Basic import GHC.Types.Basic
import GHC.Types.Name import GHC.Types.Name
import GHC.Types.SourceText
import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Config.Types
import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.LayouterBasics
import Language.Haskell.Brittany.Internal.Layouters.Decl import Language.Haskell.Brittany.Internal.Layouters.Decl
@ -27,7 +28,7 @@ import Language.Haskell.Brittany.Internal.Utils
layoutExpr :: ToBriDoc HsExpr layoutExpr :: ToBriDoc AnnListItem HsExpr
layoutExpr lexpr@(L _ expr) = do layoutExpr lexpr@(L _ expr) = do
indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack
let allowFreeIndent = indentPolicy == IndentPolicyFree let allowFreeIndent = indentPolicy == IndentPolicyFree
@ -38,7 +39,7 @@ layoutExpr lexpr@(L _ expr) = do
HsRecFld{} -> do HsRecFld{} -> do
-- TODO -- TODO
briDocByExactInlineOnly "HsRecFld" lexpr briDocByExactInlineOnly "HsRecFld" lexpr
HsOverLabel _ext _reboundFromLabel name -> HsOverLabel _ext name ->
let label = FastString.unpackFS name in docLit . Text.pack $ '#' : label let label = FastString.unpackFS name in docLit . Text.pack $ '#' : label
HsIPVar _ext (HsIPName name) -> HsIPVar _ext (HsIPName name) ->
let label = FastString.unpackFS name in docLit . Text.pack $ '?' : label let label = FastString.unpackFS name in docLit . Text.pack $ '?' : label
@ -49,7 +50,7 @@ layoutExpr lexpr@(L _ expr) = do
HsLam _ (MG _ (L _ [lmatch@(L _ match)]) _) HsLam _ (MG _ (L _ [lmatch@(L _ match)]) _)
| pats <- m_pats match | pats <- m_pats match
, GRHSs _ [lgrhs] llocals <- m_grhss match , GRHSs _ [lgrhs] llocals <- m_grhss match
, L _ EmptyLocalBinds{} <- llocals , EmptyLocalBinds{} <- llocals
, L _ (GRHS _ [] body) <- lgrhs , L _ (GRHS _ [] body) <- lgrhs
-> do -> do
patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) -> patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) ->
@ -86,7 +87,7 @@ layoutExpr lexpr@(L _ expr) = do
[ docLit $ Text.pack "\\" [ docLit $ Text.pack "\\"
, docWrapNode lmatch $ docForceSingleline funcPatternPartLine , docWrapNode lmatch $ docForceSingleline funcPatternPartLine
, appSep $ docLit $ Text.pack "->" , appSep $ docLit $ Text.pack "->"
, docWrapNode lgrhs $ docForceSingleline bodyDoc , docWrapNode (reLocA lgrhs) $ docForceSingleline bodyDoc
] ]
-- double line -- double line
, docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar
@ -97,13 +98,13 @@ layoutExpr lexpr@(L _ expr) = do
, docLit $ Text.pack "->" , docLit $ Text.pack "->"
] ]
) )
(docWrapNode lgrhs $ docForceSingleline bodyDoc) (docWrapNode (reLocA lgrhs) $ docForceSingleline bodyDoc)
-- wrapped par spacing -- wrapped par spacing
, docSetParSpacing $ docSeq , docSetParSpacing $ docSeq
[ docLit $ Text.pack "\\" [ docLit $ Text.pack "\\"
, docWrapNode lmatch $ docForceSingleline funcPatternPartLine , docWrapNode lmatch $ docForceSingleline funcPatternPartLine
, appSep $ docLit $ Text.pack "->" , appSep $ docLit $ Text.pack "->"
, docWrapNode lgrhs $ docForceParSpacing bodyDoc , docWrapNode (reLocA lgrhs) $ docForceParSpacing bodyDoc
] ]
-- conservative -- conservative
, docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar
@ -114,7 +115,7 @@ layoutExpr lexpr@(L _ expr) = do
, docLit $ Text.pack "->" , docLit $ Text.pack "->"
] ]
) )
(docWrapNode lgrhs $ docNonBottomSpacing bodyDoc) (docWrapNode (reLocA lgrhs) $ docNonBottomSpacing bodyDoc)
] ]
HsLam{} -> unknownNodeError "HsLam too complex" lexpr HsLam{} -> unknownNodeError "HsLam too complex" lexpr
HsLamCase _ (MG _ (L _ []) _) -> do HsLamCase _ (MG _ (L _ []) _) -> do
@ -378,14 +379,14 @@ layoutExpr lexpr@(L _ expr) = do
ExplicitTuple _ args boxity -> do ExplicitTuple _ args boxity -> do
let let
argExprs = args <&> \arg -> case arg of argExprs = args <&> \arg -> case arg of
(L _ (Present _ e)) -> (arg, Just e) (Present _ e) -> (arg, Just e)
(L _ (Missing NoExtField)) -> (arg, Nothing) (Missing _) -> (arg, Nothing)
argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) -> argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) ->
docWrapNode arg $ maybe docEmpty layoutExpr exprM docWrapNode (noLocA arg) $ maybe docEmpty layoutExpr exprM
hasComments <- hasComments <-
orM orM
(hasCommentsBetween lexpr AnnOpenP AnnCloseP (hasCommentsBetween lexpr AnnOpenP AnnCloseP
: map hasAnyCommentsBelow args : map (hasAnyCommentsBelow . noLocA) args
) )
let let
(openLit, closeLit) = case boxity of (openLit, closeLit) = case boxity of
@ -758,7 +759,7 @@ layoutExpr lexpr@(L _ expr) = do
_ -> do _ -> do
-- TODO -- TODO
unknownNodeError "HsDo{} unknown stmtCtx" lexpr unknownNodeError "HsDo{} unknown stmtCtx" lexpr
ExplicitList _ _ elems@(_ : _) -> do ExplicitList _ elems@(_ : _) -> do
elemDocs <- elems `forM` docSharedWrapper layoutExpr elemDocs <- elems `forM` docSharedWrapper layoutExpr
hasComments <- hasAnyCommentsBelow lexpr hasComments <- hasAnyCommentsBelow lexpr
case splitFirstLast elemDocs of case splitFirstLast elemDocs of
@ -800,12 +801,12 @@ layoutExpr lexpr@(L _ expr) = do
[docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN] [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN]
end = docLit $ Text.pack "]" end = docLit $ Text.pack "]"
in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end]
ExplicitList _ _ [] -> docLit $ Text.pack "[]" ExplicitList _ [] -> docLit $ Text.pack "[]"
RecordCon _ lname fields -> case fields of RecordCon _ lname fields -> case fields of
HsRecFields fs Nothing -> do HsRecFields fs Nothing -> do
let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname
rFs <- rFs <-
fs `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do fs `forM` \lfield@(L _ (HsRecField _ (L _ fieldOcc) rFExpr pun)) -> do
let FieldOcc _ lnameF = fieldOcc let FieldOcc _ lnameF = fieldOcc
rFExpDoc <- if pun rFExpDoc <- if pun
then return Nothing then return Nothing
@ -818,7 +819,7 @@ layoutExpr lexpr@(L _ expr) = do
HsRecFields fs@(_ : _) (Just (L _ dotdoti)) | dotdoti == length fs -> do HsRecFields fs@(_ : _) (Just (L _ dotdoti)) | dotdoti == length fs -> do
let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname
fieldDocs <- fieldDocs <-
fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do fs `forM` \fieldl@(L _ (HsRecField _ (L _ fieldOcc) fExpr pun)) -> do
let FieldOcc _ lnameF = fieldOcc let FieldOcc _ lnameF = fieldOcc
fExpDoc <- if pun fExpDoc <- if pun
then return Nothing then return Nothing
@ -826,10 +827,10 @@ layoutExpr lexpr@(L _ expr) = do
return (fieldl, lrdrNameToText lnameF, fExpDoc) return (fieldl, lrdrNameToText lnameF, fExpDoc)
recordExpression True indentPolicy lexpr nameDoc fieldDocs recordExpression True indentPolicy lexpr nameDoc fieldDocs
_ -> unknownNodeError "RecordCon with puns" lexpr _ -> unknownNodeError "RecordCon with puns" lexpr
RecordUpd _ rExpr fields -> do RecordUpd _ rExpr (Left fields) -> do
rExprDoc <- docSharedWrapper layoutExpr rExpr rExprDoc <- docSharedWrapper layoutExpr rExpr
rFs <- rFs <-
fields `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do fields `forM` \lfield@(L _ (HsRecField _ (L _ ambName) rFExpr pun)) -> do
rFExpDoc <- if pun rFExpDoc <- if pun
then return Nothing then return Nothing
else Just <$> docSharedWrapper layoutExpr rFExpr else Just <$> docSharedWrapper layoutExpr rFExpr
@ -837,7 +838,11 @@ layoutExpr lexpr@(L _ expr) = do
Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc)
Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc)
recordExpression False indentPolicy lexpr rExprDoc rFs recordExpression False indentPolicy lexpr rExprDoc rFs
ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do RecordUpd _ _rExpr (Right _projections) -> do
-- TODO
briDocByExactInlineOnly "RecordUpd _ _ (Right _projections)" lexpr
ExprWithTySig _ exp1 (HsWC _ (L _ (HsSig _ _ typ1))) -> do
expDoc <- docSharedWrapper layoutExpr exp1 expDoc <- docSharedWrapper layoutExpr exp1
typDoc <- docSharedWrapper layoutType typ1 typDoc <- docSharedWrapper layoutType typ1
docSeq [appSep expDoc, appSep $ docLit $ Text.pack "::", typDoc] docSeq [appSep expDoc, appSep $ docLit $ Text.pack "::", typDoc]
@ -925,14 +930,21 @@ layoutExpr lexpr@(L _ expr) = do
HsPragE{} -> do HsPragE{} -> do
-- TODO -- TODO
briDocByExactInlineOnly "HsPragE{}" lexpr briDocByExactInlineOnly "HsPragE{}" lexpr
HsGetField{} -> do
-- TODO
briDocByExactInlineOnly "HsGetField{}" lexpr
HsProjection{} -> do
-- TODO
briDocByExactInlineOnly "HsProjection{}" lexpr
recordExpression recordExpression
:: (Data.Data.Data lExpr, Data.Data.Data name) :: (Data.Data.Data lExpr, Data.Data.Data name)
=> Bool => Bool
-> IndentPolicy -> IndentPolicy
-> GenLocated SrcSpan lExpr -> LocatedAn an1 lExpr
-> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered
-> [ ( GenLocated SrcSpan name -> [ ( LocatedAn an2 name
, Text , Text
, Maybe (ToBriDocM BriDocNumbered) , Maybe (ToBriDocM BriDocNumbered)
) )
@ -1073,14 +1085,14 @@ litBriDoc = \case
HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
HsRat _ (FL (SourceText t) _ _) _type -> BDFLit $ Text.pack t HsRat _ (FL (SourceText t) _ _ _ _) _type -> BDFLit $ Text.pack t
HsFloatPrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t HsFloatPrim _ (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t
HsDoublePrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t HsDoublePrim _ (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t
_ -> error "litBriDoc: literal with no SourceText" _ -> error "litBriDoc: literal with no SourceText"
overLitValBriDoc :: OverLitVal -> BriDocFInt overLitValBriDoc :: OverLitVal -> BriDocFInt
overLitValBriDoc = \case overLitValBriDoc = \case
HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t
HsFractional (FL (SourceText t) _ _) -> BDFLit $ Text.pack t HsFractional (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t
HsIsString (SourceText t) _ -> BDFLit $ Text.pack t HsIsString (SourceText t) _ -> BDFLit $ Text.pack t
_ -> error "overLitValBriDoc: literal with no SourceText" _ -> error "overLitValBriDoc: literal with no SourceText"

View File

@ -7,9 +7,7 @@ import Language.Haskell.Brittany.Internal.Types
layoutExpr :: ToBriDoc an HsExpr layoutExpr :: ToBriDoc AnnListItem HsExpr
-- layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs))
litBriDoc :: HsLit GhcPs -> BriDocFInt litBriDoc :: HsLit GhcPs -> BriDocFInt