1
2
3
4
5 package mockit.coverage.reporting.dataCoverage;
6
7 import edu.umd.cs.findbugs.annotations.NonNull;
8 import edu.umd.cs.findbugs.annotations.Nullable;
9
10 import mockit.coverage.dataItems.FieldData;
11 import mockit.coverage.dataItems.InstanceFieldData;
12 import mockit.coverage.dataItems.PerFileDataCoverage;
13 import mockit.coverage.dataItems.StaticFieldData;
14 import mockit.coverage.reporting.parsing.FileParser;
15 import mockit.coverage.reporting.parsing.LineElement;
16
17 import org.checkerframework.checker.index.qual.NonNegative;
18
19 public final class DataCoverageOutput {
20 @NonNull
21 private final StringBuilder openingTag;
22 @NonNull
23 private final PerFileDataCoverage coverageInfo;
24 @NonNegative
25 private int nextField;
26 @Nullable
27 private String classAndFieldNames;
28 @Nullable
29 private String className;
30 @Nullable
31 private String fieldName;
32
33 public DataCoverageOutput(@NonNull PerFileDataCoverage coverageInfo) {
34 openingTag = new StringBuilder(50);
35 this.coverageInfo = coverageInfo;
36 moveToNextField();
37 }
38
39 private void moveToNextField() {
40 if (nextField >= coverageInfo.allFields.size()) {
41 classAndFieldNames = null;
42 className = null;
43 fieldName = null;
44 return;
45 }
46
47 classAndFieldNames = coverageInfo.allFields.get(nextField);
48 nextField++;
49
50 int p = classAndFieldNames.indexOf('.');
51 className = classAndFieldNames.substring(0, p);
52 fieldName = classAndFieldNames.substring(p + 1);
53 }
54
55 public void writeCoverageInfoIfLineStartsANewFieldDeclaration(@NonNull FileParser fileParser) {
56 if (classAndFieldNames != null) {
57 assert className != null;
58
59 if (className.equals(fileParser.getCurrentlyPendingClass())) {
60 LineElement initialLineElement = fileParser.lineParser.getInitialElement();
61
62 assert fieldName != null;
63 LineElement elementWithFieldName = initialLineElement.findWord(fieldName);
64
65 if (elementWithFieldName != null) {
66 buildOpeningTagForFieldWrapper();
67 elementWithFieldName.wrapText(openingTag.toString(), "</span>");
68 moveToNextField();
69 }
70 }
71 }
72 }
73
74 private void buildOpeningTagForFieldWrapper() {
75 openingTag.setLength(0);
76 openingTag.append("<span class='");
77
78 assert classAndFieldNames != null;
79 StaticFieldData staticData = coverageInfo.getStaticFieldData(classAndFieldNames);
80 boolean staticField = staticData != null;
81 openingTag.append(staticField ? "static" : "instance");
82
83 openingTag.append(coverageInfo.isCovered(classAndFieldNames) ? " cvd" : " uncvd");
84
85 InstanceFieldData instanceData = coverageInfo.getInstanceFieldData(classAndFieldNames);
86
87 if (staticField || instanceData != null) {
88 openingTag.append("' title='");
89 appendAccessCounts(staticField ? staticData : instanceData);
90 }
91
92 openingTag.append("'>");
93 }
94
95 private void appendAccessCounts(@NonNull FieldData fieldData) {
96 openingTag.append("Reads: ").append(fieldData.getReadCount());
97 openingTag.append(" Writes: ").append(fieldData.getWriteCount());
98 }
99 }