diff --git a/.github/workflows/ci.yml b/.github/workflows/haskell.yml similarity index 82% rename from .github/workflows/ci.yml rename to .github/workflows/haskell.yml index b246375..48f97a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/haskell.yml @@ -65,13 +65,22 @@ jobs: strategy: matrix: include: - # Check that our upper bounds are correct by building with the latest - # version of everything. We use cabal because it uses the latest - # versions of our dependencies allowed by our upper bounds. + # The purpose of that section is two-fold. First, because we are + # using cabal and not stack, cabal will pick the most recent version + # of our dependencies which has been released. This way, if a + # dependency releases a breaking change, the next monthly CI will + # pick that version and notify us if we are affected by the change. # - # TODO: switch back to "ghc: latest" once we support ghc-9.0 - - name: newest - ghc: "8.10" + # Second, since this project is a ghc plugin, we rely on details of + # the GHC library which change between versions. It is thus quite + # easy to accidentally make a change which works for the latest + # version of GHC but not with older versions. CI should thus test all + # the supported GHC versions. + - name: ghc-8.10 + ghc: "8.10.7" + os: ubuntu-latest + - name: ghc-9.0 + ghc: "9.0.2" os: ubuntu-latest steps: @@ -118,7 +127,7 @@ jobs: strategy: matrix: include: - - ghc: "8.10" + - ghc: "9.0" os: ubuntu-latest steps: diff --git a/package.yaml b/package.yaml index 9f05ea6..87e2716 100644 --- a/package.yaml +++ b/package.yaml @@ -18,6 +18,10 @@ extra-source-files: # for release ghc-options: -W -Wall +tested-with: + - GHC == 9.0.2 + - GHC == 8.10.7 + dependencies: - base >= 4.12 && < 5 - ghc-prim >= 0.5.3 @@ -25,7 +29,7 @@ dependencies: library: source-dirs: src dependencies: - - ghc >= 8.10.2 && < 9.0 + - ghc >= 8.10.2 && <9.1 - containers >= 0.6.2.1 - term-rewriting >= 0.3.0.1 - transformers >= 0.5.6.2 diff --git a/src/TypeLevel/Rewrite.hs b/src/TypeLevel/Rewrite.hs index 0738291..27759f6 100644 --- a/src/TypeLevel/Rewrite.hs +++ b/src/TypeLevel/Rewrite.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE LambdaCase, OverloadedStrings, RecordWildCards, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, OverloadedStrings, RecordWildCards, ViewPatterns #-} module TypeLevel.Rewrite (plugin) where import Control.Monad @@ -8,6 +8,17 @@ import Data.Foldable import Data.Traversable -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Core.Coercion (Role(Representational), mkUnivCo) +import GHC.Tc.Types.Constraint (CtEvidence(ctev_loc), Ct, ctEvExpr, ctLoc, mkNonCanonical) +import GHC.Plugins (PredType, SDoc, eqType, fsep, ppr) +import GHC.Plugins (Plugin(pluginRecompile, tcPlugin), CommandLineOption, defaultPlugin, purePlugin) +import GHC.Tc.Types.Evidence (EvExpr, EvTerm, evCast) +import GHC.Tc.Plugin (newWanted) +import GHC.Core.TyCo.Rep (UnivCoProvenance(PluginProv)) +import GHC.Plugins (synTyConDefn_maybe) +import GHC.Tc.Types (TcPluginResult(..), TcPluginM, ErrCtxt, pushErrCtxtSameOrigin, TcPlugin(..)) +#else import Coercion (Role(Representational), mkUnivCo) import Constraint (CtEvidence(ctev_loc), Ct, ctEvExpr, ctLoc, mkNonCanonical) import GhcPlugins (PredType, SDoc, eqType, fsep, ppr) @@ -17,6 +28,7 @@ import TcPluginM (newWanted) import TcRnTypes import TyCoRep (UnivCoProvenance(PluginProv)) import TyCon (synTyConDefn_maybe) +#endif import TypeLevel.Rewrite.Internal.ApplyRules import TypeLevel.Rewrite.Internal.DecomposedConstraint diff --git a/src/TypeLevel/Rewrite/Internal/ApplyRules.hs b/src/TypeLevel/Rewrite/Internal/ApplyRules.hs index 3587918..e6e7cfa 100644 --- a/src/TypeLevel/Rewrite/Internal/ApplyRules.hs +++ b/src/TypeLevel/Rewrite/Internal/ApplyRules.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE LambdaCase, TupleSections, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, TupleSections, ViewPatterns #-} {-# OPTIONS -Wno-name-shadowing #-} module TypeLevel.Rewrite.Internal.ApplyRules where @@ -13,7 +13,11 @@ import Data.Traversable import qualified Data.Map as Map -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Plugins (TyVar) +#else import Type (TyVar) +#endif -- term-rewriting API import Data.Rewriting.Rule (Rule(..)) diff --git a/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs b/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs index 87d47af..e121dbd 100644 --- a/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs +++ b/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs @@ -1,12 +1,17 @@ -{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable, LambdaCase, RecordWildCards, ViewPatterns #-} +{-# LANGUAGE CPP, DeriveFunctor, DeriveFoldable, DeriveTraversable, LambdaCase, RecordWildCards, ViewPatterns #-} module TypeLevel.Rewrite.Internal.DecomposedConstraint where import Control.Applicative -- GHC API import GHC (Class, Type) +#if MIN_VERSION_ghc(9,0,0) +import GHC.Tc.Types.Constraint (Ct, ctEvPred, ctEvidence) +import GHC.Core.Predicate (EqRel(NomEq), Pred(ClassPred, EqPred), classifyPredType, mkClassPred, mkPrimEqPred) +#else import Constraint (Ct, ctEvPred, ctEvidence) import Predicate (EqRel(NomEq), Pred(ClassPred, EqPred), classifyPredType, mkClassPred, mkPrimEqPred) +#endif data DecomposedConstraint a diff --git a/src/TypeLevel/Rewrite/Internal/Lookup.hs b/src/TypeLevel/Rewrite/Internal/Lookup.hs index dbb8323..c390638 100644 --- a/src/TypeLevel/Rewrite/Internal/Lookup.hs +++ b/src/TypeLevel/Rewrite/Internal/Lookup.hs @@ -1,21 +1,29 @@ -{-# LANGUAGE LambdaCase, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, ViewPatterns #-} module TypeLevel.Rewrite.Internal.Lookup where import Control.Arrow ((***), first) import Data.Tuple (swap) -- GHC API -import Finder (cannotFindModule) import GHC (DataCon, TyCon, dataConTyCon) +#if MIN_VERSION_ghc(9,0,0) +import GHC.Driver.Finder (cannotFindModule) +import GHC (Module, ModuleName, mkModuleName) +import GHC.Plugins (mkDataOcc, mkTcOcc) +import GHC.Utils.Panic (panicDoc) +import GHC.Tc.Plugin + ( FindResult(Found), TcPluginM, findImportedModule, lookupOrig, tcLookupDataCon, tcLookupTyCon + , unsafeTcPluginTcM + ) +import GHC.Tc.Solver.Monad (getDynFlags) +#else +import Finder (cannotFindModule) import Module (Module, ModuleName, mkModuleName) import OccName (mkDataOcc, mkTcOcc) import Panic (panicDoc) import TcPluginM - ( FindResult(Found), TcPluginM, findImportedModule, lookupOrig, tcLookupDataCon, tcLookupTyCon - , unsafeTcPluginTcM - ) import TcSMonad (getDynFlags) - +#endif lookupModule :: String -- ^ module name diff --git a/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs b/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs index afc19ed..efad118 100644 --- a/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs +++ b/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs @@ -1,12 +1,18 @@ -{-# LANGUAGE LambdaCase, RecordWildCards #-} +{-# LANGUAGE CPP, LambdaCase, RecordWildCards #-} module TypeLevel.Rewrite.Internal.PrettyPrint where import Data.List (intercalate) -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Utils.Outputable (ppr, showSDocUnsafe) +import GHC.Plugins (TyCon) +import GHC.Plugins (TyVar, Type) +#else import Outputable (ppr, showSDocUnsafe) import TyCon (TyCon) import Type (TyVar, Type) +#endif -- term-rewriting API import Data.Rewriting.Rule (Rule(..)) diff --git a/src/TypeLevel/Rewrite/Internal/TypeEq.hs b/src/TypeLevel/Rewrite/Internal/TypeEq.hs index 30272a6..acda114 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeEq.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeEq.hs @@ -1,8 +1,13 @@ +{-# LANGUAGE CPP #-} module TypeLevel.Rewrite.Internal.TypeEq where import Data.Function +#if MIN_VERSION_ghc(9,0,0) +import GHC.Plugins (Type, eqType) +#else import GhcPlugins (Type, eqType) +#endif -- | A newtype around 'Type' which has an 'Eq' instance. diff --git a/src/TypeLevel/Rewrite/Internal/TypeNode.hs b/src/TypeLevel/Rewrite/Internal/TypeNode.hs index 97e14ae..ca320d5 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeNode.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeNode.hs @@ -1,9 +1,14 @@ -{-# LANGUAGE ViewPatterns #-} +{-# LANGUAGE CPP, ViewPatterns #-} module TypeLevel.Rewrite.Internal.TypeNode where -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC (TyCon) +import GHC.Plugins (Type, isNumLitTy, isStrLitTy, mkTyConApp, splitTyConApp_maybe) +#else import TyCon (TyCon) import Type (Type, isNumLitTy, isStrLitTy, mkTyConApp, splitTyConApp_maybe) +#endif import TypeLevel.Rewrite.Internal.TypeEq diff --git a/src/TypeLevel/Rewrite/Internal/TypeRule.hs b/src/TypeLevel/Rewrite/Internal/TypeRule.hs index c44b46d..0c1fab3 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeRule.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeRule.hs @@ -1,11 +1,17 @@ -{-# LANGUAGE LambdaCase, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, ViewPatterns #-} {-# OPTIONS -Wno-name-shadowing #-} module TypeLevel.Rewrite.Internal.TypeRule where -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Plugins (getOccString) +import GHC.Core.Predicate (mkPrimEqPred) +import GHC.Plugins (TyVar, Type, mkTyVarTy) +#else import Name (getOccString) import Predicate (mkPrimEqPred) import Type (TyVar, Type, mkTyVarTy) +#endif -- term-rewriting API import Data.Rewriting.Rule (Rule(..)) diff --git a/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs b/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs index bd870f2..b2fa608 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs @@ -1,8 +1,12 @@ -{-# LANGUAGE LambdaCase, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, ViewPatterns #-} module TypeLevel.Rewrite.Internal.TypeTemplate where -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Plugins (TyVar, Type, getTyVar_maybe) +#else import Type (TyVar, Type, getTyVar_maybe) +#endif -- term-rewriting API import Data.Rewriting.Term (Term(Fun, Var)) diff --git a/src/TypeLevel/Rewrite/Internal/TypeTerm.hs b/src/TypeLevel/Rewrite/Internal/TypeTerm.hs index 28ef65a..5e06acd 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeTerm.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeTerm.hs @@ -1,8 +1,12 @@ -{-# LANGUAGE LambdaCase, ViewPatterns #-} +{-# LANGUAGE CPP, LambdaCase, ViewPatterns #-} module TypeLevel.Rewrite.Internal.TypeTerm where -- GHC API +#if MIN_VERSION_ghc(9,0,0) +import GHC.Plugins (Type, mkTyConApp) +#else import Type (Type, mkTyConApp) +#endif -- term-rewriting API import Data.Rewriting.Term (Term(Fun, Var)) diff --git a/stack.yaml b/stack.yaml index 7e0065b..1db2e48 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,7 +1,7 @@ -resolver: nightly-2020-12-10 +resolver: lts-19.33 packages: - '.' extra-deps: - term-rewriting-0.4.0.2 -- union-find-array-0.1.0.2 +- union-find-array-0.1.0.3 diff --git a/test/error-messages-cases/no-plugin/expected b/test/error-messages-cases/no-plugin/expected index 430509e..b2ac572 100644 --- a/test/error-messages-cases/no-plugin/expected +++ b/test/error-messages-cases/no-plugin/expected @@ -1 +1,2 @@ - • Couldn't match type ‘as ++ (bs ++ cs)’ with ‘(as ++ bs) ++ cs’ + • Couldn't match type: as ++ (bs ++ cs) + with: (as ++ bs) ++ cs diff --git a/test/should-compile/GHC/TypeLits/Test.hs b/test/should-compile/GHC/TypeLits/Test.hs index a228cce..ffc8fdd 100644 --- a/test/should-compile/GHC/TypeLits/Test.hs +++ b/test/should-compile/GHC/TypeLits/Test.hs @@ -17,6 +17,7 @@ ex2 :: ( ((s1 `AppendSymbol` "foo") `AppendSymbol` s2) ~ (s1 `AppendSymbol` ("foo" `AppendSymbol` s2)) => r ) - -> proxy s + -> proxy s1 + -> proxy s2 -> r -ex2 r _ = r +ex2 r _ _ = r diff --git a/typelevel-rewrite-rules.cabal b/typelevel-rewrite-rules.cabal index c33115e..26a9688 100644 --- a/typelevel-rewrite-rules.cabal +++ b/typelevel-rewrite-rules.cabal @@ -1,10 +1,10 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.33.0. +-- This file has been generated from package.yaml by hpack version 0.35.2. -- -- see: https://github.com/sol/hpack -- --- hash: 2673197ba6a9e92128e851017519e221b95a23ca70b1f7b84158feae74eba11b +-- hash: cac2a8aec9cc51f367be3e13c24e6efa7d62ba4ec28e8368137d8292de814188 name: typelevel-rewrite-rules version: 1.0 @@ -17,6 +17,9 @@ author: Samuel Gélineau maintainer: gelisam+github@gmail.com license: PublicDomain build-type: Simple +tested-with: + GHC == 9.0.2 + , GHC == 8.10.7 extra-source-files: README.md CHANGELOG.md @@ -48,7 +51,7 @@ library build-depends: base >=4.12 && <5 , containers >=0.6.2.1 - , ghc >=8.10.2 && <9.0 + , ghc >=8.10.2 && <9.1 , ghc-prim >=0.5.3 , term-rewriting >=0.3.0.1 , transformers >=0.5.6.2