on master help sign in
Require at least one Def in recursive declarations
commit3ee017eeb92f81d24d405b8b5c397d3e300801b1 authorEvan Czaplicki <evancz@users.noreply.github.com> dateSun 24 Mar 2019, 15:26 (8 years ago) parent481620f
2 files changed+21−9
compiler/src/AST/Canonical.hs+1−1 compiler/src/Canonicalize/Module.hs+20−8
compiler/src/AST/Canonical.hs+1−1
@@ -128,7 +128,7 @@ data Def
128128
129129data Decls
130130 = Declare Def Decls
131− | DeclareRec [Def] Decls
131+ | DeclareRec Def [Def] Decls
132132 | SaveTheEnvironment
133133
134134
compiler/src/Canonicalize/Module.hs+20−8
@@ -93,13 +93,11 @@ detectCycles sccs =
9393 Graph.AcyclicSCC (def, _, _) ->
9494 Can.Declare def <$> detectCycles otherSccs
9595
96− Graph.CyclicSCC [] ->
97− detectCycles otherSccs
98−
9996 Graph.CyclicSCC subNodes ->
100− Can.DeclareRec
101− <$> traverse detectBadCycles (Graph.stronglyConnComp subNodes)
102− <*> detectCycles otherSccs
97+ do defs <- traverse detectBadCycles (Graph.stronglyConnComp subNodes)
98+ case defs of
99+ [] -> detectCycles otherSccs
100+ d:ds -> Can.DeclareRec d ds <$> detectCycles otherSccs
103101
104102
105103detectBadCycles :: Graph.SCC Can.Def -> Result i w Can.Def
@@ -108,8 +106,22 @@ detectBadCycles scc =
108106 Graph.AcyclicSCC def ->
109107 Result.ok def
110108
111− Graph.CyclicSCC cyclicValueDefs ->
112− Result.throw (Error.RecursiveDecl cyclicValueDefs)
109+ Graph.CyclicSCC [] ->
110+ error "The definition of Data.Graph.SCC should not allow empty CyclicSCC!"
111+
112+ Graph.CyclicSCC (def:defs) ->
113+ let
114+ (A.At region name) = extractDefName def
115+ names = map (A.toValue . extractDefName) defs
116+ in
117+ Result.throw (Error.RecursiveDecl region name names)
118+
119+
120+extractDefName :: Can.Def -> A.Located Name.Name
121+extractDefName def =
122+ case def of
123+ Can.Def name _ _ -> name
124+ Can.TypedDef name _ _ _ _ -> name
113125
114126
115127