'From Pharo1.3 of 16 June 2011 [Latest update: #13320] on 8 January 2012 at 1:56:26 pm'! Object subclass: #ClassStats instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'WebCodeStats'! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! ClassStats class instanceVariableNames: ''! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 23:52'! bytecodeCount: aCompiledMethod | instStream cnt | cnt := 0. instStream := InstructionStream on: aCompiledMethod. [instStream atEnd] whileFalse: [ cnt := cnt + 1. instStream nextInstruction. ]. ^ cnt! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/8/2012 00:09'! bytecodeCountFor: classes ^ classes inject: 0 into: [:bcc :c | bcc + (self bytecodeCountFromMethodStats: (self methodsBytecodesFor: c localMethods asSet)) ]! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 23:53'! bytecodeCountFromMethodStats: stats ^ stats inject: 0 into: [:bcc :assoc | bcc + assoc value ]! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 12:59'! linesOfCode: classes ^ classes inject: 0 into: [:loc :c | loc + (self linesOfCodeFromMethodStats: (self methodsStatsOf: c)) ]! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 12:58'! linesOfCodeFromMethodStats: stats ^ stats inject: 0 into: [:loc :assoc | loc + assoc value ]! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 12:43'! methodCount: classes ^ classes inject: 0 into: [:methods :c | methods + c localMethods asSet size ]! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 23:51'! methodsBytecodesFor: methods | stats | stats := Dictionary new. methods do: [:m | m selector isOmniSelector ifFalse: [ stats at: m selector put: (self bytecodeCount: m) ]]. ^ stats! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 12:52'! methodsOf: aClass ^ aClass localMethods asSet! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 20:27'! methodsStatsFor: methods | stats | stats := Dictionary new. methods do: [:m | m selector isOmniSelector ifFalse: [ stats at: m selector put: m linesOfCode ]]. ^ stats! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 20:27'! methodsStatsOf: aClass | methods | methods := self methodsOf: aClass. ^ self methodsStatsFor: methods.! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/6/2012 22:53'! report: classes numMethods: numM with: loc | names | names := classes collect: [:c | c name]. ^ 'Code stats for ', (names fold: [:a :b| a,', ', b]), ' No. of classes: ', classes size asString, ' No. of methods: ', numM asString, ' lines of code: ', loc asString.! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/8/2012 00:08'! report: classes numMethods: numM with: loc and: numBytecodes | names | names := classes collect: [:c | c name]. ^ 'Code stats for ', (names fold: [:a :b| a,', ', b]), ' No. of classes: ', classes size asString, ' No. of methods: ', numM asString, ' lines of code: ', loc asString,' bytecode count: ', numBytecodes asString.! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/8/2012 00:07'! reportFor: aClassOrClasses | classReports classOrClasses | classReports := (aClassOrClasses isKindOf: Class) ifTrue: [ classOrClasses := {aClassOrClasses}. '' ] ifFalse:[ classOrClasses := aClassOrClasses. (aClassOrClasses collect: [:c| self reportFor: c ]) fold: [:a :b| a,' ', b]]. ^ classReports, ' ', (self report: classOrClasses numMethods: (self methodCount: classOrClasses) with: (self linesOfCode: classOrClasses) and: (self bytecodeCountFor: classOrClasses))! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 21:01'! reportForPackages: packageNames ^ self reportForPackages: packageNames includeExtensionMethods: nil ! ! !ClassStats class methodsFor: 'as yet unclassified' stamp: 'StefanMarr 1/7/2012 23:54'! reportForPackages: packageNames includeExtensionMethods: pkgName | packages classes methods numClasses numMethods loc bcc | packages := packageNames collect: [:n | PackageInfo named: n]. classes := packages gather: [:p | p classes]. classes := classes asSet. methods := packages gather: [:p | p methods]. pkgName ifNotNil: [methods := methods, (PackageInfo named: pkgName) extensionMethods]. methods := methods collect: [:srcRef | srcRef compiledMethod ]. methods := methods asSet. numClasses := classes size. numMethods := methods size. loc := self linesOfCodeFromMethodStats: (self methodsStatsFor: methods). bcc := self bytecodeCountFromMethodStats: (self methodsBytecodesFor: methods). ^ 'Code stats for ', (packageNames fold: [:a :b| a,', ', b]), ' No. of classes: ', numClasses asString, ' No. of methods: ', numMethods asString, ' lines of code: ', loc asString, ' bytecode count: ', bcc asString. ! !