53 "Modified: / 27-05-2014 / 16:54:26 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
53 "Modified: / 27-05-2014 / 16:54:26 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
54 ! ! |
54 ! ! |
55 |
55 |
56 !LintReport methodsFor:'generating'! |
56 !LintReport methodsFor:'generating'! |
57 |
57 |
58 generateClass: aClass |
58 generateClass:class inPackage:package |
59 | sourceInfo sourceName | |
59 | sourceInfo sourceName | |
60 sourceInfo := ReportSourceInfo forClass: aClass. |
60 |
61 sourceName := self encodeFilename: (self sourceFilenameFor: aClass). |
61 sourceInfo := ReportSourceInfo forClass:class inPackage:package. |
62 |
62 sourceName := self |
63 format writeFile: sourceName with: [ |
63 encodeFilename:(self sourceFilenameForClass:class package:package). |
64 self generateClass: aClass source: sourceInfo. |
64 format writeFile:sourceName |
65 self generateClass: aClass class source: sourceInfo. |
65 with:[ |
|
66 self generateClass:class source:sourceInfo inPackage: package. |
|
67 self generateClass:class class source:sourceInfo inPackage: package. |
66 ]. |
68 ]. |
67 |
69 format writeSource:sourceInfo to:sourceName |
68 format writeSource: sourceInfo contents to: sourceName |
70 |
69 |
71 "Created: / 15-12-2014 / 10:46:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
70 "Created: / 06-10-2011 / 23:54:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
71 "Modified: / 29-07-2013 / 14:47:40 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
72 ! |
72 ! |
73 |
73 |
74 generateClass: aClass selector: aSelector source: sourceInfo |
74 generateClass: aClass selector: aSelector source: sourceInfo |
75 | matching | |
75 | matching | |
76 matching := rules select: [ :each | |
76 matching := rules select: [ :each | |
80 |
80 |
81 "Created: / 07-10-2011 / 11:04:12 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
81 "Created: / 07-10-2011 / 11:04:12 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
82 "Modified: / 01-03-2013 / 18:10:21 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
82 "Modified: / 01-03-2013 / 18:10:21 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
83 ! |
83 ! |
84 |
84 |
85 generateClass: aClass source: sourceInfo |
85 generateClass: aClass selector: aSelector source: sourceInfo inPackage: package |
86 |
|
87 | matching | |
86 | matching | |
88 (environment definesClass: aClass) ifTrue: [ |
87 matching := rules select: [ :each | |
89 matching := rules select: [ :rule | |
88 (self isSelectorEnvironment: each result) |
90 (self isClassEnvironment: rule result) |
89 and: [ each result includesSelector: aSelector in: aClass ] ]. |
91 and: [ rule result includesClass: aClass ] ]. |
90 self generateViolations: matching class: aClass selector: aSelector source: sourceInfo |
92 self generateViolations: matching class: aClass selector: nil source: sourceInfo]. |
91 |
93 (environment selectorsForClass: aClass) asSortedCollection |
92 "Created: / 15-12-2014 / 11:04:07 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
94 do: [ :selector | self generateClass: aClass selector: selector source: sourceInfo] |
93 ! |
95 |
94 |
96 "Created: / 07-10-2011 / 10:29:42 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
95 generateClass: aClass source: sourceInfo inPackage: package |
97 "Modified: / 01-03-2013 / 18:11:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
96 |
|
97 | matching | |
|
98 (environment definesClass: aClass) ifTrue: [ |
|
99 matching := rules select: [ :rule | (self isClassEnvironment: rule result) and: [ rule result includesClass: aClass ] ]. |
|
100 self generateViolations: matching class: aClass source: sourceInfo |
|
101 ]. |
|
102 (environment selectorsForClass: aClass) asSortedCollection do: [ :selector | |
|
103 self generateClass: aClass selector: selector source: sourceInfo inPackage: package |
|
104 ] |
|
105 |
|
106 "Created: / 15-12-2014 / 11:05:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
107 ! |
|
108 |
|
109 generateClassesInPackage:package |
|
110 (ProjectDefinition searchForClassesWithProject:package) do:[:cls | |
|
111 self generateClass:cls inPackage:package |
|
112 ]. |
|
113 |
|
114 "Created: / 15-12-2014 / 10:52:42 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
115 ! |
|
116 |
|
117 generateExtensionsInPackage:package |
|
118 | sourceInfo sourceName | |
|
119 |
|
120 sourceInfo := ReportSourceInfo forExtensionsInPackage:package. |
|
121 sourceName := self |
|
122 encodeFilename:(self sourceFilenameForExtensionsInPackage:package). |
|
123 format writeFile:sourceName |
|
124 with:[ |
|
125 (ProjectDefinition searchForExtensionsWithProject:package) do:[:method | |
|
126 self |
|
127 generateClass:method mclass |
|
128 selector:method selector |
|
129 source:sourceInfo |
|
130 inPackage: package. |
|
131 ]. |
|
132 ]. |
|
133 format writeSource:sourceInfo to:sourceName |
|
134 |
|
135 "Created: / 15-12-2014 / 10:50:14 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
136 ! |
|
137 |
|
138 generatePackage: package |
|
139 self generateClassesInPackage:package. |
|
140 self generateExtensionsInPackage:package. |
|
141 |
|
142 "Created: / 15-12-2014 / 10:42:34 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
98 ! |
143 ! |
99 |
144 |
100 generateViolations: aCollection class: aClass selector: aSelector source: sourceInfo |
145 generateViolations: aCollection class: aClass selector: aSelector source: sourceInfo |
101 | method offset | |
146 | method offset | |
|
147 |
|
148 (AbstractSourceCodeManager isVersionMethodSelector: aSelector) ifTrue:[ ^ self ]. |
|
149 (AbstractSourceCodeManager isExtensionsVersionMethodSelector: aSelector) ifTrue:[ ^ self ]. |
|
150 |
102 |
151 |
103 method := aClass compiledMethodAt: aSelector. |
152 method := aClass compiledMethodAt: aSelector. |
104 offset := sourceInfo offsetOfMethod: method. |
153 offset := sourceInfo offsetOfMethod: method. |
105 aCollection do: [ :rule | |
154 aCollection do: [ :rule | |
106 | interval start stop | |
155 | tree | |
107 |
156 |
108 interval := (rule result selectionIntervalFor: method source) isNil ifTrue: [ 1 to: method source size ]. |
157 tree := RBParser parseMethod: method source. |
109 start := sourceInfo lineAndColumnOfOffset: offset + interval first - 1. |
158 rule result selectionIntervalsForSource: method source tree: tree in: method mclass do:[:intervalOrNil | |
110 stop := sourceInfo lineAndColumnOfOffset: offset + interval last - 1. |
159 | interval start stop | |
|
160 |
|
161 interval := interval isNil ifTrue: [ 1 to: method source size ]. |
|
162 start := sourceInfo lineAndColumnOfOffset: offset + interval first - 1. |
|
163 stop := sourceInfo lineAndColumnOfOffset: offset + interval last - 1. |
|
164 |
|
165 format writeViolation: rule |
|
166 class: aClass selector: aSelector |
|
167 startLine: start x column: start y |
|
168 stopLine: stop x column: stop y. |
|
169 ] |
|
170 ] |
|
171 |
|
172 "Created: / 01-03-2013 / 18:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
173 "Modified: / 15-12-2014 / 11:32:04 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
174 ! |
|
175 |
|
176 generateViolations: aCollection class: aClass source: sourceInfo |
|
177 | method offset start stop | |
|
178 |
|
179 start := sourceInfo lineAndColumnOfOffset: 1. |
|
180 stop := sourceInfo lineAndColumnOfOffset: SmallInteger maxVal. |
|
181 aCollection do: [ :rule | |
|
182 | interval | |
111 |
183 |
112 format writeViolation: rule |
184 format writeViolation: rule |
113 class: aClass selector: aSelector |
185 class: aClass selector: nil |
114 startLine: start x column: start y |
186 startLine: start x column: start y |
115 stopLine: stop x column: stop y. |
187 stopLine: stop x column: stop y. |
116 ] |
188 ] |
117 |
189 |
118 "Created: / 01-03-2013 / 18:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
190 "Created: / 15-12-2014 / 11:13:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
119 ! ! |
191 ! ! |
120 |
192 |
121 !LintReport methodsFor:'initialization'! |
193 !LintReport methodsFor:'initialization'! |
122 |
194 |
123 setupForClasses: classes |
195 setupForClasses: classes |
126 environment label: name |
198 environment label: name |
127 |
199 |
128 "Created: / 04-08-2011 / 14:40:31 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
200 "Created: / 04-08-2011 / 14:40:31 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
129 ! |
201 ! |
130 |
202 |
131 setupForPackages: packages |
203 setupForPackages: pkgs |
132 |
204 pkgs isEmpty ifTrue:[^self]. |
133 packages isEmpty ifTrue:[^self]. |
|
134 environment := PackageEnvironment |
205 environment := PackageEnvironment |
135 onEnvironment: BrowserEnvironment new |
206 onEnvironment: BrowserEnvironment new |
136 packageNames: packages. |
207 packageNames: pkgs. |
137 name isNil ifTrue:[ |
208 name isNil ifTrue:[ |
138 packages size > 1 ifTrue:[ |
209 pkgs size > 1 ifTrue:[ |
139 name := packages size printString , ' packages'. |
210 name := pkgs size printString , ' packages'. |
140 ] ifFalse:[ |
211 ] ifFalse:[ |
141 name := packages anElement |
212 name := pkgs anElement |
142 ] |
213 ] |
143 ]. |
214 ]. |
144 |
215 |
145 environment label: name. |
216 environment label: name. |
146 |
217 |
164 last := stream position. |
236 last := stream position. |
165 line := line + 1 ] |
237 line := line + 1 ] |
166 repeat |
238 repeat |
167 ! |
239 ! |
168 |
240 |
169 sourceFilenameFor: aClass |
241 sourceFilenameForClass:class package: package |
170 |
242 | fn cls | |
171 | fn cls | |
243 |
172 |
244 cls := class theNonMetaclass. |
173 cls := aClass theNonMetaclass. |
245 fn := package copy |
174 fn := cls package asString replaceAll:$: with:$_;replaceAll:$/ with:$_. |
246 replaceAll:$: with:$_; |
175 fn := fn , '_' , (cls asString copyReplaceAll:$: with: $_), '.' , cls programmingLanguage sourceFileSuffix. |
247 replaceAll:$/ with:$_; |
176 |
248 yourself. |
177 ^self encodeFilename: fn. |
249 fn := fn , '_' , (cls asString copyReplaceAll:$: with:$_) , '.' |
|
250 , cls programmingLanguage sourceFileSuffix. |
|
251 ^ self encodeFilename:fn. |
178 |
252 |
179 " |
253 " |
180 Builder::LintReportFormat::CheckStyle basicNew |
254 Builder::LintReportFormat::CheckStyle basicNew |
181 sourceFilenameFor: Class |
255 sourceFilenameFor: Class |
182 |
256 |
183 Builder::LintReportFormat::CheckStyle basicNew |
257 Builder::LintReportFormat::CheckStyle basicNew |
184 sourceFilenameFor: Builder::LintReportFormat |
258 sourceFilenameFor: Builder::LintReportFormat" |
|
259 |
|
260 "Created: / 15-12-2014 / 10:46:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
261 ! |
|
262 |
|
263 sourceFilenameForExtensionsInPackage: package |
|
264 | fn | |
|
265 |
|
266 fn := package copy |
|
267 replaceAll:$: with:$_; |
|
268 replaceAll:$/ with:$_; |
|
269 yourself. |
|
270 fn := fn , '_' , 'extensions.st'. |
|
271 ^ self encodeFilename:fn. |
|
272 |
185 " |
273 " |
186 |
274 Builder::LintReportFormat::CheckStyle basicNew |
187 "Created: / 07-10-2011 / 09:06:00 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
275 sourceFilenameFor: Class |
188 "Modified: / 01-03-2013 / 18:00:26 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
276 |
|
277 Builder::LintReportFormat::CheckStyle basicNew |
|
278 sourceFilenameFor: Builder::LintReportFormat" |
|
279 |
|
280 "Created: / 15-12-2014 / 10:50:57 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
189 ! ! |
281 ! ! |
190 |
282 |
191 !LintReport methodsFor:'running'! |
283 !LintReport methodsFor:'running'! |
192 |
284 |
193 runReport |
285 runReport |
197 wasTryLocalSources := Class tryLocalSourceFirst. |
289 wasTryLocalSources := Class tryLocalSourceFirst. |
198 Class tryLocalSourceFirst: true. |
290 Class tryLocalSourceFirst: true. |
199 SmalllintChecker |
291 SmalllintChecker |
200 runRule: (RBCompositeLintRule rules: rules) |
292 runRule: (RBCompositeLintRule rules: rules) |
201 onEnvironment: environment. |
293 onEnvironment: environment. |
202 |
294 environment packageNames do:[:packageName | |
203 (environment classes asSortedCollection: [ :a :b | a name <= b name ]) |
295 self generatePackage: packageName |
204 do: [ :class | self generateClass: class]. |
296 ]. |
205 ] ensure:[ |
297 ] ensure:[ |
206 Class tryLocalSourceFirst: wasTryLocalSources |
298 Class tryLocalSourceFirst: wasTryLocalSources |
207 ] |
299 ] |
208 |
300 |
209 "Modified: / 23-01-2012 / 09:04:55 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
301 "Modified: / 15-12-2014 / 11:06:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
210 ! |
302 ! |
211 |
303 |
212 setUp |
304 setUp |
213 |
305 |
214 super setUp. |
306 super setUp. |
215 rules isNil ifTrue:[ |
307 rules isNil ifTrue:[ |
216 rules := (RBCompositeLintRule rulesFor: RBBasicLintRule) |
308 rules := RBBuiltinRuleSet rulesetBuiltinDefault flatten |
217 reject: [ :each | each class name endsWith: 'SpellingRule' ] |
|
218 ]. |
309 ]. |
219 |
310 |
220 "Created: / 04-08-2011 / 14:35:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
311 "Created: / 04-08-2011 / 14:35:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
221 "Modified: / 28-02-2013 / 23:18:57 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
312 "Modified: / 15-12-2014 / 11:35:46 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
222 ! |
313 ! |
223 |
314 |
224 setupRulesFrom: filename |
315 setupRulesFrom: filename |
225 | file | |
316 | file | |
226 file := filename asFilename. |
317 file := filename asFilename. |