performance.atl 7.14 KB
Newer Older
1
2
3
4
5
6
7
library performance;

--------------------------------------------- UselessStringValueOf---------------------------------------------

--Goes through all the methods to check if the following rule is followed:
--No need to call String.valueOf to append to a string; just use the valueOf() argument directly.
helper def: uselessStringValueOf() : Set(smm!Measure) =
8
9
10
11
		java!MethodInvocation.allInstances()
			 -> select (m | m.method.name='valueOf' )
			 -> select (m | m.refImmediateComposite().oclIsTypeOf(java!InfixExpression))
			 -> collect (m | thisModule.MeasureUselessStringValueOf(m));
12

13
14
------------------------------------ TooFewBranchesForASwitchStatement--------------------------------------

15
16
17
-- Returns a set of measures for each switch statement that violates the rule : number of switch cases < 3
-- To test, use input model : tooFewBranchesForASwitchStatement.xmi
helper def: tooFewBranchesForASwitchStatement(): Set(smm!Measure) =
18
19
20
21
22
	-- If the number of switch cases for the current switch statement is < 3 then add a new measure to the set
	java!SwitchStatement.allInstances()
		-> select (switchStatement | thisModule.nbBranchesOfASwitchStatement(switchStatement) < 3)
		-> collect (switchStatement | thisModule.MeasureTooFewBranchesForASwitchStatement(switchStatement))
;
23
24
25

--------------------------------------------- UseIndexOfChar---------------------------------------------

26
--Goes through all the MethodInvocation to check if the following rule is followed:
27
28
--Use String.indexOf(char) when checking for the index of a single character; it executes faster.
helper def: useIndexOfChar() : Set(smm!Measure) =
29
30
31
32
33
34
		java!MethodInvocation.allInstances()
			 -> select (m | m.method.name='indexOf') 
			 -> select (m | m.arguments.size() = 1)
			 -> select (m | not m.arguments.first().oclIsTypeOf(java!CharacterLiteral))
			 -> collect (m | thisModule.MeasureUseIndexOfChar(m))
;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

--------------------------------------------- avoidThrowingNewInstanceOfSameException ---------------------------------------------
-- Returns a set of Measures for each catch block throws a new instance of the caught exception
helper def: avoidThrowingNewInstanceOfSameException() : Set(smm!Measure) =
	java!CatchClause.allInstances() ->iterate(catch; catchRes : Set(smm!Measure) = Set{} |
		if catch.body <> OclUndefined
		then catch.body.statements 
			-> select(catchStatement | catchStatement.oclIsTypeOf(java!ThrowStatement) 
					and catchStatement.expression.oclIsTypeOf(java!ClassInstanceCreation))
			-> select(catchStatement | catchStatement.expression.type.type.name = catch.exception.type.type.name)
			-> collect(catchStatement | catchStatement.expression.arguments)
			-> iterate(arguments; argumentsRes : Set(smm!Measure) = Set{} |
				arguments
				-> select(argument | argument.oclIsTypeOf(java!SingleVariableAccess))
				-> select(argument | argument.variable.name = catch.exception.name)
				-> collect(argument | thisModule.MeasureAvoidThrowingNewInstanceOfSameException(catch))
			)
		else catchRes
		endif
Glenn PLOUHINEC's avatar
Glenn PLOUHINEC committed
54
55
	);

56

Glenn PLOUHINEC's avatar
Glenn PLOUHINEC committed
57
58
59
60
61
62
63
--------------------------------------------- AvoidUsingShortType---------------------------------------------

--Detects the use of the primitive type 'short' for rule AvoidUsingShortType. Prefer the use of 'int' instead of 'short'.
helper def: avoidUsingShortType() : Set(smm!Measure) =
	java!VariableDeclarationStatement.allInstances()
		->select(variable | variable.type.type.name = 'short')
		->collect(variable | thisModule.MeasureAvoidUsingShortType(variable));
64
65
66
67
68
69
70
71
72
73

--------------------------------------------- ShortInstantiation ---------------------------------------------

-- Rule for metrics ShortInstantiation : return the set of class Measures that violates the rule.
helper def: shortInstantiation() : Set(smm!Measure) =
	-- Take all ClassInstanceCreation with allInstances()
	java!ClassInstanceCreation.allInstances()
		-- Select all class who declare a Short type
		->select(it| it.method.oclIsTypeOf(java!ConstructorDeclaration) and it.method.name = 'Short')
		-- collect every results and send an error message
74
		->collect(it2|thisModule.MeasureShortInstantiation(it2.originalCompilationUnit))
75
76
77
78
79
80
81
82
83
84
85
86
87
	;

--------------------------------------------- LongInstantiation ---------------------------------------------

-- Rule for metricsLongInstantiation : return the set of class Measures that violates the rule.
helper def: longInstantiation() : Set(smm!Measure) =
	-- Take all ClassInstanceCreation with allInstances()
	java!ClassInstanceCreation.allInstances()
		-- Select all class who declare a Long type
		->select(it| it.method.oclIsTypeOf(java!ConstructorDeclaration) and it.method.name = 'Long')
		-- collect every results and send an error message
		->collect(it2|thisModule.MeasureLongInstantiation(it2.originalCompilationUnit))
	;
Alexis Pineau's avatar
Alexis Pineau committed
88

89
90
91
92
93
94
95
96
97
98
99
100
101
102
--------------------------------------------- AvoidRethrowingException  ---------------------------------------------
-- Rule for metrics AvoidRethrowingException :
helper def: avoidRethrowingException() : Set (smm!Measure) = 
	-- Browse through all try statements
	java!TryStatement.allInstances() ->iterate(tryStatement; res : Set(smm!Measure) = Set{} |
		tryStatement.catchClauses
		->select(catchClause | catchClause.body <> OclUndefined and catchClause.body.statements.size() = 1)
		->collect(catchClause | catchClause.body.statements)
		->iterate(catchStatement; res1 : Set(smm!Measure) = Set{} |
		catchStatement
		->select(catchState | catchState.oclIsTypeOf(java!ThrowStatement))
		->collect(catchState | thisModule.MeasureAvoidRethrowingException(catchState))
		)
	);
Alexis Pineau's avatar
Alexis Pineau committed
103
104
105
106
107
108
109
110
111
112
113
--------------------------------------------- IntegerInstantiation ---------------------------------------------

-- Rule for metricsIntegerInstantiation : returns the set of class Measures that violates the rule.
helper def: integerInstantiation() : Set(smm!Measure) =
	-- Take all ClassInstanceCreation with allInstances()
	java!ClassInstanceCreation.allInstances()
		-- Select all classes that declare an Integer type
		->select(it|it.method.oclIsTypeOf(java!ConstructorDeclaration) and it.method.name = 'Integer')
		-- collect every result and sends an error message
		->collect(it2|thisModule.MeasureIntegerInstantiation(it2.originalCompilationUnit))
	;
114
115
116
117
118
119
120
121
122
123
124
125

--------------------------------------------- Use ArrayList Instead Of Vector ---------------------------------------------

	helper  def: UseArrayListInsteadOfVector() : Set(smm!Measure) =
		-- Browse through all class(CompilationUnit)
	--On recupere tout les new Vector et on verifie que le Vector appelé appartient au package java.utile
		java!ConstructorDeclaration.allInstances()->
		collect(i|i.abstractTypeDeclaration)
		->select(p|p.name='Vector')->collect(i|i.package)
		->select(p|p.name='util')->collect(i|i.package)
		->select(p|p.name='java')
		->collect(i |thisModule.RuleUseArrayListInsteadOfVector(i));
Marion HUNAULT's avatar
Marion HUNAULT committed
126
127
128
129
130
131
132
133
134

--------------------------------------------- StringToString ---------------------------------------------

-- Rule for metrics stringToString : returns the set of class Measures that violates the rule.
helper def: stringToString() : Set(smm!Measure) =
	java!MethodInvocation.allInstances()
		-> select( i | i.method.name = 'toString' and i.expression.variable.variablesContainer.type.type.name = 'String')
		-> collect ( i | thisModule.MeasureStringToString(i) )
	;