@@ -8,12 +8,13 @@ import Control.Applicative
8import Control.Monad.Writer (runWriterT)
8import Control.Monad.Writer (runWriterT)
9import Control.Monad.Trans.Except (runExceptT)
9import Control.Monad.Trans.Except (runExceptT)
11−import Data.List (isSuffixOf, sort)
11+import Data.List (sort)
13import System.Exit (exitFailure)
13import System.Exit (exitFailure)
14import System.Console.Haskeline
14import System.Console.Haskeline
15import System.FilePath ((</>))
15import System.FilePath ((</>))
16−import System.Directory (getCurrentDirectory, getDirectoryContents)
16+import System.Directory (getCurrentDirectory)
17+import qualified System.FilePath.Glob as Glob
18import Test.HUnit
19import Test.HUnit
@@ -48,9 +49,14 @@ completionTestData =
48 , (":mo", [":module"])
49 , (":mo", [":module"])
49 , (":b", [":browse"])
50 , (":b", [":browse"])
51− -- :browse should complete modules
52+ -- :browse should complete module names
52− , (":b Prel", [":b Prelude", ":b Prelude.Unsafe"])
53+ , (":b Control.Monad.E", map (":b Control.Monad.Eff" ++) ["", ".Unsafe", ".Class", ".Console"])
53− , (":b Prelude.", [":b Prelude.Unsafe"])
54+ , (":b Control.Monad.Eff.", map (":b Control.Monad.Eff" ++) [".Unsafe", ".Class", ".Console"])
56+ -- import should complete module names
57+ , ("import Control.Monad.E", map ("import Control.Monad.Eff" ++) ["", ".Unsafe", ".Class", ".Console"])
58+ , ("import Control.Monad.Eff.", map ("import Control.Monad.Eff" ++) [".Unsafe", ".Class", ".Console"])
59+ , ("import qualified Control.Monad.Eff.", map ("import qualified Control.Monad.Eff" ++) [".Unsafe", ".Class", ".Console"])
55 -- :load, :module should complete file paths
61 -- :load, :module should complete file paths
56 , (":l psci/tests/data/", [":l psci/tests/data/Sample.purs"])
62 , (":l psci/tests/data/", [":l psci/tests/data/Sample.purs"])
@@ -66,8 +72,8 @@ completionTestData =
66 , (":show a", [])
72 , (":show a", [])
68 -- :type should complete values and data constructors in scope
74 -- :type should complete values and data constructors in scope
69− , (":type Prelude.Unsafe.un", [":type Prelude.Unsafe.unsafeIndex"])
75+ , (":type Control.Monad.Eff.Console.lo", [":type Control.Monad.Eff.Console.log"])
70− , (":type un", [":type unit"])
76+ , (":type uni", [":type unit"])
71 , (":type E", [":type EQ"])
77 , (":type E", [":type EQ"])
73 -- :kind should complete types in scope
79 -- :kind should complete types in scope
@@ -79,25 +85,19 @@ completionTestData =
79 , (":type EQ ", [])
85 , (":type EQ ", [])
80 , (":kind Ordering ", [])
86 , (":kind Ordering ", [])
82− -- import should complete module names
83− , ("import Control.Monad.S", ["import Control.Monad.ST"])
84− , ("import qualified Control.Monad.S", ["import qualified Control.Monad.ST"])
85− , ("import Control.Monad.", map ("import Control.Monad." ++)
88 -- a few other import tests
88 -- a few other import tests
89 , ("impor", ["import"])
89 , ("impor", ["import"])
90 , ("import q", ["import qualified"])
90 , ("import q", ["import qualified"])
91− , ("import ", map ("import " ++) allModuleNames ++ ["import qualified"])
91+ , ("import ", map ("import " ++) supportModules ++ ["import qualified"])
92− , ("import Prelude.Unsafe ", [])
92+ , ("import Prelude ", [])
94 -- String and number literals should not be completed
94 -- String and number literals should not be completed
95 , ("\"hi", [])
95 , ("\"hi", [])
96 , ("34", [])
96 , ("34", [])
98 -- Identifiers and data constructors should be completed
98 -- Identifiers and data constructors should be completed
99− , ("un", ["unit"])
99+ , ("uni", ["unit"])
100− , ("Debug.Trace.", map ("Debug.Trace." ++) ["print", "trace"])
100+ , ("Control.Monad.Eff.Class.", ["Control.Monad.Eff.Class.liftEff"])
101 , ("G", ["GT"])
101 , ("G", ["GT"])
102 , ("Prelude.L", ["Prelude.LT"])
102 , ("Prelude.L", ["Prelude.LT"])
@@ -107,14 +107,6 @@ completionTestData =
107 , ("Control.Monad.ST.new", ["Control.Monad.ST.newSTRef"])
107 , ("Control.Monad.ST.new", ["Control.Monad.ST.newSTRef"])
110− allModuleNames = [ "Assert"
111− , "Control.Monad.Eff"
112− , "Control.Monad.ST"
119assertCompletedOk :: (String, [String]) -> Assertion
111assertCompletedOk :: (String, [String]) -> Assertion
120assertCompletedOk (line, expecteds) = do
112assertCompletedOk (line, expecteds) = do
@@ -131,10 +123,12 @@ runCM act = do
131getPSCiState :: IO PSCiState
123getPSCiState :: IO PSCiState
132getPSCiState = do
124getPSCiState = do
133 cwd <- getCurrentDirectory
125 cwd <- getCurrentDirectory
134− let preludeDir = cwd </> "tests" </> "prelude"
126+ let supportDir = cwd </> "tests" </> "support" </> "flattened"
135− jsDir = preludeDir </> "js"
127+ let supportFiles ext = Glob.globDir1 (Glob.compile ("*." ++ ext)) supportDir
136− modulesOrFirstError <- loadAllModules [ preludeDir </> "Prelude.purs" ]
128+ pursFiles <- supportFiles "purs"
137− jsFiles <- map (jsDir </>) . filter (".js" `isSuffixOf`) <$> getDirectoryContents jsDir
129+ jsFiles <- supportFiles "js"
131+ modulesOrFirstError <- loadAllModules pursFiles
138 foreignFiles <- forM jsFiles (\f -> (f,) <$> readFile f)
132 foreignFiles <- forM jsFiles (\f -> (f,) <$> readFile f)
139 Right (foreigns, _) <- runExceptT $ runWriterT $ P.parseForeignModulesFromFiles foreignFiles
133 Right (foreigns, _) <- runExceptT $ runWriterT $ P.parseForeignModulesFromFiles foreignFiles
140 case modulesOrFirstError of
134 case modulesOrFirstError of
@@ -148,3 +142,15 @@ controlMonadSTasST :: ImportedModule
148controlMonadSTasST = (s "Control.Monad.ST", P.Implicit, Just (s "ST"))
142controlMonadSTasST = (s "Control.Monad.ST", P.Implicit, Just (s "ST"))
150 s = P.moduleNameFromString
144 s = P.moduleNameFromString
146+supportModules :: [String]
148+ [ "Control.Monad.Eff.Class"
149+ , "Control.Monad.Eff.Console"
150+ , "Control.Monad.Eff"
151+ , "Control.Monad.Eff.Unsafe"
152+ , "Control.Monad.ST"