Skip to content

Commit 47fb30c

Browse files
authored
Merge pull request #84 from Siva-2707/chore/refactoring
chore: Refactor to solve smells
2 parents 3c99396 + afa4661 commit 47fb30c

17 files changed

+407
-266
lines changed
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package Designite.SourceModel;
2+
3+
public interface Parsable {
4+
void parse();
5+
}

src/Designite/SourceModel/SM_EntitiesWithType.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public String getTypeOverallToString() {
5454
// return "generic";
5555
}
5656

57-
@Override
58-
public void parse() {
59-
60-
}
57+
// @Override
58+
// public void parse() {
59+
//
60+
// }
6161
}

src/Designite/SourceModel/SM_Method.java

+53-36
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import Designite.visitors.InstanceOfVisitor;
1818
import Designite.visitors.ThrowVisitor;
1919

20-
public class SM_Method extends SM_SourceItem implements Vertex {
20+
public class SM_Method extends SM_SourceItem implements Vertex, Parsable {
2121

2222
private boolean abstractMethod;
2323
private boolean finalMethod;
@@ -103,17 +103,56 @@ public MethodDeclaration getMethodDeclaration() {
103103
return methodDeclaration;
104104
}
105105

106-
private void parseParameters() {
107-
for (SM_Parameter param : parameterList) {
108-
param.parse();
106+
private void prepareCalledMethodsList() {
107+
MethodInvVisitor invVisitor = new MethodInvVisitor(methodDeclaration);
108+
methodDeclaration.accept(invVisitor);
109+
List<MethodInvocation> invList = invVisitor.getCalledMethods();
110+
if (invList.size() > 0) {
111+
calledMethods.addAll(invList);
109112
}
110113
}
111114

112-
private void parseLocalVar() {
113-
for (SM_LocalVar var : localVarList) {
114-
var.parse();
115+
private void prepareInstanceOfVisitorList() {
116+
InstanceOfVisitor instanceOfVisitor = new InstanceOfVisitor();
117+
methodDeclaration.accept(instanceOfVisitor);
118+
List<Type> instanceOfTypes = instanceOfVisitor.getTypesInInstanceOf();
119+
if (instanceOfTypes.size() > 0) {
120+
typesInInstanceOf.addAll(instanceOfTypes);
121+
}
122+
}
123+
124+
private void prepareParametersList(SingleVariableDeclaration var) {
125+
VariableVisitor parameterVisitor = new VariableVisitor(this);
126+
// methodDeclaration.accept(parameterVisitor);
127+
var.accept(parameterVisitor);
128+
List<SM_Parameter> pList = parameterVisitor.getParameterList();
129+
if (pList.size() > 0) {
130+
parameterList.addAll(pList);
131+
}
132+
}
133+
134+
//SM_Parameter uses an empty parse method. So commenting this.
135+
// private void parseParameters() {
136+
// for (SM_Parameter param : parameterList) {
137+
// param.parse();
138+
// }
139+
// }
140+
141+
private void prepareLocalVarList() {
142+
LocalVarVisitor localVarVisitor = new LocalVarVisitor(this);
143+
methodDeclaration.accept(localVarVisitor);
144+
List<SM_LocalVar> lList = localVarVisitor.getLocalVarList();
145+
if (lList.size() > 0) {
146+
localVarList.addAll(lList);
115147
}
116148
}
149+
150+
//SM_LocalVar inherits SM_EntitiesWithType which inter uses an empty parse method. So, commenting this.
151+
// private void parseLocalVar() {
152+
// for (SM_LocalVar var : localVarList) {
153+
// var.parse();
154+
// }
155+
// }
117156

118157
public String getMethodBody() {
119158
if (this.hasBody())
@@ -145,32 +184,16 @@ public void printDebugLog(PrintWriter writer) {
145184
//TODO: Modularize parser with private functions
146185
@Override
147186
public void parse() {
148-
MethodInvVisitor invVisitor = new MethodInvVisitor(methodDeclaration);
149-
methodDeclaration.accept(invVisitor);
150-
List<MethodInvocation> invList = invVisitor.getCalledMethods();
151-
if (invList.size() > 0) {
152-
calledMethods.addAll(invList);
153-
}
187+
prepareCalledMethodsList();
154188

155189
List<SingleVariableDeclaration> variableList = methodDeclaration.parameters();
156190
for (SingleVariableDeclaration var : variableList) {
157-
VariableVisitor parameterVisitor = new VariableVisitor(this);
158-
// methodDeclaration.accept(parameterVisitor);
159-
var.accept(parameterVisitor);
160-
List<SM_Parameter> pList = parameterVisitor.getParameterList();
161-
if (pList.size() > 0) {
162-
parameterList.addAll(pList);
163-
}
164-
parseParameters();
191+
prepareParametersList(var);
192+
// parseParameters();
165193
}
166194

167-
LocalVarVisitor localVarVisitor = new LocalVarVisitor(this);
168-
methodDeclaration.accept(localVarVisitor);
169-
List<SM_LocalVar> lList = localVarVisitor.getLocalVarList();
170-
if (lList.size() > 0) {
171-
localVarList.addAll(lList);
172-
}
173-
parseLocalVar();
195+
prepareLocalVarList();
196+
// parseLocalVar();
174197

175198
DirectAceessFieldVisitor directAceessFieldVisitor = new DirectAceessFieldVisitor();
176199
methodDeclaration.accept(directAceessFieldVisitor);
@@ -182,14 +205,8 @@ public void parse() {
182205
if (thisAccesses.size() > 0) {
183206
thisAccessesInMethod.addAll(thisAccesses);
184207
}
185-
186-
InstanceOfVisitor instanceOfVisitor = new InstanceOfVisitor();
187-
methodDeclaration.accept(instanceOfVisitor);
188-
List<Type> instanceOfTypes = instanceOfVisitor.getTypesInInstanceOf();
189-
if (instanceOfTypes.size() > 0) {
190-
typesInInstanceOf.addAll(instanceOfTypes);
191-
}
192-
208+
prepareInstanceOfVisitorList();
209+
193210
ThrowVisitor throwVisithor = new ThrowVisitor();
194211
methodDeclaration.accept(throwVisithor);
195212
throwsException = throwVisithor.throwsException();

src/Designite/SourceModel/SM_Package.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Map;
99

10+
import Designite.metrics.TypeMetricsExtractor;
1011
import org.eclipse.jdt.core.dom.CompilationUnit;
1112

1213
import Designite.InputArgs;
@@ -17,7 +18,7 @@
1718
import Designite.utils.Constants;
1819
import Designite.utils.models.Edge;
1920

20-
public class SM_Package extends SM_SourceItem {
21+
public class SM_Package extends SM_SourceItem implements Parsable{
2122
private List<CompilationUnit> compilationUnitList;
2223
private List<SM_Type> typeList = new ArrayList<>();
2324
private SM_Project parentProject;
@@ -117,8 +118,7 @@ public void resolve() {
117118
public void extractTypeMetrics() {
118119
for (SM_Type type : typeList) {
119120
type.extractMethodMetrics();
120-
TypeMetrics metrics = new TypeMetrics(type);
121-
metrics.extractMetrics();
121+
TypeMetrics metrics = new TypeMetricsExtractor(type).extractMetrics();
122122
metricsMapping.put(type, metrics);
123123
exportMetricsToCSV(metrics, type.getName());
124124
updateDependencyGraph(type);

src/Designite/SourceModel/SM_Parameter.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ public String toString() {
5858
+ ", is=" + getTypeBinding().getNodeType();
5959
}
6060

61-
@Override
62-
public void parse() {
63-
64-
}
61+
// @Override
62+
// public void parse() {
63+
//
64+
// }
6565

6666
}

src/Designite/SourceModel/SM_Project.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import Designite.utils.Logger;
2121
import Designite.utils.models.Graph;
2222

23-
public class SM_Project extends SM_SourceItem {
23+
public class SM_Project extends SM_SourceItem implements Parsable {
2424

2525
private InputArgs inputArgs;
2626
private List<String> sourceFileList;

src/Designite/SourceModel/SM_SourceItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public abstract class SM_SourceItem {
1919
/**
2020
* This is the first pass of parsing a source code entity.
2121
*/
22-
public abstract void parse();
22+
// public abstract void parse();
2323

2424
/**
2525
* This method establishes relationships among source-code entities. Such

src/Designite/SourceModel/SM_Type.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Map;
99

10+
import Designite.metrics.MethodMetricsExtractor;
1011
import org.eclipse.jdt.core.dom.CompilationUnit;
1112
import org.eclipse.jdt.core.dom.ImportDeclaration;
1213
import org.eclipse.jdt.core.dom.Modifier;
@@ -25,7 +26,7 @@
2526
import Designite.visitors.StaticFieldAccessVisitor;
2627

2728
//TODO check EnumDeclaration, AnnotationTypeDeclaration and nested classes
28-
public class SM_Type extends SM_SourceItem implements Vertex {
29+
public class SM_Type extends SM_SourceItem implements Vertex, Parsable {
2930

3031

3132
private boolean isAbstract = false;
@@ -221,11 +222,12 @@ private void parseMethods() {
221222
}
222223
}
223224

224-
private void parseFields() {
225-
for (SM_Field field : fieldList) {
226-
field.parse();
227-
}
228-
}
225+
//SM_Field inherits SM_EntitiesWithType which inter uses an empty parse method. So, commenting this.
226+
// private void parseFields() {
227+
// for (SM_Field field : fieldList) {
228+
// field.parse();
229+
// }
230+
// }
229231

230232
@Override
231233
public void printDebugLog(PrintWriter writer) {
@@ -263,7 +265,7 @@ public void parse() {
263265
List<SM_Field> fList = fieldVisitor.getFields();
264266
if (fList.size() > 0)
265267
fieldList.addAll(fList);
266-
parseFields();
268+
// parseFields();
267269

268270
StaticFieldAccessVisitor fieldAccessVisitor = new StaticFieldAccessVisitor();
269271
typeDeclaration.accept(fieldAccessVisitor);
@@ -349,8 +351,7 @@ private void addUniqueReference(SM_Type type, SM_Type typeToAdd, boolean invardR
349351

350352
public void extractMethodMetrics() {
351353
for (SM_Method method : methodList) {
352-
MethodMetrics metrics = new MethodMetrics(method);
353-
metrics.extractMetrics();
354+
MethodMetrics metrics = new MethodMetricsExtractor(method).extractMetrics();
354355
metricsMapping.put(method, metrics);
355356
exportMethodMetricsToCSV(metrics, method.getName());
356357
}

src/Designite/SourceModel/TypeInfo.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public class TypeInfo {
1111
private boolean parametrizedType;
1212
private List<SM_Type> nonPrimitiveTypeParameters = new ArrayList<>();
1313

14+
private static final int COMMA_LENGTH = 2;
15+
1416
public SM_Type getTypeObj() {
1517
return typeObj;
1618
}
@@ -56,7 +58,7 @@ public String getStringOfNonPrimitiveParameters() {
5658
}
5759

5860
private String removeLastComma(String str) {
59-
return (str.length() > 2) ? str.substring(0, str.length() - 2) : str;
61+
return (str.length() > COMMA_LENGTH) ? str.substring(0, str.length() - COMMA_LENGTH) : str;
6062
}
6163

6264
public int getNumOfNonPrimitiveParameters() {

src/Designite/metrics/MethodMetrics.java

+23-53
Original file line numberDiff line numberDiff line change
@@ -5,60 +5,14 @@
55
import Designite.SourceModel.SM_Field;
66
import Designite.SourceModel.SM_Method;
77
import Designite.SourceModel.SM_Type;
8-
import Designite.visitors.MethodControlFlowVisitor;
98

10-
public class MethodMetrics implements MetricExtractor {
9+
public class MethodMetrics extends Metrics {
1110

1211
private int numOfParameters;
1312
private int cyclomaticComplexity;
1413
private int numOfLines;
15-
1614
private SM_Method method;
17-
18-
public MethodMetrics(SM_Method method) {
19-
this.method = method;
20-
}
21-
22-
@Override
23-
public void extractMetrics() {
24-
extractNumOfParametersMetrics();
25-
extractCyclomaticComplexity();
26-
extractNumberOfLines();
27-
}
28-
29-
private void extractNumOfParametersMetrics() {
30-
numOfParameters = method.getParameterList().size();
31-
}
32-
33-
private void extractCyclomaticComplexity() {
34-
cyclomaticComplexity = calculateCyclomaticComplexity();
35-
}
36-
37-
private int calculateCyclomaticComplexity() {
38-
MethodControlFlowVisitor visitor = new MethodControlFlowVisitor();
39-
method.getMethodDeclaration().accept(visitor);
40-
return visitor.getNumOfIfStatements()
41-
+ visitor.getNumOfSwitchCaseStatementsWitoutDefault()
42-
+ visitor.getNumOfForStatements()
43-
+ visitor.getNumOfWhileStatements()
44-
+ visitor.getNumOfDoStatements()
45-
+ visitor.getNumOfForeachStatements()
46-
+ 1;
47-
}
48-
49-
private void extractNumberOfLines() {
50-
if (methodHasBody()) {
51-
String body = method.getMethodDeclaration().getBody().toString();
52-
int length = body.length();
53-
// long newlines = body.lines().count();
54-
numOfLines = length - body.replace("\n", "").length();
55-
}
56-
}
57-
58-
private boolean methodHasBody() {
59-
return method.getMethodDeclaration().getBody() != null;
60-
}
61-
15+
6216
public int getNumOfParameters() {
6317
return numOfParameters;
6418
}
@@ -71,16 +25,32 @@ public int getNumOfLines() {
7125
return numOfLines;
7226
}
7327

28+
public void setNumOfParameters(int numOfParameters) {
29+
this.numOfParameters = numOfParameters;
30+
}
31+
32+
public void setCyclomaticComplexity(int cyclomaticComplexity) {
33+
this.cyclomaticComplexity = cyclomaticComplexity;
34+
}
35+
36+
public void setNumOfLines(int numOfLines) {
37+
this.numOfLines = numOfLines;
38+
}
39+
40+
public void setMethod(SM_Method method){
41+
this.method = method;
42+
}
43+
44+
public SM_Method getMethod() {
45+
return method;
46+
}
47+
7448
public List<SM_Field> getDirectFieldAccesses() {
7549
return method.getDirectFieldAccesses();
7650
}
77-
51+
7852
public List<SM_Type> getSMTypesInInstanceOf() {
7953
return method.getSMTypesInInstanceOf();
8054
}
81-
82-
public SM_Method getMethod() {
83-
return method;
84-
}
8555

8656
}

0 commit comments

Comments
 (0)