@@ -28,7 +28,7 @@ import qualified Control.Monad.Trans.State.Lazy as L
28import Control.Monad.Error (ErrorT(..), MonadError)
28import Control.Monad.Error (ErrorT(..), MonadError)
29import Control.Monad.Error.Class (MonadError(..))
29import Control.Monad.Error.Class (MonadError(..))
31−import Data.List (intercalate, isPrefixOf, nub, sortBy)
31+import Data.List (intercalate, isPrefixOf, nub, sortBy, isInfixOf)
32import Data.Maybe (mapMaybe)
32import Data.Maybe (mapMaybe)
33import Data.Foldable (traverse_)
33import Data.Foldable (traverse_)
34import Data.Version (showVersion)
34import Data.Version (showVersion)
@@ -56,6 +56,7 @@ import qualified System.IO.UTF8 as U
56 (writeFile, putStrLn, print, readFile)
56 (writeFile, putStrLn, print, readFile)
57import qualified Language.PureScript.Names as N
57import qualified Language.PureScript.Names as N
58import qualified Language.PureScript.Declarations as D
58import qualified Language.PureScript.Declarations as D
59+import Language.PureScript.Pretty.Types (prettyPrintType)
61-- The PSCI state.
62-- The PSCI state.
@@ -323,22 +324,46 @@ handleImport moduleName = do
324handleBrowse :: P.ModuleName -> PSCI ()
325handleBrowse :: P.ModuleName -> PSCI ()
325handleBrowse moduleName = do
326handleBrowse moduleName = do
327+ PSCiState { psciLoadedModules = loadedModules
328+ , psciImportedFilenames = loadedPaths} <- PSCI $ lift get
326− psciIO $ (readModuleTypes . N.runModuleName) moduleName >>= putStrLn
329+ psciIO $ (readModuleTypes loadedModules . findModulePath loadedPaths . N.runModuleName) moduleName >>= putStrLn
327 return ()
330 return ()
329− -- Compute the file `extern.purs` for the module moduleName.
332+ moduleToPath :: String -> FilePath
330− externPursFile :: FilePath -> FilePath
333+ moduleToPath = (pathSeparator:) . (++ ".purs") . N.runModuleName . N.moduleNameFromString
331− externPursFile modName = modulesDir ++ pathSeparator : modName ++ pathSeparator : "externs.purs"
334+
332−
335+ -- find the fully qualified module path (key to full module) - "" if not found
333− -- Read the module's type definition.
336+ findModulePath :: [FilePath] -> String -> Either String FilePath
334− readModuleTypes :: String -> IO String
335− readModuleTypes [] = return "Module must be specified."
337+ findModulePath _ [] = Left "Module must be specified."
336− readModuleTypes modName = let modFile = externPursFile modName in
338+ findModulePath filePaths modName = let partialModulePath = moduleToPath modName in
337− do
339+ case filter (isInfixOf partialModulePath) filePaths of
338− exists <- doesFileExist modFile
340+ [] -> Left $ "Module ('" ++ modName ++ "','" ++ partialModulePath ++ "') was not found."
339− if exists
341+ (x:_) -> Right x
340− then readFile modFile
342+
343+ -- retrieve explicit types
344+ getSignature (P.PositionedDeclaration _ d) = getSignature d
345+ getSignature (P.TypeDeclaration ident mtype) = Just $ show ident ++ " :: " ++ prettyPrintType mtype
346+ getSignature _ = Nothing
348+ -- pretty print module's signature
349+ signatures :: P.Module -> [String]
350+ signatures (P.Module _ ds _) = mapMaybe getSignature ds
352+ -- names :: [P.Module] -> [String]
353+ -- names ms = nub [ show qual
354+ -- | P.Module moduleName ds exts <- ms
355+ -- , ident <- mapMaybe (getDeclName exts) ds
356+ -- , qual <- [ P.Qualified Nothing ident
357+ -- , P.Qualified (Just moduleName) ident]
360+ readModuleTypes :: [(FilePath, D.Module)] -> Either String FilePath -> IO String
361+ readModuleTypes [] _ = return "No module(s) loaded."
362+ readModuleTypes _ (Left err) = return err
363+ readModuleTypes loadedModules (Right modName) =
364+ return $ case lookup modName loadedModules of
365+ Just mName -> unlines $ signatures mName
341− else return $ "Module '" ++ modName ++ "' not found!"
366+ _ -> "Module '" ++ modName ++ "' not found!"
344-- Takes a value and prints its type
369-- Takes a value and prints its type