Mercurial > urweb
diff src/elaborate.sml @ 1662:edf86cef0dba
Make wildification a bit smarter about ordering of new wildcard declarations
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sat, 07 Jan 2012 11:01:21 -0500 |
parents | b46c93ce7be2 |
children | 64c1e65c2365 |
line wrap: on
line diff
--- a/src/elaborate.sml Fri Jan 06 18:09:50 2012 -0500 +++ b/src/elaborate.sml Sat Jan 07 11:01:21 2012 -0500 @@ -3645,6 +3645,30 @@ val nd = removeUsed (nd, ds) + (* Among the declarations present explicitly in the program, find the last constructor or constraint declaration. + * The new constructor/constraint declarations that we add may safely be put after that point. *) + fun findLast (ds, acc) = + case ds of + [] => ([], acc) + | (d : L.decl) :: ds' => + let + val isCony = case #1 d of + L.DCon _ => true + | L.DDatatype _ => true + | L.DDatatypeImp _ => true + | L.DStr _ => true + | L.DConstraint _ => true + | L.DClass _ => true + | _ => false + in + if isCony then + (ds, acc) + else + findLast (ds', d :: acc) + end + + val (dPrefix, dSuffix) = findLast (rev ds, []) + fun extend (env, nd, ds) = let val ds' = List.mapPartial (fn (env', (c1, c2), loc) => @@ -3690,7 +3714,7 @@ | d => d) ds end in - (L.StrConst (extend (env, nd, ds)), #2 str) + (L.StrConst (extend (env, nd, rev dPrefix) @ dSuffix), #2 str) end | _ => str) | _ => str