diff --git a/haskell-names.cabal b/haskell-names.cabal index 8c55984..06e238e 100644 --- a/haskell-names.cabal +++ b/haskell-names.cabal @@ -246,6 +246,9 @@ Library , bytestring >= 0.10.4.0 && < 0.11 , data-lens-light >= 0.1.2.1 && < 0.2 , traverse-with-class >= 1.0.0.0 && < 1.1 + , template-haskell >= 2.9 && < 2.14 + , hint >= 0.7 && < 0.9 + , th-lift, th-lift-instances, th-orphans if impl(ghc <= 7.8) Build-depends: tagged >= 0.8.4 && < 0.9 Hs-source-dirs: src @@ -262,6 +265,7 @@ Library Language.Haskell.Names.ModuleSymbols Language.Haskell.Names.SyntaxUtils Language.Haskell.Names.GetBound + Language.Haskell.Names.Reify Other-modules: Language.Haskell.Names.Open.Base @@ -287,7 +291,7 @@ Test-suite test , mtl >= 2.2.1 && < 2.3 , filepath >= 1.1 && <1.5 , containers >= 0.2 && < 0.6 - , tasty >= 0.12 && < 0.13 + , tasty >= 0.12 && < 1.1 , tasty-golden >= 2.2.1 && < 2.4 , filemanip >= 0.3.6.3 && < 0.4 , pretty-show >= 1.6.1 && < 1.7 diff --git a/src/Language/Haskell/Names/Reify.hs b/src/Language/Haskell/Names/Reify.hs new file mode 100644 index 0000000..69bc4a5 --- /dev/null +++ b/src/Language/Haskell/Names/Reify.hs @@ -0,0 +1,228 @@ +-- | Load the symbols of a module for which we do not have source. +-- This module could be added to the @haskell-names@ package. + +{-# LANGUAGE CPP, FlexibleInstances, ScopedTypeVariables, TemplateHaskell, TypeFamilies #-} +{-# OPTIONS -Wall -fno-warn-orphans #-} + +module Language.Haskell.Names.Reify + ( findModuleSymbols + , dangerous + ) where + +import Control.Monad (msum, when) +import Control.Monad.State as State (lift, modify, runStateT, StateT) +import Data.List (isPrefixOf) +import Data.Set as Set (insert, member, Set) +import Instances.TH.Lift () +import qualified Language.Haskell.Exts.Syntax as Exts (ModuleName(ModuleName), Name(Symbol, Ident)) +import Language.Haskell.Interpreter as Hint (runInterpreter, getModuleExports, ModuleElem(..)) +import Language.Haskell.Names as Names -- (Symbol(..)) +import Language.Haskell.Names.SyntaxUtils () +import Language.Haskell.TH (ExpQ, reify, Type(TupleT)) +import Language.Haskell.TH.Lift as TH (deriveLiftMany, lift) +import Language.Haskell.TH.Syntax as TH + (Dec(..), Info(..), lookupValueName, lookupTypeName, ModName(..), + Name(..), NameFlavour(..), NameSpace(..), OccName(..), PkgName(..), Q, runIO, TypeFamilyHead(..)) +import System.IO (hPutStrLn, stderr) + +$(deriveLiftMany [''Hint.ModuleElem, ''Exts.ModuleName, ''Names.Symbol, ''Exts.Name]) + +-- | Given a module name, get its top level 'Symbol' list. This is done +-- using the geModuleExports function from the @hint@ package, then +-- using @template-haskell@'s 'lookupValueName' and 'reify' functions to +-- learn everything about those symbols, and then converting that info +-- to the @haskell-names@ 'Symbol' type. The results should compare to +-- the output of 'loadBase'. +findModuleSymbols :: Int -> (Name -> Maybe Info) -> String -> ExpQ -- Q [Symbol] +findModuleSymbols verbosity special defmod = do + modelems <- either (error . show) id <$> runIO (runInterpreter (getModuleExports defmod)) + symbols <- concat <$> mapM (moduleElemSymbols verbosity special defmod) modelems :: Q [Symbol] + TH.lift symbols + +moduleElemSymbols :: Int -> (Name -> Maybe Info) -> String -> Hint.ModuleElem -> Q [Symbol] +moduleElemSymbols verbosity special defmod e = do + (infos, syms) <- runStateT (do names <- (moduleElemNames defmod) e + mapM (nameInfo verbosity special defmod) names) mempty + return $ concatMap (infoToSymbols defmod syms) infos + +-- | We have a ModuleElem, which represents some symbols imported from +-- defmod. These symbols may not actually be located in defmod, +-- defmod might have re-exported them. +moduleElemNames :: String -> Hint.ModuleElem -> StateT (Set String) Q [Either String Name] +moduleElemNames defmod (Hint.Fun i) = + (: []) <$> lookupNameWith defmod lookupValueName i +moduleElemNames defmod (Hint.Class c ms) = do + cname <- lookupNameWith defmod lookupTypeName c + mnames <- mapM (\m -> lookupNameWith defmod lookupValueName m) ms + return (cname : mnames) +moduleElemNames defmod (Hint.Data t fs) = do + tname <- lookupNameWith defmod lookupTypeName t + fnames <- mapM (lookupNameWith defmod lookupValueName) fs + return (tname : fnames) + +nameInfo :: Int -> (Name -> Maybe Info) -> String -> Either String Name -> StateT (Set String) Q Info +nameInfo verbosity special defmod name = + either (\s -> error $ "nameInfo - could not reify " ++ s ++ " in " ++ defmod ++ " - is it imported?") + (State.lift . reify' verbosity special) + name + +lookupNameWith :: String -> (String -> Q (Maybe TH.Name)) -> String -> StateT (Set String) Q (Either String TH.Name) +lookupNameWith defmod look i = do + mname1 <- State.lift $ look (defmod ++ "." ++ i) + mname2 <- State.lift $ look i + case msum [mname1, mname2] of + Nothing -> case stripSymbol i of + Nothing -> return (Left i) + Just i' -> modify (Set.insert i') >> lookupNameWith defmod look i' + Just name -> return (Right name) + +stripSymbol :: String -> Maybe String +stripSymbol s | length s >= 3 && head s == '(' && last s == ')' = Just (take (length s - 2) (drop 1 s)) +stripSymbol _ = Nothing + +infoToSymbols :: String -> Set String -> Info -> [Names.Symbol] +infoToSymbols defmod syms (VarI name _type _mdecs) = + [Names.Value + {symbolModule = thNameToModName defmod name, + symbolName = thNameToExtsName syms name}] +infoToSymbols defmod syms (ClassI (ClassD _ cname _ _ _) _) = + [Names.Class + {symbolModule = thNameToModName defmod cname, + symbolName = thNameToExtsName syms cname}] +infoToSymbols defmod syms (ClassOpI mname _typ cname) = + [Names.Method + {symbolModule = thNameToModName defmod mname, + symbolName = thNameToExtsName syms mname, + className = thNameToExtsName syms cname}] +infoToSymbols defmod syms (TyConI (DataD _ tname _ _ _ _)) = + [Names.Data + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname}] +infoToSymbols defmod syms (TyConI (NewtypeD _ tname _ _ _ _)) = + [Names.NewType + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname}] +infoToSymbols defmod syms (DataConI cname _type tname) = + [Names.Constructor + {symbolModule = thNameToModName defmod cname, + symbolName = thNameToExtsName syms cname, + typeName = thNameToExtsName syms tname}] +infoToSymbols defmod syms (TyConI (TySynD tname _ _typ)) = + [Names.Type + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname}] +infoToSymbols defmod syms (FamilyI (OpenTypeFamilyD (TypeFamilyHead tname _ _ _)) insts) = + [Names.TypeFam + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname, + associate = findAssociateName insts}] +infoToSymbols defmod syms (FamilyI (ClosedTypeFamilyD (TypeFamilyHead tname _ _ _) _) insts) = + [Names.TypeFam + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname, + associate = findAssociateName insts}] +infoToSymbols defmod syms (FamilyI (DataFamilyD tname _ _) insts) = + [Names.DataFam + {symbolModule = thNameToModName defmod tname, + symbolName = thNameToExtsName syms tname, + associate = findAssociateName insts}] +-- I'm sure these will show up shortly :-( +infoToSymbols _ _ i@(FamilyI _ _) = error $ "unimplemented - infoToSymbols " ++ show i +infoToSymbols _ _ i@(ClassI _ _) = error $ "unimplemented - infoToSymbols " ++ show i +infoToSymbols _ _ i@(TyConI _) = error $ "unimplemented - infoToSymbols " ++ show i +infoToSymbols _ _ i@(PrimTyConI _ _ _) = error $ "unimplemented - infoToSymbols " ++ show i +infoToSymbols _ _ i@(TyVarI _ _) = error $ "unimplemented - infoToSymbols " ++ show i + +findAssociateName :: [Dec] -> Maybe (Exts.Name ()) +findAssociateName _ = Nothing + +thNameToExtsName :: Set String -> TH.Name -> Exts.Name () +thNameToExtsName _ (TH.Name (OccName o) TH.NameS) = error ("NameS o=" ++ show o) +thNameToExtsName _ (TH.Name (OccName o) (TH.NameQ (ModName modname))) = error ("NameQ o=" ++ show o ++ ", modname=" ++ show modname) +thNameToExtsName _ (TH.Name (OccName o) (TH.NameU _n)) = error ("NameU o=" ++ show o) +thNameToExtsName _ (TH.Name (OccName o) (TH.NameL _n)) = error ("NameL o=" ++ show o) +thNameToExtsName syms (TH.Name (OccName o) (TH.NameG VarName (PkgName _) (ModName _))) = symbolOrIdent syms o +thNameToExtsName syms (TH.Name (OccName o) (TH.NameG DataName (PkgName _) (ModName _))) = symbolOrIdent syms o +thNameToExtsName syms (TH.Name (OccName o) (TH.NameG TcClsName (PkgName _) (ModName _))) = symbolOrIdent syms o + +thNameToModName :: String -> TH.Name -> Exts.ModuleName () +thNameToModName d (TH.Name _ TH.NameS) = Exts.ModuleName () d +thNameToModName _ (TH.Name _ (TH.NameQ (ModName modname))) = Exts.ModuleName () modname +thNameToModName d (TH.Name _ (TH.NameU _)) = Exts.ModuleName () d +thNameToModName d (TH.Name _ (TH.NameL _)) = Exts.ModuleName () d +thNameToModName _ (TH.Name _ (TH.NameG VarName (PkgName _) (ModName modname))) = Exts.ModuleName () modname +thNameToModName _ (TH.Name _ (TH.NameG DataName (PkgName _) (ModName modname))) = Exts.ModuleName () modname +thNameToModName _ (TH.Name _ (TH.NameG TcClsName (PkgName _) (ModName modname))) = Exts.ModuleName () modname + +symbolOrIdent :: Set String -> String -> Exts.Name () +symbolOrIdent syms s | Set.member s syms = Exts.Symbol () s +symbolOrIdent _ s = Exts.Ident () s + +-- | Reify non-dangerous symbols. Specifically, symbols whose definitions +-- use implicit parameters. +reify' :: Int -> (Name -> Maybe Info) -> Name -> Q Info +reify' verbosity danger name = + maybe (do when (verbosity > 0) (runIO (hPutStrLn stderr ("reify " ++ show name))) + reify name) + return + (danger name) + +-- | Special case for functions in the prelude that template haskell +-- can't handle. This is a useful example, but the user can supply +-- their own. It would be great to fix GHC so this wasn't needed. +dangerous :: Name -> Maybe Info +dangerous name = + msum [ nameMatch ($(lookupValueName "error" >>= \(Just x) -> TH.lift x) :: Name) name + , nameMatch (Name (OccName "undefined") (NameG VarName (PkgName "base") (ModName "GHC.Err"))) name + , nameMatch ("Control.Lens.Fold", "^?!") name + , nameMatch ("Control.Lens.Fold", "^@?!") name + , nameMatch ("Control.Lens.Fold", "foldl1Of") name + , nameMatch ("Control.Lens.Fold", "foldl1Of'") name + , nameMatch ("Control.Lens.Fold", "foldr1Of") name + , nameMatch ("Control.Lens.Fold", "foldr1Of'") name + , nameMatch ("Control.Lens.Traversal", "singular") name + , nameMatch ("Control.Lens.Traversal", "unsafeSingular") name + , nameMatch ("GHC.IO.Exception", "assertError") name + , nameMatch ("Test.HUnit.Base", "Assertable") name + , nameMatch ("Test.HUnit.Base", "assert") name + , nameMatch ("Test.HUnit.Base", "assertBool") name + , nameMatch ("Test.HUnit.Base", "assertString") name + , nameMatch ("Test.HUnit.Lang", "assertEqual") name + , nameMatch ("Test.HUnit.Lang", "assertFailure") name + , nameMatch ("Test.HUnit.Base", "ListAssertable") name + , nameMatch ("Test.HUnit.Base", "listAssert") name + , nameMatch ("Test.HUnit.Base", "Testable") name + , nameMatch ("Test.HUnit.Base", "test") name + , nameMatch ("Test.HUnit.Base", "@=?") name + , nameMatch ("Test.HUnit.Base", "@?=") name + , nameMatch ("Test.HUnit.Base", "@?") name + , nameMatch ("Test.HUnit.Base", "~=?") name + , nameMatch ("Test.HUnit.Base", "~?") name + , nameMatch ("Test.HUnit.Base", "~?=") name + , nameMatch ("Test.HUnit.Base", "~:") name] + +-- | Class of ways we can select a (dangerous to reify) 'Name' and +-- return the corresponding 'Info'. +class NamePattern a where + nameMatch :: a -> Name -> Maybe Info + +instance NamePattern Name where + nameMatch name1 name2 | name1 == name2 = Just (VarI name2 (TupleT 0) Nothing) + nameMatch _ _ = Nothing + +instance NamePattern (String, String) where + nameMatch (mname1, sname1) name@(Name (OccName sname2) (NameG _ _ (ModName mname2))) + | mname1 == mname2 && sname1 == sname2 = Just (VarI name (TupleT 0) Nothing) + nameMatch _ _ = Nothing + +instance NamePattern (String, String, String) where + nameMatch (pname1, mname1, sname1) name@(Name (OccName sname2) (NameG _ (PkgName pname2) (ModName mname2))) + | mname1 == mname2 && sname1 == sname2 && isPrefixOf (pname1 ++ "-") pname2 = + Just (VarI name (TupleT 0) Nothing) + nameMatch _ _ = Nothing + +-- avoid this one +instance NamePattern String where + nameMatch sname1 name@(Name (OccName sname2) (NameG _ _ _)) + | sname1 == sname2 = Just (VarI name (TupleT 0) Nothing) + nameMatch _ _ = Nothing diff --git a/tests/environment/Prelude.symbols.golden b/tests/environment/Prelude.symbols.golden index d36bb47..3e1eaa5 100644 --- a/tests/environment/Prelude.symbols.golden +++ b/tests/environment/Prelude.symbols.golden @@ -1 +1 @@ -[{"name":"Bool","module":"GHC.Types","entity":"data"},{"name":"False","module":"GHC.Types","type":"Bool","entity":"constructor"},{"name":"True","module":"GHC.Types","type":"Bool","entity":"constructor"},{"name":"&&","module":"GHC.Classes","entity":"value"},{"name":"||","module":"GHC.Classes","entity":"value"},{"name":"not","module":"GHC.Classes","entity":"value"},{"name":"otherwise","module":"GHC.Base","entity":"value"},{"name":"Maybe","module":"Data.Maybe","entity":"data"},{"name":"Nothing","module":"Data.Maybe","type":"Maybe","entity":"constructor"},{"name":"Just","module":"Data.Maybe","type":"Maybe","entity":"constructor"},{"name":"maybe","module":"Data.Maybe","entity":"value"},{"name":"Either","module":"Data.Either","entity":"data"},{"name":"Left","module":"Data.Either","type":"Either","entity":"constructor"},{"name":"Right","module":"Data.Either","type":"Either","entity":"constructor"},{"name":"either","module":"Data.Either","entity":"value"},{"name":"Ordering","module":"GHC.Types","entity":"data"},{"name":"LT","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"EQ","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"GT","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"Char","module":"GHC.Types","entity":"data"},{"name":"String","module":"GHC.Base","entity":"type"},{"name":"fst","module":"Data.Tuple","entity":"value"},{"name":"snd","module":"Data.Tuple","entity":"value"},{"name":"curry","module":"Data.Tuple","entity":"value"},{"name":"uncurry","module":"Data.Tuple","entity":"value"},{"name":"Eq","module":"GHC.Classes","entity":"class"},{"name":"==","module":"GHC.Classes","entity":"method","class":"Eq"},{"name":"/=","module":"GHC.Classes","entity":"method","class":"Eq"},{"name":"Ord","module":"GHC.Classes","entity":"class"},{"name":"compare","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"<","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"<=","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":">=","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":">","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"max","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"min","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"Enum","module":"GHC.Enum","entity":"class"},{"name":"succ","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"pred","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"toEnum","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"fromEnum","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFrom","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromThen","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromTo","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromThenTo","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"Bounded","module":"GHC.Enum","entity":"class"},{"name":"minBound","module":"GHC.Enum","entity":"method","class":"Bounded"},{"name":"maxBound","module":"GHC.Enum","entity":"method","class":"Bounded"},{"name":"Int","module":"GHC.Types","entity":"data"},{"name":"Integer","module":"GHC.Integer.Type","entity":"data"},{"name":"Float","module":"GHC.Types","entity":"data"},{"name":"Double","module":"GHC.Types","entity":"data"},{"name":"Rational","module":"GHC.Real","entity":"type"},{"name":"Num","module":"GHC.Num","entity":"class"},{"name":"+","module":"GHC.Num","entity":"method","class":"Num"},{"name":"-","module":"GHC.Num","entity":"method","class":"Num"},{"name":"*","module":"GHC.Num","entity":"method","class":"Num"},{"name":"negate","module":"GHC.Num","entity":"method","class":"Num"},{"name":"abs","module":"GHC.Num","entity":"method","class":"Num"},{"name":"signum","module":"GHC.Num","entity":"method","class":"Num"},{"name":"fromInteger","module":"GHC.Num","entity":"method","class":"Num"},{"name":"Real","module":"GHC.Real","entity":"class"},{"name":"toRational","module":"GHC.Real","entity":"method","class":"Real"},{"name":"Integral","module":"GHC.Real","entity":"class"},{"name":"quot","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"rem","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"div","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"mod","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"quotRem","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"divMod","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"toInteger","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"Fractional","module":"GHC.Real","entity":"class"},{"name":"/","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"recip","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"fromRational","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"Floating","module":"GHC.Float","entity":"class"},{"name":"pi","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"exp","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"log","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"sqrt","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"**","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"logBase","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"sin","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"cos","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"tan","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"asin","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"acos","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"atan","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"sinh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"cosh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"tanh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"asinh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"acosh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"atanh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"RealFrac","module":"GHC.Real","entity":"class"},{"name":"properFraction","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"truncate","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"round","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"ceiling","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"floor","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"RealFloat","module":"GHC.Float","entity":"class"},{"name":"floatRadix","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"floatDigits","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"floatRange","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"decodeFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"encodeFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"exponent","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"significand","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"scaleFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isNaN","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isInfinite","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isDenormalized","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isIEEE","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isNegativeZero","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"atan2","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"subtract","module":"GHC.Num","entity":"value"},{"name":"even","module":"GHC.Real","entity":"value"},{"name":"odd","module":"GHC.Real","entity":"value"},{"name":"gcd","module":"GHC.Real","entity":"value"},{"name":"lcm","module":"GHC.Real","entity":"value"},{"name":"^","module":"GHC.Real","entity":"value"},{"name":"^^","module":"GHC.Real","entity":"value"},{"name":"fromIntegral","module":"GHC.Real","entity":"value"},{"name":"realToFrac","module":"GHC.Real","entity":"value"},{"name":"Monad","module":"GHC.Base","entity":"class"},{"name":">>=","module":"GHC.Base","entity":"method","class":"Monad"},{"name":">>","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"return","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"fail","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"Functor","module":"GHC.Base","entity":"class"},{"name":"fmap","module":"GHC.Base","entity":"method","class":"Functor"},{"name":"mapM","module":"Control.Monad","entity":"value"},{"name":"mapM_","module":"Control.Monad","entity":"value"},{"name":"sequence","module":"Control.Monad","entity":"value"},{"name":"sequence_","module":"Control.Monad","entity":"value"},{"name":"=<<","module":"Control.Monad","entity":"value"},{"name":"id","module":"GHC.Base","entity":"value"},{"name":"const","module":"GHC.Base","entity":"value"},{"name":".","module":"GHC.Base","entity":"value"},{"name":"flip","module":"GHC.Base","entity":"value"},{"name":"$","module":"GHC.Base","entity":"value"},{"name":"until","module":"GHC.Base","entity":"value"},{"name":"asTypeOf","module":"GHC.Base","entity":"value"},{"name":"error","module":"GHC.Err","entity":"value"},{"name":"undefined","module":"GHC.Err","entity":"value"},{"name":"seq","module":"GHC.Prim","entity":"value"},{"name":"$!","module":"Prelude","entity":"value"},{"name":"map","module":"GHC.Base","entity":"value"},{"name":"++","module":"GHC.Base","entity":"value"},{"name":"filter","module":"GHC.List","entity":"value"},{"name":"head","module":"GHC.List","entity":"value"},{"name":"last","module":"GHC.List","entity":"value"},{"name":"tail","module":"GHC.List","entity":"value"},{"name":"init","module":"GHC.List","entity":"value"},{"name":"null","module":"GHC.List","entity":"value"},{"name":"length","module":"GHC.List","entity":"value"},{"name":"!!","module":"GHC.List","entity":"value"},{"name":"reverse","module":"GHC.List","entity":"value"},{"name":"foldl","module":"GHC.List","entity":"value"},{"name":"foldl1","module":"Data.List","entity":"value"},{"name":"foldr","module":"GHC.Base","entity":"value"},{"name":"foldr1","module":"GHC.List","entity":"value"},{"name":"and","module":"GHC.List","entity":"value"},{"name":"or","module":"GHC.List","entity":"value"},{"name":"any","module":"GHC.List","entity":"value"},{"name":"all","module":"GHC.List","entity":"value"},{"name":"sum","module":"Data.List","entity":"value"},{"name":"product","module":"Data.List","entity":"value"},{"name":"concat","module":"GHC.List","entity":"value"},{"name":"concatMap","module":"GHC.List","entity":"value"},{"name":"maximum","module":"Data.List","entity":"value"},{"name":"minimum","module":"Data.List","entity":"value"},{"name":"scanl","module":"GHC.List","entity":"value"},{"name":"scanl1","module":"GHC.List","entity":"value"},{"name":"scanr","module":"GHC.List","entity":"value"},{"name":"scanr1","module":"GHC.List","entity":"value"},{"name":"iterate","module":"GHC.List","entity":"value"},{"name":"repeat","module":"GHC.List","entity":"value"},{"name":"replicate","module":"GHC.List","entity":"value"},{"name":"cycle","module":"GHC.List","entity":"value"},{"name":"take","module":"GHC.List","entity":"value"},{"name":"drop","module":"GHC.List","entity":"value"},{"name":"splitAt","module":"GHC.List","entity":"value"},{"name":"takeWhile","module":"GHC.List","entity":"value"},{"name":"dropWhile","module":"GHC.List","entity":"value"},{"name":"span","module":"GHC.List","entity":"value"},{"name":"break","module":"GHC.List","entity":"value"},{"name":"elem","module":"GHC.List","entity":"value"},{"name":"notElem","module":"GHC.List","entity":"value"},{"name":"lookup","module":"GHC.List","entity":"value"},{"name":"zip","module":"GHC.List","entity":"value"},{"name":"zip3","module":"GHC.List","entity":"value"},{"name":"zipWith","module":"GHC.List","entity":"value"},{"name":"zipWith3","module":"GHC.List","entity":"value"},{"name":"unzip","module":"GHC.List","entity":"value"},{"name":"unzip3","module":"GHC.List","entity":"value"},{"name":"lines","module":"Data.List","entity":"value"},{"name":"words","module":"Data.List","entity":"value"},{"name":"unlines","module":"Data.List","entity":"value"},{"name":"unwords","module":"Data.List","entity":"value"},{"name":"ShowS","module":"GHC.Show","entity":"type"},{"name":"Show","module":"GHC.Show","entity":"class"},{"name":"showsPrec","module":"GHC.Show","entity":"method","class":"Show"},{"name":"showList","module":"GHC.Show","entity":"method","class":"Show"},{"name":"show","module":"GHC.Show","entity":"method","class":"Show"},{"name":"shows","module":"GHC.Show","entity":"value"},{"name":"showChar","module":"GHC.Show","entity":"value"},{"name":"showString","module":"GHC.Show","entity":"value"},{"name":"showParen","module":"GHC.Show","entity":"value"},{"name":"ReadS","module":"Text.ParserCombinators.ReadP","entity":"type"},{"name":"Read","module":"GHC.Read","entity":"class"},{"name":"readsPrec","module":"GHC.Read","entity":"method","class":"Read"},{"name":"readList","module":"GHC.Read","entity":"method","class":"Read"},{"name":"reads","module":"Text.Read","entity":"value"},{"name":"readParen","module":"GHC.Read","entity":"value"},{"name":"read","module":"Text.Read","entity":"value"},{"name":"lex","module":"GHC.Read","entity":"value"},{"name":"IO","module":"GHC.Types","entity":"newtype"},{"name":"putChar","module":"System.IO","entity":"value"},{"name":"putStr","module":"System.IO","entity":"value"},{"name":"putStrLn","module":"System.IO","entity":"value"},{"name":"print","module":"System.IO","entity":"value"},{"name":"getChar","module":"System.IO","entity":"value"},{"name":"getLine","module":"System.IO","entity":"value"},{"name":"getContents","module":"System.IO","entity":"value"},{"name":"interact","module":"System.IO","entity":"value"},{"name":"FilePath","module":"GHC.IO","entity":"type"},{"name":"readFile","module":"System.IO","entity":"value"},{"name":"writeFile","module":"System.IO","entity":"value"},{"name":"appendFile","module":"System.IO","entity":"value"},{"name":"readIO","module":"System.IO","entity":"value"},{"name":"readLn","module":"System.IO","entity":"value"},{"name":"IOError","module":"GHC.IO.Exception","entity":"type"},{"name":"ioError","module":"GHC.IO.Exception","entity":"value"},{"name":"userError","module":"GHC.IO.Exception","entity":"value"}] +[{"name":"either","module":"Data.Either","entity":"value"},{"name":"all","module":"Data.Foldable","entity":"value"},{"name":"and","module":"Data.Foldable","entity":"value"},{"name":"any","module":"Data.Foldable","entity":"value"},{"name":"concat","module":"Data.Foldable","entity":"value"},{"name":"concatMap","module":"Data.Foldable","entity":"value"},{"name":"mapM_","module":"Data.Foldable","entity":"value"},{"name":"notElem","module":"Data.Foldable","entity":"value"},{"name":"or","module":"Data.Foldable","entity":"value"},{"name":"sequence_","module":"Data.Foldable","entity":"value"},{"name":"<$>","module":"Data.Functor","entity":"value"},{"name":"maybe","module":"Data.Maybe","entity":"value"},{"name":"lines","module":"Data.OldList","entity":"value"},{"name":"unlines","module":"Data.OldList","entity":"value"},{"name":"unwords","module":"Data.OldList","entity":"value"},{"name":"words","module":"Data.OldList","entity":"value"},{"name":"curry","module":"Data.Tuple","entity":"value"},{"name":"fst","module":"Data.Tuple","entity":"value"},{"name":"snd","module":"Data.Tuple","entity":"value"},{"name":"uncurry","module":"Data.Tuple","entity":"value"},{"name":"asTypeOf","module":"GHC.Base","entity":"value"},{"name":"const","module":"GHC.Base","entity":"value"},{"name":"flip","module":"GHC.Base","entity":"value"},{"name":"id","module":"GHC.Base","entity":"value"},{"name":"map","module":"GHC.Base","entity":"value"},{"name":"otherwise","module":"GHC.Base","entity":"value"},{"name":"until","module":"GHC.Base","entity":"value"},{"name":"$","module":"GHC.Base","entity":"value"},{"name":"$!","module":"GHC.Base","entity":"value"},{"name":"++","module":"GHC.Base","entity":"value"},{"name":".","module":"GHC.Base","entity":"value"},{"name":"=<<","module":"GHC.Base","entity":"value"},{"name":"not","module":"GHC.Classes","entity":"value"},{"name":"&&","module":"GHC.Classes","entity":"value"},{"name":"||","module":"GHC.Classes","entity":"value"},{"name":"error","module":"GHC.Err","entity":"value"},{"name":"errorWithoutStackTrace","module":"GHC.Err","entity":"value"},{"name":"undefined","module":"GHC.Err","entity":"value"},{"name":"ioError","module":"GHC.IO.Exception","entity":"value"},{"name":"userError","module":"GHC.IO.Exception","entity":"value"},{"name":"break","module":"GHC.List","entity":"value"},{"name":"cycle","module":"GHC.List","entity":"value"},{"name":"drop","module":"GHC.List","entity":"value"},{"name":"dropWhile","module":"GHC.List","entity":"value"},{"name":"filter","module":"GHC.List","entity":"value"},{"name":"head","module":"GHC.List","entity":"value"},{"name":"init","module":"GHC.List","entity":"value"},{"name":"iterate","module":"GHC.List","entity":"value"},{"name":"last","module":"GHC.List","entity":"value"},{"name":"lookup","module":"GHC.List","entity":"value"},{"name":"repeat","module":"GHC.List","entity":"value"},{"name":"replicate","module":"GHC.List","entity":"value"},{"name":"reverse","module":"GHC.List","entity":"value"},{"name":"scanl","module":"GHC.List","entity":"value"},{"name":"scanl1","module":"GHC.List","entity":"value"},{"name":"scanr","module":"GHC.List","entity":"value"},{"name":"scanr1","module":"GHC.List","entity":"value"},{"name":"span","module":"GHC.List","entity":"value"},{"name":"splitAt","module":"GHC.List","entity":"value"},{"name":"tail","module":"GHC.List","entity":"value"},{"name":"take","module":"GHC.List","entity":"value"},{"name":"takeWhile","module":"GHC.List","entity":"value"},{"name":"unzip","module":"GHC.List","entity":"value"},{"name":"unzip3","module":"GHC.List","entity":"value"},{"name":"zip","module":"GHC.List","entity":"value"},{"name":"zip3","module":"GHC.List","entity":"value"},{"name":"zipWith","module":"GHC.List","entity":"value"},{"name":"zipWith3","module":"GHC.List","entity":"value"},{"name":"!!","module":"GHC.List","entity":"value"},{"name":"subtract","module":"GHC.Num","entity":"value"},{"name":"seq","module":"GHC.Prim","entity":"value"},{"name":"lex","module":"GHC.Read","entity":"value"},{"name":"readParen","module":"GHC.Read","entity":"value"},{"name":"even","module":"GHC.Real","entity":"value"},{"name":"fromIntegral","module":"GHC.Real","entity":"value"},{"name":"gcd","module":"GHC.Real","entity":"value"},{"name":"lcm","module":"GHC.Real","entity":"value"},{"name":"odd","module":"GHC.Real","entity":"value"},{"name":"realToFrac","module":"GHC.Real","entity":"value"},{"name":"^","module":"GHC.Real","entity":"value"},{"name":"^^","module":"GHC.Real","entity":"value"},{"name":"showChar","module":"GHC.Show","entity":"value"},{"name":"showParen","module":"GHC.Show","entity":"value"},{"name":"showString","module":"GHC.Show","entity":"value"},{"name":"shows","module":"GHC.Show","entity":"value"},{"name":"appendFile","module":"System.IO","entity":"value"},{"name":"getChar","module":"System.IO","entity":"value"},{"name":"getContents","module":"System.IO","entity":"value"},{"name":"getLine","module":"System.IO","entity":"value"},{"name":"interact","module":"System.IO","entity":"value"},{"name":"print","module":"System.IO","entity":"value"},{"name":"putChar","module":"System.IO","entity":"value"},{"name":"putStr","module":"System.IO","entity":"value"},{"name":"putStrLn","module":"System.IO","entity":"value"},{"name":"readFile","module":"System.IO","entity":"value"},{"name":"readIO","module":"System.IO","entity":"value"},{"name":"readLn","module":"System.IO","entity":"value"},{"name":"writeFile","module":"System.IO","entity":"value"},{"name":"read","module":"Text.Read","entity":"value"},{"name":"reads","module":"Text.Read","entity":"value"},{"name":"elem","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"foldMap","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"foldl","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"foldl1","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"foldr","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"foldr1","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"length","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"maximum","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"minimum","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"null","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"product","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"sum","module":"Data.Foldable","entity":"method","class":"Foldable"},{"name":"mapM","module":"Data.Traversable","entity":"method","class":"Traversable"},{"name":"sequence","module":"Data.Traversable","entity":"method","class":"Traversable"},{"name":"sequenceA","module":"Data.Traversable","entity":"method","class":"Traversable"},{"name":"traverse","module":"Data.Traversable","entity":"method","class":"Traversable"},{"name":"fail","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"fmap","module":"GHC.Base","entity":"method","class":"Functor"},{"name":"mappend","module":"GHC.Base","entity":"method","class":"Monoid"},{"name":"mconcat","module":"GHC.Base","entity":"method","class":"Monoid"},{"name":"mempty","module":"GHC.Base","entity":"method","class":"Monoid"},{"name":"pure","module":"GHC.Base","entity":"method","class":"Applicative"},{"name":"return","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"*>","module":"GHC.Base","entity":"method","class":"Applicative"},{"name":"<$","module":"GHC.Base","entity":"method","class":"Functor"},{"name":"<*","module":"GHC.Base","entity":"method","class":"Applicative"},{"name":"<*>","module":"GHC.Base","entity":"method","class":"Applicative"},{"name":">>","module":"GHC.Base","entity":"method","class":"Monad"},{"name":">>=","module":"GHC.Base","entity":"method","class":"Monad"},{"name":"compare","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"max","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"min","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"/=","module":"GHC.Classes","entity":"method","class":"Eq"},{"name":"<","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"<=","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"==","module":"GHC.Classes","entity":"method","class":"Eq"},{"name":">","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":">=","module":"GHC.Classes","entity":"method","class":"Ord"},{"name":"enumFrom","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromThen","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromThenTo","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"enumFromTo","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"fromEnum","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"maxBound","module":"GHC.Enum","entity":"method","class":"Bounded"},{"name":"minBound","module":"GHC.Enum","entity":"method","class":"Bounded"},{"name":"pred","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"succ","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"toEnum","module":"GHC.Enum","entity":"method","class":"Enum"},{"name":"acos","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"acosh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"asin","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"asinh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"atan","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"atan2","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"atanh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"cos","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"cosh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"decodeFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"encodeFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"exp","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"exponent","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"floatDigits","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"floatRadix","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"floatRange","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isDenormalized","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isIEEE","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isInfinite","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isNaN","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"isNegativeZero","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"log","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"logBase","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"pi","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"scaleFloat","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"significand","module":"GHC.Float","entity":"method","class":"RealFloat"},{"name":"sin","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"sinh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"sqrt","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"tan","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"tanh","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"**","module":"GHC.Float","entity":"method","class":"Floating"},{"name":"abs","module":"GHC.Num","entity":"method","class":"Num"},{"name":"fromInteger","module":"GHC.Num","entity":"method","class":"Num"},{"name":"negate","module":"GHC.Num","entity":"method","class":"Num"},{"name":"signum","module":"GHC.Num","entity":"method","class":"Num"},{"name":"*","module":"GHC.Num","entity":"method","class":"Num"},{"name":"+","module":"GHC.Num","entity":"method","class":"Num"},{"name":"-","module":"GHC.Num","entity":"method","class":"Num"},{"name":"readList","module":"GHC.Read","entity":"method","class":"Read"},{"name":"readsPrec","module":"GHC.Read","entity":"method","class":"Read"},{"name":"ceiling","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"div","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"divMod","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"floor","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"fromRational","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"mod","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"properFraction","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"quot","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"quotRem","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"recip","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"rem","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"round","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"toInteger","module":"GHC.Real","entity":"method","class":"Integral"},{"name":"toRational","module":"GHC.Real","entity":"method","class":"Real"},{"name":"truncate","module":"GHC.Real","entity":"method","class":"RealFrac"},{"name":"/","module":"GHC.Real","entity":"method","class":"Fractional"},{"name":"show","module":"GHC.Show","entity":"method","class":"Show"},{"name":"showList","module":"GHC.Show","entity":"method","class":"Show"},{"name":"showsPrec","module":"GHC.Show","entity":"method","class":"Show"},{"name":"Left","module":"Data.Either","type":"Either","entity":"constructor"},{"name":"Right","module":"Data.Either","type":"Either","entity":"constructor"},{"name":"Just","module":"GHC.Base","type":"Maybe","entity":"constructor"},{"name":"Nothing","module":"GHC.Base","type":"Maybe","entity":"constructor"},{"name":"EQ","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"False","module":"GHC.Types","type":"Bool","entity":"constructor"},{"name":"GT","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"LT","module":"GHC.Types","type":"Ordering","entity":"constructor"},{"name":"True","module":"GHC.Types","type":"Bool","entity":"constructor"},{"name":"String","module":"GHC.Base","entity":"type"},{"name":"FilePath","module":"GHC.IO","entity":"type"},{"name":"IOError","module":"GHC.IO.Exception","entity":"type"},{"name":"Rational","module":"GHC.Real","entity":"type"},{"name":"ShowS","module":"GHC.Show","entity":"type"},{"name":"ReadS","module":"Text.ParserCombinators.ReadP","entity":"type"},{"name":"Either","module":"Data.Either","entity":"data"},{"name":"Maybe","module":"GHC.Base","entity":"data"},{"name":"Integer","module":"GHC.Integer.Type","entity":"data"},{"name":"Bool","module":"GHC.Types","entity":"data"},{"name":"Char","module":"GHC.Types","entity":"data"},{"name":"Double","module":"GHC.Types","entity":"data"},{"name":"Float","module":"GHC.Types","entity":"data"},{"name":"Int","module":"GHC.Types","entity":"data"},{"name":"Ordering","module":"GHC.Types","entity":"data"},{"name":"Word","module":"GHC.Types","entity":"data"},{"name":"IO","module":"GHC.Types","entity":"newtype"},{"name":"Foldable","module":"Data.Foldable","entity":"class"},{"name":"Traversable","module":"Data.Traversable","entity":"class"},{"name":"Applicative","module":"GHC.Base","entity":"class"},{"name":"Functor","module":"GHC.Base","entity":"class"},{"name":"Monad","module":"GHC.Base","entity":"class"},{"name":"Monoid","module":"GHC.Base","entity":"class"},{"name":"Eq","module":"GHC.Classes","entity":"class"},{"name":"Ord","module":"GHC.Classes","entity":"class"},{"name":"Bounded","module":"GHC.Enum","entity":"class"},{"name":"Enum","module":"GHC.Enum","entity":"class"},{"name":"Floating","module":"GHC.Float","entity":"class"},{"name":"RealFloat","module":"GHC.Float","entity":"class"},{"name":"Num","module":"GHC.Num","entity":"class"},{"name":"Read","module":"GHC.Read","entity":"class"},{"name":"Fractional","module":"GHC.Real","entity":"class"},{"name":"Integral","module":"GHC.Real","entity":"class"},{"name":"Real","module":"GHC.Real","entity":"class"},{"name":"RealFrac","module":"GHC.Real","entity":"class"},{"name":"Show","module":"GHC.Show","entity":"class"}] diff --git a/tests/run.hs b/tests/run.hs index 709d53b..0315b00 100644 --- a/tests/run.hs +++ b/tests/run.hs @@ -1,5 +1,5 @@ {-# LANGUAGE FlexibleInstances, ImplicitParams, MultiParamTypeClasses, - FlexibleContexts, GADTs, TypeApplications #-} + FlexibleContexts, GADTs, TypeApplications, TemplateHaskell #-} import Test.Tasty hiding (defaultMain) import Test.Tasty.Golden import Test.Tasty.Golden.Manage @@ -29,6 +29,7 @@ import Language.Haskell.Names.Imports import Language.Haskell.Names.Annotated import Language.Haskell.Names.Open import Language.Haskell.Names.ModuleSymbols +import Language.Haskell.Names.Reify import Language.Haskell.Names.SyntaxUtils import qualified Language.Haskell.Names.GlobalSymbolTable as Global @@ -93,8 +94,9 @@ annotationTest environment (path, modul) = goldenTest path run where environmentTests :: TestTree environmentTests = goldenTest path run where run = do - baseEnvironment <- loadBase - writeSymbols out (baseEnvironment Map.! (U.ModuleName () "Prelude")) + let preludeSymbols :: [Symbol] + preludeSymbols = sort $(findModuleSymbols 0 dangerous "Prelude") + writeSymbols out preludeSymbols path = "tests/environment/Prelude.symbols" out = path <.> "out"