summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-01-07 11:01:21 -0500
committerGravatar Adam Chlipala <adam@chlipala.net>2012-01-07 11:01:21 -0500
commitbd78657f61d3783f9a282bf38ad0cbcb8b8bf5d4 (patch)
tree8ab456dd2dee70ad84290cc91210acd8fed4fb4c /src
parent87cd4f01bb611d65ea6914ce2d588f6c2a924c58 (diff)
Make wildification a bit smarter about ordering of new wildcard declarations
Diffstat (limited to 'src')
-rw-r--r--src/elaborate.sml26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/elaborate.sml b/src/elaborate.sml
index 89c077e5..aa62422b 100644
--- a/src/elaborate.sml
+++ b/src/elaborate.sml
@@ -3645,6 +3645,30 @@ and wildifyStr env (str, sgn) =
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 @@ and wildifyStr env (str, sgn) =
| 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