git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Add warning for no prelude
20cf75aPhil Freeman
src/Language/PureScript.hs+12−1
@@ -97,6 +97,7 @@ compile' :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter
97 => Environment -> [Module] -> [String] -> m (String, String, Environment)
97 => Environment -> [Module] -> [String] -> m (String, String, Environment)
98compile' env ms prefix = do
98compile' env ms prefix = do
99 noPrelude <- asks optionsNoPrelude
99 noPrelude <- asks optionsNoPrelude
100+ unless noPrelude (checkPreludeIsDefined ms)
100 additional <- asks optionsAdditional
101 additional <- asks optionsAdditional
101 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
103 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
@@ -175,6 +176,7 @@ make :: forall m. (Functor m, Applicative m, Monad m, MonadMake m)
175 => FilePath -> [(Either RebuildPolicy FilePath, Module)] -> [String] -> m Environment
176 => FilePath -> [(Either RebuildPolicy FilePath, Module)] -> [String] -> m Environment
176make outputDir ms prefix = do
177make outputDir ms prefix = do
177 noPrelude <- asks optionsNoPrelude
178 noPrelude <- asks optionsNoPrelude
179+ unless noPrelude (checkPreludeIsDefined (map snd ms))
178 let filePathMap = M.fromList (map (\(fp, Module _ mn _ _) -> (mn, fp)) ms)
180 let filePathMap = M.fromList (map (\(fp, Module _ mn _ _) -> (mn, fp)) ms)
179
181
180 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
182 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
@@ -248,6 +250,12 @@ make outputDir ms prefix = do
248 [m'@(Module _ moduleName'' _ _)] | moduleName'' == moduleName' -> (:) (False, m') <$> rebuildIfNecessary graph toRebuild ms'
250 [m'@(Module _ moduleName'' _ _)] | moduleName'' == moduleName' -> (:) (False, m') <$> rebuildIfNecessary graph toRebuild ms'
249 _ -> throwError . errorMessage . InvalidExternsFile $ externsFile
251 _ -> throwError . errorMessage . InvalidExternsFile $ externsFile
250
252
253+checkPreludeIsDefined :: (MonadWriter MultipleErrors m) => [Module] -> m ()
254+checkPreludeIsDefined ms = do
255+ let mns = map getModuleName ms
256+ unless (preludeModuleName `elem` mns) $
257+ tell (errorMessage PreludeNotPresent)
258+
251reverseDependencies :: ModuleGraph -> M.Map ModuleName [ModuleName]
259reverseDependencies :: ModuleGraph -> M.Map ModuleName [ModuleName]
252reverseDependencies g = combine [ (dep, mn) | (mn, deps) <- g, dep <- deps ]
260reverseDependencies g = combine [ (dep, mn) | (mn, deps) <- g, dep <- deps ]
253 where
261 where
@@ -269,8 +277,11 @@ addDefaultImport toImport m@(Module coms mn decls exps) =
269importPrim :: Module -> Module
277importPrim :: Module -> Module
270importPrim = addDefaultImport (ModuleName [ProperName C.prim])
278importPrim = addDefaultImport (ModuleName [ProperName C.prim])
271
279
280+preludeModuleName :: ModuleName
281+preludeModuleName = ModuleName [ProperName C.prelude]
282+
272importPrelude :: Module -> Module
283importPrelude :: Module -> Module
273−importPrelude = addDefaultImport (ModuleName [ProperName C.prelude])
284+importPrelude = addDefaultImport preludeModuleName
274
285
275version :: Version
286version :: Version
276version = Paths.version
287version = Paths.version
src/Language/PureScript/Errors.hs+5
@@ -109,6 +109,7 @@ data ErrorMessage
109 | InvalidInstanceHead Type
109 | InvalidInstanceHead Type
110 | TransitiveExportError DeclarationRef [DeclarationRef]
110 | TransitiveExportError DeclarationRef [DeclarationRef]
111 | ShadowedName Ident
111 | ShadowedName Ident
112+ | PreludeNotPresent
112 | ErrorInExpression Expr ErrorMessage
113 | ErrorInExpression Expr ErrorMessage
113 | ErrorInModule ModuleName ErrorMessage
114 | ErrorInModule ModuleName ErrorMessage
114 | ErrorInInstance (Qualified ProperName) [Type] ErrorMessage
115 | ErrorInInstance (Qualified ProperName) [Type] ErrorMessage
@@ -201,6 +202,7 @@ errorCode InvalidNewtype = "InvalidNewtype"
201errorCode (InvalidInstanceHead _) = "InvalidInstanceHead"
202errorCode (InvalidInstanceHead _) = "InvalidInstanceHead"
202errorCode (TransitiveExportError _ _) = "TransitiveExportError"
203errorCode (TransitiveExportError _ _) = "TransitiveExportError"
203errorCode (ShadowedName _) = "ShadowedName"
204errorCode (ShadowedName _) = "ShadowedName"
205+errorCode PreludeNotPresent = "PreludeNotPresent"
204errorCode (NotYetDefined _ e) = errorCode e
206errorCode (NotYetDefined _ e) = errorCode e
205errorCode (ErrorUnifyingTypes _ _ e) = errorCode e
207errorCode (ErrorUnifyingTypes _ _ e) = errorCode e
206errorCode (ErrorInExpression _ e) = errorCode e
208errorCode (ErrorInExpression _ e) = errorCode e
@@ -382,6 +384,9 @@ prettyPrintSingleError full e = prettyPrintErrorMessage (if full then e else sim
382 go (TransitiveExportError x ys) = paras $ (line $ "An export for " ++ prettyPrintExport x ++ " requires the following to also be exported: ")
384 go (TransitiveExportError x ys) = paras $ (line $ "An export for " ++ prettyPrintExport x ++ " requires the following to also be exported: ")
383 : map (line . prettyPrintExport) ys
385 : map (line . prettyPrintExport) ys
384 go (ShadowedName nm) = line $ "Name '" ++ show nm ++ "' was shadowed."
386 go (ShadowedName nm) = line $ "Name '" ++ show nm ++ "' was shadowed."
387+ go PreludeNotPresent = paras [ line $ "There is no Prelude module loaded, and the --no-prelude option was not specified."
388+ , line $ "You probably need to install the Prelude and other dependencies using Bower."
389+ ]
385 go (ErrorUnifyingTypes t1 t2 err) = paras [ line "Error unifying type "
390 go (ErrorUnifyingTypes t1 t2 err) = paras [ line "Error unifying type "
386 , indent $ line $ prettyPrintType t1
391 , indent $ line $ prettyPrintType t1
387 , line "with type"
392 , line "with type"