1#!/usr/bin/env python 2 3from glob import glob 4import os, re, sys 5 6classre = re.compile(r'(?P<javadoc>(/\*\*([^/]|/[^*])*?\*/\s*)?)(?P<mods>public\s+((abstract)\s+)*)(?P<class_type>(class|interface)\s+)?(?P<class_name>\w+)\s*(?P<end>(extends|implements|{))', re.DOTALL) 7fieldre = re.compile(r'(?P<javadoc>(/\*\*([^/]|/[^*])*?\*/\s*)?)(?P<mods>public\s+((abstract|final|static)\s+)*)(?P<field_type>\w+\s+)?(?P<field_name>\w+)(?P<params>\s*(\(.*?\)|=|;))', re.DOTALL) 8paramre = re.compile(r'\s*(?:final\s*)?(?P<param_type>\w+(\[\])?)\s+(?P<param_name>\w+)\s*(?P<comma>,?)') 9 10def fieldsig(m): 11 return '%s%s' % (m.group('field_name'), paramre.sub('\g<param_type>\g<comma>', m.group('params') or '')) 12 13def parse(input): 14 javadoc = {} 15 for m in classre.finditer(input): 16 javadoc[m.group('class_name')] = m.group('javadoc') 17 for m in fieldre.finditer(input): 18 javadoc[fieldsig(m)] = m.group('javadoc') 19 return javadoc 20 21def mkclass(m): 22 #if debug: 23 #print "Looking up", m.group('class_name') 24 return '%s%s%s%s %s' % (javadoc.get(m.group('class_name'), '/** TODO */\n'), m.group('mods'), (m.group('class_type') or ''), m.group('class_name'), m.group('end')) 25 26def mkfield(m): 27 #if debug: 28 #print "Looking up", fieldsig(m) 29 return '%s%s%s%s%s' % (javadoc.get(fieldsig(m), '/** TODO */\n '), m.group('mods'), (m.group('field_type') or ''), m.group('field_name'), m.group('params')) 30 31if len(sys.argv) < 3 or not os.path.isfile(sys.argv[1]) or not os.path.isfile(sys.argv[2]): 32 print >>sys.stderr, "Usage %s <docfile> <srcfile>" % sys.argv[0] 33 sys.exit(-1) 34docfile, srcfile = sys.argv[1:3] 35 36# Parse the javadoc from the doc file 37#debug = True or (os.path.basename(docfile) == 'Database.java') 38javadoc = parse(open(docfile).read()) 39#if debug: 40 #print repr(javadoc) 41 42# Merge the javadoc with the source file 43newsrc = classre.sub(mkclass, open(srcfile).read()) 44newsrc = fieldre.sub(mkfield, newsrc) 45sys.stdout.write(newsrc) 46