@@ -28,6 +28,7 @@ import qualified Elm.Name as N
28import qualified Generate.JavaScript.Builder as JS
28import qualified Generate.JavaScript.Builder as JS
29import qualified Generate.JavaScript.Expression as Expr
29import qualified Generate.JavaScript.Expression as Expr
30import qualified Generate.JavaScript.Name as Name
30import qualified Generate.JavaScript.Name as Name
31+import qualified Reporting.Helpers as H
@@ -224,9 +225,19 @@ generateCycle mode (Opt.Global home _) cycle =
225 safeDefs = map (generateSafeCycle mode home) cycle
226 safeDefs = map (generateSafeCycle mode home) cycle
226 realDefs = map (generateRealCycle home) cycle
227 realDefs = map (generateRealCycle home) cycle
227− -- TODO add `try` in debug mode nice infinite recursion reports
228+ block = JS.Block (safeDefs ++ realDefs)
229− JS.Block (safeDefs ++ realDefs)
230+ case mode of
235+ JS.Try block Name.dollar $ JS.Throw $ JS.String $
236+ "The following top-level definitions are causing infinite recursion:\\n"
237+ <> drawCycle (map fst cycle)
238+ <> "\\n\\nThese errors are very tricky, so read "
239+ <> B.stringUtf8 (H.makeLink "halting-problem")
240+ <> " to learn how to fix it!"
232generateSafeCycle :: Name.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
243generateSafeCycle :: Name.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
@@ -248,6 +259,18 @@ generateRealCycle home (name, _) =
262+drawCycle :: [N.Name] -> B.Builder
265+ topLine = "\\n ┌─────┐"
266+ nameLine name = "\\n │ " <> N.toBuilder name
268+ bottomLine = "\\n └─────┘"
270+ mconcat (topLine : List.intersperse midLine (map nameLine names) ++ [ bottomLine ])
252-- GENERATE KERNEL
275-- GENERATE KERNEL