Author: esr
Date: Fri Apr  6 06:50:37 2007
New Revision: 16618

URL: http://svn.gna.org/viewcvs/wesnoth?rev=16618&view=rev
Log:
macroscope checkpoint before teaching it to count unresolved references.

Modified:
    trunk/data/tools/macroscope

Modified: trunk/data/tools/macroscope
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/tools/macroscope?rev=16618&r1=16617&r2=16618&view=diff
==============================================================================
--- trunk/data/tools/macroscope (original)
+++ trunk/data/tools/macroscope Fri Apr  6 06:50:37 2007
@@ -5,7 +5,35 @@
 # By Eric S. Raymond April 2007.
 # (Yes, this *is* named after an ancient Piers Anthony novel.)
 
-import sys, os, time, re
+import sys, os, time, re, getopt
+
+def initialize(verbose):
+    "Prepare for crosschecks."
+    # This assumes we're being called from our source-tree location
+    datadir = os.path.join(*os.path.split(os.getcwd())[:-1])
+    if verbose:
+        print "# Data directory is: %s" % datadir
+
+    # Get the names of all files in the data subdirectory.
+    # Chdir to there first so we can deal in relative pathnames.
+    datafiles = []
+    os.chdir(datadir)
+    os.path.walk(".",
+                 lambda arg, dir, names: datafiles.extend(map(lambda x: 
os.path.normpath(os.path.join(dir,x)), names)),
+                 None)
+    datafiles = filter(lambda x: ".svn" not in x, datafiles)
+    #print "Data files: %s" % `datafiles`[1:-1]
+
+    # Get the names of all WML files.
+    cfgfiles = filter(lambda x: x.endswith(".cfg"), datafiles)
+
+    # Get the names of all utility-macro definition files
+    utilsfiles = filter(lambda x: x.startswith("utils"), cfgfiles) 
+    if verbose:
+        print "Definition files: %s" % `utilsfiles`[1:-1]
+
+    return (datafiles, cfgfiles, utilsfiles)
+
 
 class macro_cross_reference:
     def __init__(self, filelist):
@@ -27,6 +55,7 @@
         return self.xref
     def check_macro_references(self, filelist):
         "Decorate definitions with all references from a specified filelist."
+        self.unresolved = []
         for filename in filelist:
             rfp = open(filename)
             for (n, line) in enumerate(rfp):
@@ -39,38 +68,52 @@
                             namedict[filename] = []
                         namedict[filename].append(n+1)
             rfp.close()
-    def dump(self):
-        "Report the crossreference."
+    def xrefdump(self, threshold=9999):
+        "Report the crossreferences."
         for (name, (filename, n, references)) in self.xref.items():
-             print "Macro %s is defined at %s:%d, used in %d files:" % (name, 
filename, n, len(references))
-             for (file, linenumbers) in references.items():
+            nrefs = len(references)
+            if nrefs > threshold:
+                continue
+            print "Macro %s is defined at %s:%d, used in %d files:" % (name, 
filename, n, nrefs)
+            for (file, linenumbers) in references.items():
                  print "    %s: %s" % (file, `linenumbers`[1:-1])
+    def unrefdump(self):
+        "Report dangling references"
+        pass
 
-print "# Macroscope reporting on %s" % time.ctime() 
+if __name__ == "__main__":
+    print "# Macroscope reporting on %s" % time.ctime() 
+    # Process options
+    (options, arguments) = getopt.getopt(sys.argv[1:], "mu")
+    verbose = False
+    for (switch, val) in options:
+        if (switch == '-m'):
+            print "# Checking macro definitions from anywhere"
+            print "# against macro references from anywhere."
+            print "# Output will list unused macros and undefined references."
+            (datafiles, cfgfiles, utilsfiles) = initialize(verbose)
+            xref = macro_cross_reference(cfgfiles)
+            xref.check_macro_references(cfgfiles)
+            xref.xrefdump(threshold=0)
+            xref.unrefdump()
+            sys.exit(0)
+        elif (switch == '-u'):
+            print "# Checking macro definitions in the utils directory"
+            print "# against macro references from anywhere."
+            print "# Output will be a full reference report."
+            (datafiles, cfgfiles, utilsfiles) = initialize(verbose)
+            xref = macro_cross_reference(utilsfiles)
+            xref.check_macro_references(cfgfiles)
+            xref.xrefdump()
+            sys.exit(0)
+        elif (switch == '-u'):
+            verbose = True
+    # We get here if user didn't pick a valid mode option
+    print """
+Usage: macroscope [-v] {-m | -u}
+    -v = set verbose mode, dumping some intermediate results
+    -m = Report unused macros and undefined references.
+    -u = Full reference report on utils macros
+"""
+    sys.exit(1)
 
-# This assumes we're being called from our source-tree location
-datadir = os.path.join(*os.path.split(os.getcwd())[:-1])
-print "Data directory is: %s" % datadir
-
-# Get the names of all files in the data subdirectory.
-# Chdir to there first so we can deal in relative pathnames.
-datafiles = []
-os.chdir(datadir)
-os.path.walk(".",
-             lambda arg, dir, names: datafiles.extend(map(lambda x: 
os.path.normpath(os.path.join(dir,x)), names)),
-             None)
-datafiles = filter(lambda x: ".svn" not in x, datafiles)
-#print "Data files: %s" % `datafiles`[1:-1]
-
-# Get the names of all WML files.
-cfgfiles = filter(lambda x: x.endswith(".cfg"), datafiles)
-
-# Get the names of all utility-macro definition files
-utilsfiles = filter(lambda x: x.startswith("utils"), cfgfiles) 
-print "Definition files: %s" % `utilsfiles`[1:-1]
-
-# Check definitions in the utils directory against references everywhere
-xref = macro_cross_reference(utilsfiles)
-xref.check_macro_references(cfgfiles)
-xref.dump()
-


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to