changeset 1531:7efcf8f4a44a

'-dumpTypes'
author Adam Chlipala <adam@chlipala.net>
date Sun, 07 Aug 2011 16:53:06 -0400
parents 09c56e03beaf
children 7ef09e91198b
files doc/manual.tex src/elaborate.sig src/elaborate.sml src/main.mlton.sml
diffstat 4 files changed, 63 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/doc/manual.tex	Sun Aug 07 13:47:15 2011 -0400
+++ b/doc/manual.tex	Sun Aug 07 16:53:06 2011 -0400
@@ -199,6 +199,8 @@
 \end{verbatim}
 It is often worthwhile to run \cd{urweb} in this mode, because later phases of compilation can take significantly longer than type-checking alone, and the type checker catches many errors that would traditionally be found through debugging a running application.
 
+A related option is \cd{-dumpTypes}, which, as long as parsing succeeds, outputs to stdout a summary of the kinds of all identifiers declared with \cd{con} and the types of all identifiers declared with \cd{val} or \cd{val rec}.  This information is dumped even if there are errors during type inference.  Compiler error messages go to stderr, not stdout, so it is easy to distinguish the two kinds of output programmatically.
+
 To output information relevant to CSS stylesheets (and not finish regular compilation), run
 \begin{verbatim}
 urweb -css P
--- a/src/elaborate.sig	Sun Aug 07 13:47:15 2011 -0400
+++ b/src/elaborate.sig	Sun Aug 07 16:53:06 2011 -0400
@@ -32,4 +32,8 @@
 
     val resolveClass : ElabEnv.env -> Elab.con -> Elab.exp option
 
+    val dumpTypes : bool ref
+    (* After elaboration (successful or failed), should I output a mapping from
+     * all identifiers to their kinds/types? *)
+
 end
--- a/src/elaborate.sml	Sun Aug 07 13:47:15 2011 -0400
+++ b/src/elaborate.sml	Sun Aug 07 16:53:06 2011 -0400
@@ -38,6 +38,8 @@
  open ElabPrint
  open ElabErr
 
+ val dumpTypes = ref false
+
  structure IS = IntBinarySet
  structure IM = IntBinaryMap
 
@@ -4486,6 +4488,58 @@
                 (!delayedExhaustives);
 
         (*preface ("file", p_file env' file);*)
+
+        if !dumpTypes then
+            let
+                open L'
+                open Print.PD
+                open Print
+
+                fun dumpDecl (d, env) =
+                    case #1 d of
+                        DCon (x, _, k, _) => (print (box [string x,
+                                                          space,
+                                                          string "::",
+                                                          space,
+                                                          p_kind env k,
+                                                          newline,
+                                                          newline]);
+                                              E.declBinds env d)
+                      | DVal (x, _, t, _) => (print (box [string x,
+                                                          space,
+                                                          string ":",
+                                                          space,
+                                                          p_con env t,
+                                                          newline,
+                                                          newline]);
+                                              E.declBinds env d)
+                      | DValRec vis => (app (fn (x, _, t, _) => print (box [string x,
+                                                                            space,
+                                                                            string ":",
+                                                                            space,
+                                                                            p_con env t,
+                                                                            newline,
+                                                                            newline])) vis;
+                                        E.declBinds env d)
+                      | DStr (x, _, _, str) => (print (box [string ("<" ^ x ^ ">"),
+                                                            newline,
+                                                            newline]);
+                                                dumpStr (str, env);
+                                                print (box [string ("</" ^ x ^ ">"),
+                                                            newline,
+                                                            newline]);
+                                                E.declBinds env d)
+                      | _ => E.declBinds env d
+
+                and dumpStr (str, env) =
+                    case #1 str of
+                        StrConst ds => ignore (foldl dumpDecl env ds)
+                      | _ => ()
+            in
+                ignore (foldl dumpDecl env' file)
+            end
+        else
+            ();
         
         (L'.DFfiStr ("Basis", basis_n, sgn), ErrorMsg.dummySpan)
         :: ds
--- a/src/main.mlton.sml	Sun Aug 07 13:47:15 2011 -0400
+++ b/src/main.mlton.sml	Sun Aug 07 16:53:06 2011 -0400
@@ -80,6 +80,9 @@
       | "-tc" :: rest =>
         (tc := true;
          doArgs rest)
+      | "-dumpTypes" :: rest =>
+        (Elaborate.dumpTypes := true;
+         doArgs rest)
       | "-output" :: s :: rest =>
         (Settings.setExe (SOME s);
          doArgs rest)