65 |
76 |
66 "Created: / 07-08-2011 / 01:17:46 / cg" |
77 "Created: / 07-08-2011 / 01:17:46 / cg" |
67 ! |
78 ! |
68 |
79 |
69 generateReportOn:aStream |
80 generateReportOn:aStream |
70 aStream nextPutLine: '<?xml version="1.0"?>'. |
81 |perClass| |
71 aStream nextPutLine: '<pmd>'. |
82 |
|
83 perClass := IdentityDictionary new. |
|
84 |
72 rules do:[:eachRule | |
85 rules do:[:eachRule | |
73 eachRule problemCount > 0 ifTrue:[ |
86 eachRule problemCount > 0 ifTrue:[ |
74 eachRule failedMethods do:[:method | |
87 eachRule failedMethods do:[:method | |
75 |class classFileName s selector fullSource |
88 |class perMethodAndClassMethod perMethod| |
76 charPos lineNumber ruleName rationale| |
|
77 |
89 |
78 class := method mclass. |
90 class := method mclass. |
79 s := class localSourceStreamFor:class theNonMetaclass classFilename. |
91 perMethodAndClassMethod := perClass at:class theNonMetaclass ifAbsentPut:[{ IdentityDictionary new. IdentityDictionary new }]. |
80 s notNil ifTrue:[ |
92 perMethod := perMethodAndClassMethod at:(class isMeta ifTrue:[2] ifFalse:[1]). |
81 classFileName := s pathName. |
93 rules := perMethod at:method ifAbsentPut:[IdentitySet new]. |
82 s close. |
94 rules add:eachRule. |
83 ] ifFalse:[ |
95 ] |
84 classFileName := class sourceFilename. |
|
85 ]. |
|
86 fullSource := class source. |
|
87 charPos := method sourcePosition ? 1. |
|
88 "/ q&d hack - editor knows |
|
89 lineNumber := (TextView new contents:fullSource) |
|
90 lineOfCharacterPosition:charPos. |
|
91 ruleName := eachRule name. |
|
92 rationale := eachRule rationale. |
|
93 |
|
94 aStream nextPutLine:(' <file name="%1">' bindWith:classFileName). |
|
95 aStream nextPutLine:(' <violation line="%1" rule="%2">' bindWith:lineNumber with:ruleName). |
|
96 aStream nextPutLine:('%1' bindWith:rationale). |
|
97 aStream nextPutLine: ' </violation>'. |
|
98 aStream nextPutLine: ' </file>'. |
|
99 |
|
100 ]. |
|
101 ] |
96 ] |
102 ]. |
97 ]. |
|
98 |
|
99 aStream nextPutLine: '<?xml version="1.0"?>'. |
|
100 aStream nextPutLine: '<pmd>'. |
|
101 |
|
102 perClass keysAndValuesDo:[:class :perMethodAndClassMethod | |
|
103 |fullSource sourceStream classFileName| |
|
104 |
|
105 fullSource := class source. |
|
106 sourceStream := class localSourceStreamFor:(class classFilename). |
|
107 sourceStream notNil ifTrue:[ |
|
108 classFileName := sourceStream pathName. |
|
109 sourceStream close. |
|
110 ] ifFalse:[ |
|
111 classFileName := class packageDirectory construct:(class classFilename). |
|
112 ]. |
|
113 |
|
114 aStream nextPutLine:(' <file name="%1">' bindWith:classFileName asFilename pathName). |
|
115 |
|
116 { (perMethodAndClassMethod at:2). |
|
117 (perMethodAndClassMethod at:1) } do:[:perMethod | |
|
118 (perMethod keys copyAsOrderedCollection sort:[:a :b | a selector < b selector]) do:[:eachMethod | |
|
119 |rulesPerMethod charPosOfMethod lineNumberOfMethod| |
|
120 |
|
121 rulesPerMethod := perMethod at:eachMethod. |
|
122 |
|
123 charPosOfMethod := eachMethod sourcePosition ? 1. |
|
124 "/ q&d hack - editor knows how to compute line number - should go |
|
125 "/ somewhere else... |
|
126 lineNumberOfMethod := (ListView basicNew setList:fullSource) lineOfCharacterPosition:charPosOfMethod. |
|
127 rulesPerMethod do:[:eachRule | |
|
128 |ruleName rationale| |
|
129 |
|
130 ruleName := eachRule name. |
|
131 rationale := eachRule rationale. |
|
132 |
|
133 aStream nextPutLine:(' <violation line="%1" rule="%2">' |
|
134 bindWith:lineNumberOfMethod with:ruleName). |
|
135 aStream nextPutLine:('%1' bindWith:rationale). |
|
136 aStream nextPutLine: ' </violation>'. |
|
137 |
|
138 ]. |
|
139 ]. |
|
140 ]. |
|
141 aStream nextPutLine: ' </file>'. |
|
142 ]. |
103 aStream nextPutLine: '</pmd>'. |
143 aStream nextPutLine: '</pmd>'. |
104 |
144 |
105 "Created: / 07-08-2011 / 01:17:00 / cg" |
145 "Created: / 07-08-2011 / 01:17:00 / cg" |
106 ! ! |
146 ! ! |
107 |
147 |
125 |
171 |
126 "Created: / 07-08-2011 / 01:10:56 / cg" |
172 "Created: / 07-08-2011 / 01:10:56 / cg" |
127 ! |
173 ! |
128 |
174 |
129 setupRules |
175 setupRules |
130 | allRule checks| |
176 self setupRules:(RBCompositeLintRule allRules). |
131 |
177 |
132 allRule := RBCompositeLintRule allRules. |
178 "Created: / 07-08-2011 / 01:08:56 / cg" |
133 checks := allRule rules detect:[ :each | each name = 'Lint checks' ]. |
179 ! |
|
180 |
|
181 setupRules:rulesArg |
|
182 | checks| |
|
183 |
|
184 checks := rulesArg rules detect:[ :each | each name = 'Lint checks' ]. |
134 checks rules: (checks rules reject: [ :each | each name = 'Squeak bugs' ]). |
185 checks rules: (checks rules reject: [ :each | each name = 'Squeak bugs' ]). |
135 |
186 |
136 rules := allRule flattened. |
187 rules := rulesArg flattened. |
137 |
188 |
138 "Created: / 07-08-2011 / 01:08:56 / cg" |
189 "Created: / 07-08-2011 / 11:48:30 / cg" |
139 ! ! |
190 ! ! |
140 |
191 |
141 !SmalllintReportGenerator class methodsFor:'documentation'! |
192 !SmalllintReportGenerator class methodsFor:'documentation'! |
142 |
193 |
143 version |
194 version |