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(), "&lt;class comment&gt;", 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