-
-
Notifications
You must be signed in to change notification settings - Fork 353
/
RBEndTrueFalseRule.class.st
74 lines (63 loc) · 2.08 KB
/
RBEndTrueFalseRule.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"
Checks for ifTrue:ifFalse: blocks that have the same code at the beginning or end. While you might not originally write such code, as it is modified, it is easier to create such code. Instead of having the same code in two places, you should move it outside the blocks.
For example,
test
ifTrue: [self foo. self bar ]
ifFalse: [ self foo. self baz ]
is equivalent to:
self foo.
test
ifTrue: [ self bar ]
ifFalse: [ self baz ]
"
Class {
#name : #RBEndTrueFalseRule,
#superclass : #RBParseTreeLintRule,
#category : #'Refactoring-Critics-ParseTreeRules'
}
{ #category : #accessing }
RBEndTrueFalseRule class >> uniqueIdentifierName [
"This number should be unique and should change only when the rule completely change semantics"
^'EndTrueFalseRule'
]
{ #category : #accessing }
RBEndTrueFalseRule >> group [
^ 'Optimization'
]
{ #category : #initialization }
RBEndTrueFalseRule >> initialize [
super initialize.
self matcher
matchesAnyOf:
#('`@object
ifTrue: [| `@temps1 | `@.Statements1. `.Statement]
ifFalse: [| `@temps2 | `@.Statements2. `.Statement]' '`@object
ifTrue: [| `@temps1 | `.Statement. `@.Statements1]
ifFalse: [| `@temps2 | `.Statement. `@.Statements2]' '`@object
ifFalse: [| `@temps1 | `@.Statements1. `.Statement]
ifTrue: [| `@temps2 | `@.Statements2. `.Statement]' '`@object
ifFalse: [| `@temps1 | `.Statement. `@.Statements1]
ifTrue: [| `@temps2 | `.Statement. `@.Statement2]')
do: [ :node :answer |
answer
ifNil: [ | statement |
statement := node arguments first body statements last.
( statement isVariable and: [ statement = node arguments last body statements last ] )
ifFalse: [ node ]
ifTrue: [ nil ]
]
ifNotNil: [ answer ]
]
]
{ #category : #accessing }
RBEndTrueFalseRule >> name [
^ 'Check for same statements at end of ifTrue:ifFalse: blocks'
]
{ #category : #accessing }
RBEndTrueFalseRule >> rationale [
^ 'Checks for ifTrue:ifFalse: blocks that have the same code at the beginning or end.'
]
{ #category : #accessing }
RBEndTrueFalseRule >> severity [
^ #information
]