diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b246375..4437222 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,9 +70,12 @@ jobs: # versions of our dependencies allowed by our upper bounds. # # TODO: switch back to "ghc: latest" once we support ghc-9.0 - - name: newest + - name: oldest ghc: "8.10" os: ubuntu-latest + - name: newest + ghc: "9.0" + os: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -118,7 +121,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..1450ec8 100644 --- a/package.yaml +++ b/package.yaml @@ -25,10 +25,11 @@ 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 + default-extensions: CPP tests: should-compile: diff --git a/src/TypeLevel/Rewrite.hs b/src/TypeLevel/Rewrite.hs index 0738291..5d1ef6a 100644 --- a/src/TypeLevel/Rewrite.hs +++ b/src/TypeLevel/Rewrite.hs @@ -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..1fbbfca 100644 --- a/src/TypeLevel/Rewrite/Internal/ApplyRules.hs +++ b/src/TypeLevel/Rewrite/Internal/ApplyRules.hs @@ -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..8226dbb 100644 --- a/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs +++ b/src/TypeLevel/Rewrite/Internal/DecomposedConstraint.hs @@ -5,8 +5,13 @@ 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..62a1d32 100644 --- a/src/TypeLevel/Rewrite/Internal/Lookup.hs +++ b/src/TypeLevel/Rewrite/Internal/Lookup.hs @@ -5,17 +5,25 @@ 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..4af808e 100644 --- a/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs +++ b/src/TypeLevel/Rewrite/Internal/PrettyPrint.hs @@ -4,9 +4,15 @@ 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..53d2df5 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeEq.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeEq.hs @@ -2,7 +2,11 @@ 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..31f32e6 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeNode.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeNode.hs @@ -2,8 +2,13 @@ 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..9aeb5dd 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeRule.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeRule.hs @@ -3,9 +3,15 @@ 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..12dbe38 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeTemplate.hs @@ -2,7 +2,11 @@ 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..80fb411 100644 --- a/src/TypeLevel/Rewrite/Internal/TypeTerm.hs +++ b/src/TypeLevel/Rewrite/Internal/TypeTerm.hs @@ -2,7 +2,11 @@ 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..8f2fd20 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,7 +1,7 @@ -resolver: nightly-2020-12-10 +resolver: nightly-2021-07-22 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..ec5caf3 100644 --- a/test/error-messages-cases/no-plugin/expected +++ b/test/error-messages-cases/no-plugin/expected @@ -1 +1,26 @@ - • Couldn't match type ‘as ++ (bs ++ cs)’ with ‘(as ++ bs) ++ cs’ +configure (lib) +Configuring no-plugin-0.0.0... +build (lib) +Preprocessing library for no-plugin-0.0.0.. +Building library for no-plugin-0.0.0.. +[1 of 2] Compiling NoPlugin.Test + +/error-messages-cases/no-plugin/src/NoPlugin/Test.hs:15:16: error: + • Couldn't match type: as ++ (bs ++ cs) + with: (as ++ bs) ++ cs + Expected: proxy ((as ++ bs) ++ cs) + Actual: proxy (as ++ (bs ++ cs)) + NB: ‘++’ is a non-injective type family + • In the expression: r + In an equation for ‘ex2e’: ex2e _ _ _ r = r + • Relevant bindings include + r :: proxy (as ++ (bs ++ cs)) (bound at src/NoPlugin/Test.hs:15:12) + ex2e :: proxy as + -> proxy bs + -> proxy cs + -> proxy (as ++ (bs ++ cs)) + -> proxy ((as ++ bs) ++ cs) + (bound at src/NoPlugin/Test.hs:15:1) + | +15 | ex2e _ _ _ r = r + | ^ diff --git a/test/should-compile/GHC/TypeLits/Test.hs b/test/should-compile/GHC/TypeLits/Test.hs index a228cce..da3aa55 100644 --- a/test/should-compile/GHC/TypeLits/Test.hs +++ b/test/should-compile/GHC/TypeLits/Test.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE DataKinds, RankNTypes, TypeFamilies, TypeOperators #-} +{-# LANGUAGE DataKinds, RankNTypes, TypeFamilies, TypeOperators, AllowAmbiguousTypes #-} {-# OPTIONS_GHC -fplugin TypeLevel.Rewrite -fplugin-opt=TypeLevel.Rewrite:GHC.TypeLits.RewriteRules.NatRule -fplugin-opt=TypeLevel.Rewrite:GHC.TypeLits.RewriteRules.SymbolRule #-} diff --git a/typelevel-rewrite-rules.cabal b/typelevel-rewrite-rules.cabal index c33115e..bd2c839 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.34.4. -- -- see: https://github.com/sol/hpack -- --- hash: 2673197ba6a9e92128e851017519e221b95a23ca70b1f7b84158feae74eba11b +-- hash: 201dd297be3e249f9d5773e714652b18086e8f3160a1bdca783242cb52598513 name: typelevel-rewrite-rules version: 1.0 @@ -48,11 +48,13 @@ 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 default-language: Haskell2010 + default-extensions: + CPP test-suite should-compile type: exitcode-stdio-1.0