summaryrefslogtreecommitdiff
path: root/compiler/GHC/Hs/Extension.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Hs/Extension.hs')
-rw-r--r--compiler/GHC/Hs/Extension.hs639
1 files changed, 5 insertions, 634 deletions
diff --git a/compiler/GHC/Hs/Extension.hs b/compiler/GHC/Hs/Extension.hs
index 3e9bac5442..ac79d83d0b 100644
--- a/compiler/GHC/Hs/Extension.hs
+++ b/compiler/GHC/Hs/Extension.hs
@@ -14,7 +14,7 @@
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE UndecidableSuperClasses #-} -- for IsPass; see Note [NoGhcTc]
{-# LANGUAGE UndecidableInstances #-} -- Wrinkle in Note [Trees That Grow]
- -- in module GHC.Hs.Extension
+ -- in module Language.Haskell.Syntax.Extension
module GHC.Hs.Extension where
@@ -24,6 +24,7 @@ module GHC.Hs.Extension where
import GHC.Prelude
import Data.Data hiding ( Fixity )
+import Language.Haskell.Syntax.Extension
import GHC.Types.Name
import GHC.Types.Name.Reader
import GHC.Types.Var
@@ -31,40 +32,7 @@ import GHC.Utils.Outputable
import GHC.Types.SrcLoc (Located, unLoc, noLoc)
import GHC.Utils.Panic
-import Data.Kind
-
{-
-Note [Trees that grow]
-~~~~~~~~~~~~~~~~~~~~~~
-
-See https://gitlab.haskell.org/ghc/ghc/wikis/implementing-trees-that-grow
-
-The hsSyn AST is reused across multiple compiler passes. We also have the
-Template Haskell AST, and the haskell-src-exts one (outside of GHC)
-
-Supporting multiple passes means the AST has various warts on it to cope with
-the specifics for the phases, such as the 'ValBindsOut', 'ConPatOut',
-'SigPatOut' etc.
-
-The growable AST will allow each of these variants to be captured explicitly,
-such that they only exist in the given compiler pass AST, as selected by the
-type parameter to the AST.
-
-In addition it will allow tool writers to define their own extensions to capture
-additional information for the tool, in a natural way.
-
-A further goal is to provide a means to harmonise the Template Haskell and
-haskell-src-exts ASTs as well.
-
-Wrinkle: In order to print out the AST, we need to know it is Outputable.
-We also sometimes need to branch on the particular pass that we're in
-(e.g. to print out type information once we know it). In order to allow
-both of these actions, we define OutputableBndrId, which gathers the necessary
-OutputableBndr and IsPass constraints. The use of this constraint in instances
-generally requires UndecidableInstances.
-
-See also Note [IsPass] and Note [NoGhcTc].
-
Note [IsPass]
~~~~~~~~~~~~~
One challenge with the Trees That Grow approach
@@ -126,91 +94,8 @@ saying that NoGhcTcPass is idempotent.
-}
--- | A placeholder type for TTG extension points that are not currently
--- unused to represent any particular value.
---
--- This should not be confused with 'NoExtCon', which are found in unused
--- extension /constructors/ and therefore should never be inhabited. In
--- contrast, 'NoExtField' is used in extension /points/ (e.g., as the field of
--- some constructor), so it must have an inhabitant to construct AST passes
--- that manipulate fields with that extension point as their type.
-data NoExtField = NoExtField
- deriving (Data,Eq,Ord)
-
-instance Outputable NoExtField where
- ppr _ = text "NoExtField"
-
--- | Used when constructing a term with an unused extension point.
-noExtField :: NoExtField
-noExtField = NoExtField
-
--- | Used in TTG extension constructors that have yet to be extended with
--- anything. If an extension constructor has 'NoExtCon' as its field, it is
--- not intended to ever be constructed anywhere, and any function that consumes
--- the extension constructor can eliminate it by way of 'noExtCon'.
---
--- This should not be confused with 'NoExtField', which are found in unused
--- extension /points/ (not /constructors/) and therefore can be inhabited.
-
--- See also [NoExtCon and strict fields].
-data NoExtCon
- deriving (Data,Eq,Ord)
-
-instance Outputable NoExtCon where
- ppr = noExtCon
-
--- | Eliminate a 'NoExtCon'. Much like 'Data.Void.absurd'.
-noExtCon :: NoExtCon -> a
-noExtCon x = case x of {}
-
--- | GHC's L prefixed variants wrap their vanilla variant in this type family,
--- to add 'SrcLoc' info via 'Located'. Other passes than 'GhcPass' not
--- interested in location information can define this as
--- @type instance XRec NoLocated a = a@.
--- See Note [XRec and SrcSpans in the AST]
-type family XRec p a = r | r -> a
-
type instance XRec (GhcPass p) a = Located a
-{-
-Note [XRec and SrcSpans in the AST]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-XRec is meant to replace most of the uses of `Located` in the AST. It is another
-extension point meant to make it easier for non-GHC applications to reuse the
-AST for their own purposes, and not have to deal the hassle of (perhaps) useless
-SrcSpans everywhere.
-
-instead of `Located (HsExpr p)` or similar types, we will now have `XRec p
-(HsExpr p)`
-
-XRec allows annotating certain points in the AST with extra information. This
-maybe be source spans (for GHC), nothing (for TH), types (for HIE files), api
-annotations (for exactprint) or anything else.
-
-This should hopefully bring us one step closer to sharing the AST between GHC
-and TH.
-
-We use the `UnXRec`, `MapXRec` and `WrapXRec` type classes to aid us in writing
-pass-polymorphic code that deals with `XRec`s
--}
-
--- | We can strip off the XRec to access the underlying data.
--- See Note [XRec and SrcSpans in the AST]
-class UnXRec p where
- unXRec :: XRec p a -> a
-
--- | We can map over the underlying type contained in an @XRec@ while preserving
--- the annotation as is.
--- See Note [XRec and SrcSpans in the AST]
-class MapXRec p where
- mapXRec :: (a -> b) -> XRec p a -> XRec p b
-
--- | The trivial wrapper that carries no additional information
--- @noLoc@ for @GhcPass p@
--- See Note [XRec and SrcSpans in the AST]
-class WrapXRec p where
- wrapXRec :: a -> XRec p a
-
instance UnXRec (GhcPass p) where
unXRec = unLoc
instance MapXRec (GhcPass p) where
@@ -293,8 +178,6 @@ instance IsPass 'Renamed where
instance IsPass 'Typechecked where
ghcPass = GhcTc
--- | Maps the "normal" id type for a given pass
-type family IdP p
type instance IdP (GhcPass p) = IdGhcP p
-- | Maps the "normal" id type for a given GHC pass
@@ -303,530 +186,18 @@ type family IdGhcP pass where
IdGhcP 'Renamed = Name
IdGhcP 'Typechecked = Id
-type LIdP p = XRec p (IdP p)
-
-- | Marks that a field uses the GhcRn variant even when the pass
-- parameter is GhcTc. Useful for storing HsTypes in GHC.Hs.Exprs, say, because
-- HsType GhcTc should never occur.
-- See Note [NoGhcTc]
-type family NoGhcTc (p :: Type) where
- -- this way, GHC can figure out that the result is a GhcPass
- NoGhcTc (GhcPass pass) = GhcPass (NoGhcTcPass pass)
- NoGhcTc other = other
+
+-- Breaking it up this way, GHC can figure out that the result is a GhcPass
+type instance NoGhcTc (GhcPass pass) = GhcPass (NoGhcTcPass pass)
type family NoGhcTcPass (p :: Pass) :: Pass where
NoGhcTcPass 'Typechecked = 'Renamed
NoGhcTcPass other = other
--- =====================================================================
--- Type families for the HsBinds extension points
-
--- HsLocalBindsLR type families
-type family XHsValBinds x x'
-type family XHsIPBinds x x'
-type family XEmptyLocalBinds x x'
-type family XXHsLocalBindsLR x x'
-
--- HsValBindsLR type families
-type family XValBinds x x'
-type family XXValBindsLR x x'
-
--- HsBindLR type families
-type family XFunBind x x'
-type family XPatBind x x'
-type family XVarBind x x'
-type family XAbsBinds x x'
-type family XPatSynBind x x'
-type family XXHsBindsLR x x'
-
--- ABExport type families
-type family XABE x
-type family XXABExport x
-
--- PatSynBind type families
-type family XPSB x x'
-type family XXPatSynBind x x'
-
--- HsIPBinds type families
-type family XIPBinds x
-type family XXHsIPBinds x
-
--- IPBind type families
-type family XCIPBind x
-type family XXIPBind x
-
--- Sig type families
-type family XTypeSig x
-type family XPatSynSig x
-type family XClassOpSig x
-type family XIdSig x
-type family XFixSig x
-type family XInlineSig x
-type family XSpecSig x
-type family XSpecInstSig x
-type family XMinimalSig x
-type family XSCCFunSig x
-type family XCompleteMatchSig x
-type family XXSig x
-
--- FixitySig type families
-type family XFixitySig x
-type family XXFixitySig x
-
--- StandaloneKindSig type families
-type family XStandaloneKindSig x
-type family XXStandaloneKindSig x
-
--- =====================================================================
--- Type families for the HsDecls extension points
-
--- HsDecl type families
-type family XTyClD x
-type family XInstD x
-type family XDerivD x
-type family XValD x
-type family XSigD x
-type family XKindSigD x
-type family XDefD x
-type family XForD x
-type family XWarningD x
-type family XAnnD x
-type family XRuleD x
-type family XSpliceD x
-type family XDocD x
-type family XRoleAnnotD x
-type family XXHsDecl x
-
--- -------------------------------------
--- HsGroup type families
-type family XCHsGroup x
-type family XXHsGroup x
-
--- -------------------------------------
--- SpliceDecl type families
-type family XSpliceDecl x
-type family XXSpliceDecl x
-
--- -------------------------------------
--- TyClDecl type families
-type family XFamDecl x
-type family XSynDecl x
-type family XDataDecl x
-type family XClassDecl x
-type family XXTyClDecl x
-
--- -------------------------------------
--- TyClGroup type families
-type family XCTyClGroup x
-type family XXTyClGroup x
-
--- -------------------------------------
--- FamilyResultSig type families
-type family XNoSig x
-type family XCKindSig x -- Clashes with XKindSig above
-type family XTyVarSig x
-type family XXFamilyResultSig x
-
--- -------------------------------------
--- FamilyDecl type families
-type family XCFamilyDecl x
-type family XXFamilyDecl x
-
--- -------------------------------------
--- HsDataDefn type families
-type family XCHsDataDefn x
-type family XXHsDataDefn x
-
--- -------------------------------------
--- HsDerivingClause type families
-type family XCHsDerivingClause x
-type family XXHsDerivingClause x
-
--- -------------------------------------
--- DerivClauseTys type families
-type family XDctSingle x
-type family XDctMulti x
-type family XXDerivClauseTys x
-
--- -------------------------------------
--- ConDecl type families
-type family XConDeclGADT x
-type family XConDeclH98 x
-type family XXConDecl x
-
--- -------------------------------------
--- FamEqn type families
-type family XCFamEqn x r
-type family XXFamEqn x r
-
--- -------------------------------------
--- ClsInstDecl type families
-type family XCClsInstDecl x
-type family XXClsInstDecl x
-
--- -------------------------------------
--- InstDecl type families
-type family XClsInstD x
-type family XDataFamInstD x
-type family XTyFamInstD x
-type family XXInstDecl x
-
--- -------------------------------------
--- DerivDecl type families
-type family XCDerivDecl x
-type family XXDerivDecl x
-
--- -------------------------------------
--- DerivStrategy type family
-type family XViaStrategy x
-
--- -------------------------------------
--- DefaultDecl type families
-type family XCDefaultDecl x
-type family XXDefaultDecl x
-
--- -------------------------------------
--- ForeignDecl type families
-type family XForeignImport x
-type family XForeignExport x
-type family XXForeignDecl x
-
--- -------------------------------------
--- RuleDecls type families
-type family XCRuleDecls x
-type family XXRuleDecls x
-
--- -------------------------------------
--- RuleDecl type families
-type family XHsRule x
-type family XXRuleDecl x
-
--- -------------------------------------
--- RuleBndr type families
-type family XCRuleBndr x
-type family XRuleBndrSig x
-type family XXRuleBndr x
-
--- -------------------------------------
--- WarnDecls type families
-type family XWarnings x
-type family XXWarnDecls x
-
--- -------------------------------------
--- WarnDecl type families
-type family XWarning x
-type family XXWarnDecl x
-
--- -------------------------------------
--- AnnDecl type families
-type family XHsAnnotation x
-type family XXAnnDecl x
-
--- -------------------------------------
--- RoleAnnotDecl type families
-type family XCRoleAnnotDecl x
-type family XXRoleAnnotDecl x
-
--- =====================================================================
--- Type families for the HsExpr extension points
-
-type family XVar x
-type family XUnboundVar x
-type family XConLikeOut x
-type family XRecFld x
-type family XOverLabel x
-type family XIPVar x
-type family XOverLitE x
-type family XLitE x
-type family XLam x
-type family XLamCase x
-type family XApp x
-type family XAppTypeE x
-type family XOpApp x
-type family XNegApp x
-type family XPar x
-type family XSectionL x
-type family XSectionR x
-type family XExplicitTuple x
-type family XExplicitSum x
-type family XCase x
-type family XIf x
-type family XMultiIf x
-type family XLet x
-type family XDo x
-type family XExplicitList x
-type family XRecordCon x
-type family XRecordUpd x
-type family XExprWithTySig x
-type family XArithSeq x
-type family XBracket x
-type family XRnBracketOut x
-type family XTcBracketOut x
-type family XSpliceE x
-type family XProc x
-type family XStatic x
-type family XTick x
-type family XBinTick x
-type family XPragE x
-type family XXExpr x
-
--- -------------------------------------
--- HsPragE type families
-type family XSCC x
-type family XXPragE x
-
-
--- -------------------------------------
--- AmbiguousFieldOcc type families
-type family XUnambiguous x
-type family XAmbiguous x
-type family XXAmbiguousFieldOcc x
-
--- -------------------------------------
--- HsTupArg type families
-type family XPresent x
-type family XMissing x
-type family XXTupArg x
-
--- -------------------------------------
--- HsSplice type families
-type family XTypedSplice x
-type family XUntypedSplice x
-type family XQuasiQuote x
-type family XSpliced x
-type family XXSplice x
-
--- -------------------------------------
--- HsBracket type families
-type family XExpBr x
-type family XPatBr x
-type family XDecBrL x
-type family XDecBrG x
-type family XTypBr x
-type family XVarBr x
-type family XTExpBr x
-type family XXBracket x
-
--- -------------------------------------
--- HsCmdTop type families
-type family XCmdTop x
-type family XXCmdTop x
-
--- -------------------------------------
--- MatchGroup type families
-type family XMG x b
-type family XXMatchGroup x b
-
--- -------------------------------------
--- Match type families
-type family XCMatch x b
-type family XXMatch x b
-
--- -------------------------------------
--- GRHSs type families
-type family XCGRHSs x b
-type family XXGRHSs x b
-
--- -------------------------------------
--- GRHS type families
-type family XCGRHS x b
-type family XXGRHS x b
-
--- -------------------------------------
--- StmtLR type families
-type family XLastStmt x x' b
-type family XBindStmt x x' b
-type family XApplicativeStmt x x' b
-type family XBodyStmt x x' b
-type family XLetStmt x x' b
-type family XParStmt x x' b
-type family XTransStmt x x' b
-type family XRecStmt x x' b
-type family XXStmtLR x x' b
-
--- -------------------------------------
--- HsCmd type families
-type family XCmdArrApp x
-type family XCmdArrForm x
-type family XCmdApp x
-type family XCmdLam x
-type family XCmdPar x
-type family XCmdCase x
-type family XCmdLamCase x
-type family XCmdIf x
-type family XCmdLet x
-type family XCmdDo x
-type family XCmdWrap x
-type family XXCmd x
-
--- -------------------------------------
--- ParStmtBlock type families
-type family XParStmtBlock x x'
-type family XXParStmtBlock x x'
-
--- -------------------------------------
--- ApplicativeArg type families
-type family XApplicativeArgOne x
-type family XApplicativeArgMany x
-type family XXApplicativeArg x
-
--- =====================================================================
--- Type families for the HsImpExp extension points
-
--- TODO
-
--- =====================================================================
--- Type families for the HsLit extension points
-
--- We define a type family for each extension point. This is based on prepending
--- 'X' to the constructor name, for ease of reference.
-type family XHsChar x
-type family XHsCharPrim x
-type family XHsString x
-type family XHsStringPrim x
-type family XHsInt x
-type family XHsIntPrim x
-type family XHsWordPrim x
-type family XHsInt64Prim x
-type family XHsWord64Prim x
-type family XHsInteger x
-type family XHsRat x
-type family XHsFloatPrim x
-type family XHsDoublePrim x
-type family XXLit x
-
--- -------------------------------------
--- HsOverLit type families
-type family XOverLit x
-type family XXOverLit x
-
--- =====================================================================
--- Type families for the HsPat extension points
-
-type family XWildPat x
-type family XVarPat x
-type family XLazyPat x
-type family XAsPat x
-type family XParPat x
-type family XBangPat x
-type family XListPat x
-type family XTuplePat x
-type family XSumPat x
-type family XConPat x
-type family XViewPat x
-type family XSplicePat x
-type family XLitPat x
-type family XNPat x
-type family XNPlusKPat x
-type family XSigPat x
-type family XCoPat x
-type family XXPat x
-
--- =====================================================================
--- Type families for the HsTypes type families
-
-
--- -------------------------------------
--- LHsQTyVars type families
-type family XHsQTvs x
-type family XXLHsQTyVars x
-
--- -------------------------------------
--- HsOuterTyVarBndrs type families
-type family XHsOuterImplicit x
-type family XHsOuterExplicit x flag
-type family XXHsOuterTyVarBndrs x
-
--- -------------------------------------
--- HsSigType type families
-type family XHsSig x
-type family XXHsSigType x
-
--- -------------------------------------
--- HsWildCardBndrs type families
-type family XHsWC x b
-type family XXHsWildCardBndrs x b
-
--- -------------------------------------
--- HsPatSigType type families
-type family XHsPS x
-type family XXHsPatSigType x
-
--- -------------------------------------
--- HsType type families
-type family XForAllTy x
-type family XQualTy x
-type family XTyVar x
-type family XAppTy x
-type family XAppKindTy x
-type family XFunTy x
-type family XListTy x
-type family XTupleTy x
-type family XSumTy x
-type family XOpTy x
-type family XParTy x
-type family XIParamTy x
-type family XStarTy x
-type family XKindSig x
-type family XSpliceTy x
-type family XDocTy x
-type family XBangTy x
-type family XRecTy x
-type family XExplicitListTy x
-type family XExplicitTupleTy x
-type family XTyLit x
-type family XWildCardTy x
-type family XXType x
-
--- ---------------------------------------------------------------------
--- HsForAllTelescope type families
-type family XHsForAllVis x
-type family XHsForAllInvis x
-type family XXHsForAllTelescope x
-
--- ---------------------------------------------------------------------
--- HsTyVarBndr type families
-type family XUserTyVar x
-type family XKindedTyVar x
-type family XXTyVarBndr x
-
--- ---------------------------------------------------------------------
--- ConDeclField type families
-type family XConDeclField x
-type family XXConDeclField x
-
--- ---------------------------------------------------------------------
--- FieldOcc type families
-type family XCFieldOcc x
-type family XXFieldOcc x
-
--- =====================================================================
--- Type families for the HsImpExp type families
-
--- -------------------------------------
--- ImportDecl type families
-type family XCImportDecl x
-type family XXImportDecl x
-
--- -------------------------------------
--- IE type families
-type family XIEVar x
-type family XIEThingAbs x
-type family XIEThingAll x
-type family XIEThingWith x
-type family XIEModuleContents x
-type family XIEGroup x
-type family XIEDoc x
-type family XIEDocNamed x
-type family XXIE x
-
--- -------------------------------------
-
-
--- =====================================================================
--- End of Type family definitions
--- =====================================================================
-
-- |Constraint type to bundle up the requirement for 'OutputableBndr' on both
-- the @id@ and the 'NoGhcTc' of it. See Note [NoGhcTc].
type OutputableBndrId pass =