/
ReSmalllintChecker.class.st
154 lines (124 loc) · 3.63 KB
/
ReSmalllintChecker.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
"
Same as SmalllintManifestChecker but with tweaks for Renraku model
"
Class {
#name : #ReSmalllintChecker,
#superclass : #SmalllintManifestChecker,
#instVars : [
'methodRules',
'nodeRules',
'classRules',
'packageRules',
'critiques'
],
#category : #'Renraku-CriticBrowser'
}
{ #category : #adding }
ReSmalllintChecker >> addCritique: aCritique [
(((critiques collect: [ :x | x sourceAnchor sourceEntity name ]) includes: aCritique sourceAnchor sourceEntity name)and: rule first name = 'Illegal dependency of Bootstrap Layer')
ifFalse:[
^ critiques add: aCritique]
]
{ #category : #private }
ReSmalllintChecker >> checkClass: aClass [
(environment includesClass: aClass) ifFalse: [ ^ self ].
self getCritiquesAbout: aClass by: classRules
]
{ #category : #private }
ReSmalllintChecker >> checkMethodsForClass: aClass [
environment
selectorsForClass: aClass
do: [ :selector | | method ast |
method := aClass>>selector.
self getCritiquesAbout: method by: methodRules.
nodeRules do: [ :r |
ast := method ast.
"for rewrite rules, we run every rule on a copy of the ast"
r isRewriteRule ifTrue: [ ast := ast copy ].
ast nodesDo: [ :node |
r
check: node
forCritiquesDo: [ :crit |
crit sourceAnchor initializeEnitity: method.
self addCritique: crit ] ] ]]
]
{ #category : #private }
ReSmalllintChecker >> checkPackage: aPackage [
(environment includesPackage: aPackage) ifTrue: [
self getCritiquesAbout: aPackage by: packageRules ]
]
{ #category : #accessing }
ReSmalllintChecker >> criticsOf: aRule [
^ critiques
select: [ :c | c rule class = aRule class ]
]
{ #category : #manifest }
ReSmalllintChecker >> falsePositiveOf: aRule [
| ruleCritiques rId rV mb |
ruleCritiques := self criticsOf: aRule.
rId := aRule class uniqueIdentifierName.
rV := aRule class identifierMinorVersionNumber.
^ ruleCritiques
select: [ :critique |
| entity |
entity := critique sourceAnchor entity.
mb := self manifestBuilderOf: entity.
mb ifNil: [ false ] ifNotNil: [ mb isFalsePositive: entity onRule: rId version: rV ]
]
]
{ #category : #private }
ReSmalllintChecker >> getCritiquesAbout: anEntity by: rules [
rules do: [ :r |
[ r
check: anEntity
forCritiquesDo: [ :crit |
self addCritique: crit ] ]
on: Error
do: [ :er | ReSettings showErrors ifTrue: [ er pass ] ] ]
]
{ #category : #initialization }
ReSmalllintChecker >> initialize [
super initialize.
self resetResult
]
{ #category : #private }
ReSmalllintChecker >> reParseRule [
methodRules := Set new.
nodeRules := Set new.
classRules := Set new.
packageRules := Set new.
self rule do: [ :r |
r class checksMethod ifTrue: [ methodRules add: r ].
r class checksNode ifTrue: [ nodeRules add: r ].
r class checksClass ifTrue: [ classRules add: r ].
r class checksPackage ifTrue: [ packageRules add: r ] ]
]
{ #category : #running }
ReSmalllintChecker >> resetResult [
critiques := Set new
]
{ #category : #accessing }
ReSmalllintChecker >> rule [
^ (rule isKindOf: RBCompositeLintRule)
ifTrue: [ rule leaves ]
ifFalse: [ rule ]
]
{ #category : #actions }
ReSmalllintChecker >> run [
self reParseRule.
super run
]
{ #category : #manifest }
ReSmalllintChecker >> toDoOf: aRule [
| ruleCritiques rId rV mb |
ruleCritiques := self criticsOf: aRule.
rId := aRule class uniqueIdentifierName.
rV := aRule class identifierMinorVersionNumber.
^ ruleCritiques
select: [ :critique |
| entity |
entity := critique sourceAnchor entity.
mb := self manifestBuilderOf: entity.
mb ifNil: [ false ] ifNotNil: [ mb containsToDo: entity onRule: rId version: rV ]
]
]