1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/* 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc. 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License. 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS, 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License. 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava; 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data; 20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.*; 22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class TodoFile { 24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static final String MISSING = "No description text"; 26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static boolean areTagsUseful(InheritedTags tags) { 28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (tags != null) { 29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (areTagsUseful(tags.tags())) { 30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson tags = tags.inherited(); 33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static boolean areTagsUseful(TagInfo[] tags) { 38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (TagInfo t : tags) { 39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ("Text".equals(t.name()) && t.text().trim().length() != 0) { 40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ("@inheritDoc".equals(t.name())) { 43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void setHDF(Data data, String base, SourcePositionInfo pos, String name, 50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String descr) { 51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".pos", pos.toString()); 52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".name", name); 53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".descr", descr); 54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson static class PackageStats { 57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String name; 58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int total; 59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int errors; 60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static String percent(int a, int b) { 63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "" + Math.round((((b - a) / (float) b)) * 100) + "%"; 64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void writeTodoFile(String filename) { 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = Doclava.makeHDF(); 68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Doclava.setPageTitle(data, "Missing Documentation"); 69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TreeMap<String, PackageStats> packageStats = new TreeMap<String, PackageStats>(); 70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo[] classes = Converter.rootClasses(); 72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Arrays.sort(classes); 73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int classIndex = 0; 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : classes) { 775118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (cl.isHiddenOrRemoved()){ 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson continue; 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String classBase = "classes." + classIndex; 82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String base = classBase + ".errors."; 84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int errors = 0; 85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int total = 1; 86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!areTagsUseful(cl.inlineTags())) { 88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHDF(data, base + errors, cl.position(), "<class comment>", MISSING); 89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson errors++; 90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : cl.constructors()) { 94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean good = true; 95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson total++; 96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.checkLevel()) { 97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!areTagsUseful(m.inlineTags())) { 98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHDF(data, base + errors, m.position(), m.prettySignature(), MISSING); 99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson good = false; 100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!good) { 103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson errors++; 104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : cl.selfMethods()) { 108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean good = true; 109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson total++; 110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.checkLevel()) { 111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!areTagsUseful(m.inlineTags())) { 112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHDF(data, base + errors, m.position(), m.name() + m.prettySignature(), MISSING); 113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson good = false; 114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!good) { 117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson errors++; 118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo f : cl.enumConstants()) { 123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean good = true; 124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson total++; 125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.checkLevel()) { 126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!areTagsUseful(f.inlineTags())) { 127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHDF(data, base + errors, f.position(), f.name(), MISSING); 128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson good = false; 129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!good) { 132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson errors++; 133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo f : cl.selfFields()) { 137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean good = true; 138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson total++; 139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.checkLevel()) { 140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!areTagsUseful(f.inlineTags())) { 141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHDF(data, base + errors, f.position(), f.name(), MISSING); 142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson good = false; 143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!good) { 146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson errors++; 147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (errors > 0) { 151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(classBase + ".qualified", cl.qualifiedName()); 152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(classBase + ".errorCount", "" + errors); 153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(classBase + ".totalCount", "" + total); 154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(classBase + ".percentGood", percent(errors, total)); 155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson PackageInfo pkg = cl.containingPackage(); 158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String pkgName = pkg != null ? pkg.name() : ""; 159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson PackageStats ps = packageStats.get(pkgName); 160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ps == null) { 161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ps = new PackageStats(); 162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ps.name = pkgName; 163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson packageStats.put(pkgName, ps); 164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ps.total += total; 166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ps.errors += errors; 167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classIndex++; 169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int allTotal = 0; 172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int allErrors = 0; 173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i = 0; 175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (PackageStats ps : packageStats.values()) { 176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("packages." + i + ".name", "" + ps.name); 177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("packages." + i + ".errorCount", "" + ps.errors); 178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("packages." + i + ".totalCount", "" + ps.total); 179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("packages." + i + ".percentGood", percent(ps.errors, ps.total)); 180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson allTotal += ps.total; 182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson allErrors += ps.errors; 183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("all.errorCount", "" + allErrors); 188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("all.totalCount", "" + allTotal); 189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("all.percentGood", percent(allErrors, allTotal)); 190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.write(data, "todo.cs", filename, true); 192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson} 194