View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }