/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.clearsilver.HDF; import org.clearsilver.CS; import java.util.*; import java.io.*; public class TodoFile { public static final String MISSING = "No description text"; public static boolean areTagsUseful(InheritedTags tags) { while (tags != null) { if (areTagsUseful(tags.tags())) { return true; } tags = tags.inherited(); } return false; } public static boolean areTagsUseful(TagInfo[] tags) { for (TagInfo t: tags) { if ("Text".equals(t.name()) && t.text().trim().length() != 0) { return true; } if ("@inheritDoc".equals(t.name())) { return true; } } return false; } public static void setHDF(HDF data, String base, SourcePositionInfo pos, String name, String descr) { data.setValue(base + ".pos", pos.toString()); data.setValue(base + ".name", name); data.setValue(base + ".descr", descr); } static class PackageStats { String name; public int total; public int errors; } public static String percent(int a, int b) { return ""+Math.round((((b-a)/(float)b))*100) + "%"; } public static void writeTodoFile(String filename) { HDF data = DroidDoc.makeHDF(); DroidDoc.setPageTitle(data, "Missing Documentation"); TreeMap<String,PackageStats> packageStats = new TreeMap<String,PackageStats>(); ClassInfo[] classes = Converter.rootClasses(); Arrays.sort(classes); int classIndex = 0; for (ClassInfo cl: classes) { if (cl.isHidden()) { continue; } String classBase = "classes." + classIndex; String base = classBase + ".errors."; int errors = 0; int total = 1; if (!areTagsUseful(cl.inlineTags())) { setHDF(data, base + errors, cl.position(), "<class comment>", MISSING); errors++; } for (MethodInfo m: cl.constructors()) { boolean good = true; total++; if (m.checkLevel()) { if (!areTagsUseful(m.inlineTags())) { setHDF(data, base + errors, m.position(), m.name() + m.prettySignature(), MISSING); good = false; } } if (!good) { errors++; } } for (MethodInfo m: cl.selfMethods()) { boolean good = true; total++; if (m.checkLevel()) { if (!areTagsUseful(m.inlineTags())) { setHDF(data, base + errors, m.position(), m.name() + m.prettySignature(), MISSING); good = false; } } if (!good) { errors++; } } for (FieldInfo f: cl.enumConstants()) { boolean good = true; total++; if (f.checkLevel()) { if (!areTagsUseful(f.inlineTags())) { setHDF(data, base + errors, f.position(), f.name(), MISSING); good = false; } } if (!good) { errors++; } } for (FieldInfo f: cl.selfFields()) { boolean good = true; total++; if (f.checkLevel()) { if (!areTagsUseful(f.inlineTags())) { setHDF(data, base + errors, f.position(), f.name(), MISSING); good = false; } } if (!good) { errors++; } } if (errors > 0) { data.setValue(classBase + ".qualified", cl.qualifiedName()); data.setValue(classBase + ".errorCount", ""+errors); data.setValue(classBase + ".totalCount", ""+total); data.setValue(classBase + ".percentGood", percent(errors, total)); } PackageInfo pkg = cl.containingPackage(); String pkgName = pkg != null ? pkg.name() : ""; PackageStats ps = packageStats.get(pkgName); if (ps == null) { ps = new PackageStats(); ps.name = pkgName; packageStats.put(pkgName, ps); } ps.total += total; ps.errors += errors; classIndex++; } int allTotal = 0; int allErrors = 0; int i = 0; for (PackageStats ps: packageStats.values()) { data.setValue("packages." + i + ".name", ""+ps.name); data.setValue("packages." + i + ".errorCount", ""+ps.errors); data.setValue("packages." + i + ".totalCount", ""+ps.total); data.setValue("packages." + i + ".percentGood", percent(ps.errors, ps.total)); allTotal += ps.total; allErrors += ps.errors; i++; } data.setValue("all.errorCount", ""+allErrors); data.setValue("all.totalCount", ""+allTotal); data.setValue("all.percentGood", percent(allErrors, allTotal)); ClearPage.write(data, "todo.cs", filename, true); } }