codechecker/SmalllintReportGenerator.st
changeset 37 0a356190f3f3
parent 36 2c0987f7230d
equal deleted inserted replaced
36:2c0987f7230d 37:0a356190f3f3
    19 "
    19 "
    20 !
    20 !
    21 
    21 
    22 examples
    22 examples
    23 "
    23 "
       
    24                                                                     [exBegin]
    24     |checker|
    25     |checker|
    25 
    26 
    26     checker := self new.
    27     checker := self new.
    27     checker addPackage:'exept:workflow'.
    28     checker addPackage:'exept:workflow'.
    28     checker performChecks.
    29     checker performChecks.
    29     checker generateReportAs:'checkstyle.xml'
    30     checker generateReportAs:'checkstyle.xml'
       
    31                                                                     [exEnd]
       
    32 
       
    33                                                                     [exBegin]
       
    34     |checker|
       
    35 
       
    36     checker := self new.
       
    37     checker addClasses:(Workflow::Datatype withAllSubclasses).
       
    38     checker performChecks.
       
    39     checker generateReportAs:'checkstyle.xml'
       
    40                                                                     [exEnd]
    30 "
    41 "
    31 ! !
    42 ! !
    32 
    43 
    33 !SmalllintReportGenerator class methodsFor:'instance creation'!
    44 !SmalllintReportGenerator class methodsFor:'instance creation'!
    34 
    45 
    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 
   109 
   149 
   110 addClass:aClass
   150 addClass:aClass
   111     environment addClass: aClass.
   151     environment addClass: aClass.
   112 
   152 
   113     "Created: / 07-08-2011 / 01:11:33 / cg"
   153     "Created: / 07-08-2011 / 01:11:33 / cg"
       
   154 !
       
   155 
       
   156 addClasses:aCollectionOfClasses
       
   157     aCollectionOfClasses do:[:eachClass | self addClass: eachClass ].
       
   158 
       
   159     "Created: / 07-08-2011 / 11:51:52 / cg"
   114 !
   160 !
   115 
   161 
   116 addPackage:aPackage
   162 addPackage:aPackage
   117     Smalltalk loadPackage:aPackage.
   163     Smalltalk loadPackage:aPackage.
   118     Smalltalk allClassesInPackage:aPackage do:[:cls | self addClass:cls]
   164     Smalltalk allClassesInPackage:aPackage do:[:cls | self addClass:cls]
   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