reports/Builder__LintReport.st
changeset 254 9272fef1d474
parent 233 8ea8b3692704
child 267 9f55d8893118
equal deleted inserted replaced
253:0b7dd037aeb2 254:9272fef1d474
    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 
   148         LintReport runPackage:'stx:goodies/monticello'.
   219         LintReport runPackage:'stx:goodies/monticello'.
   149         LintReport runPackage:'stx:libjava'
   220         LintReport runPackage:'stx:libjava'
   150     "
   221     "
   151 
   222 
   152     "Created: / 04-08-2011 / 14:40:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   223     "Created: / 04-08-2011 / 14:40:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   224     "Modified: / 15-12-2014 / 10:52:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   153 ! !
   225 ! !
   154 
   226 
   155 !LintReport methodsFor:'private'!
   227 !LintReport methodsFor:'private'!
   156 
   228 
   157 lineAndColumn: aString at: anInteger
   229 lineAndColumn: aString at: anInteger
   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.