forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RBRefersToClassRule.class.st
46 lines (38 loc) · 1.66 KB
/
RBRefersToClassRule.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
"
This smell arises when a class has its class name directly in the source instead of ""self class"" (or just ""self"" when on the class side). The self class / self variant allows you to create subclasses without needing to redefine that method.
However we cannot systematically replace Class reference by self class or self because a Class reference is static and a self expression is dynamic. So the programmer may want to send messages to root of an hierarchy and not to the leaf classes. Therefore this rule generates false positives, please double check when fixing!
"
Class {
#name : #RBRefersToClassRule,
#superclass : #ReAbstractRule,
#category : #'GeneralRules-Migrated'
}
{ #category : #testing }
RBRefersToClassRule class >> checksMethod [
^ true
]
{ #category : #accessing }
RBRefersToClassRule class >> uniqueIdentifierName [
"This number should be unique and should change only when the rule completely change semantics"
^'RefersToClassRule'
]
{ #category : #running }
RBRefersToClassRule >> basicCheck: aMethod [
| class |
"The class method #isAbstract needs to explicitly hardcode class references. So we do not criticize this."
(aMethod methodClass isClassSide and: [ aMethod selector = #isAbstract ]) ifTrue: [ ^ false ].
class := aMethod methodClass instanceSide.
^ aMethod hasLiteral: (class environment associationAt: class name ifAbsent: [ ^ false ])
]
{ #category : #accessing }
RBRefersToClassRule >> group [
^ 'Design Flaws'
]
{ #category : #accessing }
RBRefersToClassRule >> name [
^ 'Refers to class name instead of "self class"'
]
{ #category : #accessing }
RBRefersToClassRule >> rationale [
^ 'Checks for direct reference to classes themselves.'
]