Tools__ClassChecker.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 14 Jun 2018 22:19:39 +0100
branchjv
changeset 18227 d25a407ba86d
parent 15566 184cea584be5
child 19600 4b1129981eb9
permissions -rw-r--r--
Mini testrunner: show "green" if there's at least one pass and rest is pass or skip This is more meaningfull result then showing "gray" if there's at least one skip.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14947
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2004 by eXept Software AG
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libtool' }"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ NameSpace: Tools }"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#ClassChecker
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:'checkedClass badClasses badClassInfo badMethods badMethodInfo
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
		obsoleteWarners allObsoleteMethods checksPerformed'
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	classVariableNames:''
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	poolDictionaries:''
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	category:'Interface-Browsers-New'
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
!ClassChecker class methodsFor:'documentation'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
copyright
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
 COPYRIGHT (c) 2004 by eXept Software AG
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
              All Rights Reserved
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 This software is furnished under a license and may be used
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 only in accordance with the terms of that license and with the
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 inclusion of the above copyright notice.   This software may not
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 be provided or otherwise made available to, or used by, any
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 other person.  No title to or ownership of the software is
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 hereby transferred.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
documentation
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    embeddable application displaying the class-categories.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    Provides an outputGenerator, which enumerates the classes in
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    the selected categories.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    Attention: do not change the method categories 'checks-' into something else.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    The 'checks-' prefix is used to detect checks and these are listed in the browsers
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    lint dialog.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    [author:]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        Claus Gittinger (cg@exept.de)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
!ClassChecker class methodsFor:'queries'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
individualChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    "return a list of supported checks"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    |checks|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    checks := OrderedCollection new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    self methodDictionary keysAndValuesDo:[:sel :mthd |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	(mthd category startsWith:'checks')  ifTrue:[checks add:sel]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    checks sort.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    ^ checks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    "
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
     self individualChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    "
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    "Created: / 18.8.2000 / 22:30:46 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    "Modified: / 18.8.2000 / 22:31:02 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
!ClassChecker methodsFor:'accessing'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
badClassInfo
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    ^ badClassInfo
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
badMethodInfo
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    ^ badMethodInfo
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
checkedClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    "return the value of the instance variable 'checkedClass' (automatically generated)"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    ^ checkedClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
checkedClass:something
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    "set the value of the instance variable 'checkedClass' (automatically generated)"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    checkedClass := something.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    checksPerformed := nil.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
!ClassChecker methodsFor:'checking'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
allChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    self errorChecks.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    self warningChecks.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    self styleChecks.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
doCheck:whichCheck
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    checksPerformed isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
	checksPerformed := Set new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    (checksPerformed includes:whichCheck) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
	checksPerformed add:whichCheck.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
	self perform:whichCheck
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
errorChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    self doCheck:#subclassResponsibilityNotDefined.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    self doCheck:#sentNotImplemented.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    self doCheck:#definesEqualButNotHash.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    self doCheck:#instanceVariablesNeverWritten.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
styleChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    self doCheck:#checkProtocols.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    self doCheck:#sendsObsoleteMethodWarningButNotTaggedAsObsoleteOrViceVersa.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    self doCheck:#unusedInstanceVariables.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    self doCheck:#unusedClassVariables.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
"/    self doCheck:#guardingClause.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    "Modified: / 18-05-2010 / 14:38:15 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
warningChecks
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    self doCheck:#messageNeverSentAndNotUsedAsSymbol.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    self doCheck:#sendsObsoleteMessages.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    self doCheck:#instanceVariablesNeverUsed.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    self doCheck:#instanceVariablesNeverWritten.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    self doCheck:#classVariablesNeverUsed.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    self doCheck:#classVariablesNeverWritten.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    self doCheck:#classInstanceVariablesNeverUsed.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    self doCheck:#classInstanceVariablesNeverWritten.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    self doCheck:#invalidKeyInImageResourceMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
!ClassChecker methodsFor:'checks-individual'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
checkProtocols
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
	self checkProtocolOf:method
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
checkVariableNameConventions
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    |badInstVars badClassVars|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    badInstVars := checkedClass instanceVariableNames select:[:varName | varName isUppercaseFirst].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    badClassVars := checkedClass classVarNames select:[:varName | varName first isLowercase].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    badInstVars notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
        badInstVars := (badInstVars collect:[:v | '''' , v , '''']) asStringWith:$, .
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
        self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
            rememberBadClass:checkedClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
            info:('instVars ' , badInstVars , ' should be lowercase (#checkNameConventions)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    badClassVars notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
        badClassVars := (badClassVars collect:[:v | '''' , v , '''']) asStringWith:$, .
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
        self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
            rememberBadClass:checkedClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
            info:('classVars ' , badClassVars , ' should be uppercase (#checkNameConventions)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
classInstanceVariablesNeverUsed
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    self instanceVariablesNeverUsedIn:checkedClass theMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
classInstanceVariablesNeverWritten
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
    self instanceVariablesNeverWrittenIn:checkedClass theMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
classVariablesNeverUsed
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    |cls notUsedHere notUsedAnyWhere anySubclass|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    cls := checkedClass theNonMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    notUsedHere := cls classVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    notUsedHere isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    self removeUsedClassVariablesIn:cls from:notUsedHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    self removeUsedClassVariablesIn:cls class from:notUsedHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    notUsedHere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
        notUsedAnyWhere := notUsedHere copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
        anySubclass := false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
        cls allSubclassesDo:[:eachSubclass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
            anySubclass := true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
            notUsedAnyWhere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
                self removeUsedClassVariablesIn:eachSubclass from:notUsedAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
                self removeUsedClassVariablesIn:eachSubclass class from:notUsedAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
        notUsedHere do:[:eachVariable |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
            |className|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
            className := checkedClass name allBold.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
                rememberBadClass:cls
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
                info:('classVar ' , eachVariable allBold , ' is unused in ' , className , ' (#classVariablesNeverUsed)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
            (notUsedAnyWhere includes:eachVariable) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
                self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
                    rememberBadClass:cls
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
                    info:('classVar ' , eachVariable allBold , ' is not even used in subclasses of ' , className , ' (#classVariablesNeverUsed)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
classVariablesNeverWritten
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    |cls notWrittenHere notWrittenAnyWhere anySubclass|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    cls := checkedClass theNonMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    notWrittenHere := cls classVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    notWrittenHere isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    self removeWrittenClassVariablesIn:cls from:notWrittenHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
    self removeWrittenClassVariablesIn:cls class from:notWrittenHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    notWrittenHere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
        notWrittenAnyWhere := notWrittenHere copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
        anySubclass := false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
        cls allSubclassesDo:[:eachSubclass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
            anySubclass := true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
            notWrittenAnyWhere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
                self removeWrittenClassVariablesIn:eachSubclass from:notWrittenAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
                self removeWrittenClassVariablesIn:eachSubclass class from:notWrittenAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
        notWrittenHere do:[:eachVariable |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
            |className|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
            className := cls name allBold.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
                rememberBadClass:cls
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
                info:('classVar ' , eachVariable allBold , ' is not set in ' , className , ' (#classVariablesNeverWritten)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
            (notWrittenAnyWhere includes:eachVariable) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
                self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
                    rememberBadClass:cls
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
                    info:('classVar ' , eachVariable allBold , ' is not even set in subclasses of ' , className , ' (#classVariablesNeverWritten)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
definesEqualButNotHash
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    (checkedClass includesSelector:#=) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
	(checkedClass includesSelector:#hash) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
		rememberBadClass:checkedClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
		info:(checkedClass name allBold, ' redefines #=, but not #hash (#definesEqualButNotHash)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
	]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
guardingClause
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    |detector|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    detector := ParseTreeLintRule guardingClause.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    detector runOnEnvironment: (Array with:checkedClass).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
self breakPoint:#cg.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
instanceVariablesNeverUsed
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    self instanceVariablesNeverUsedIn:checkedClass theNonMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
instanceVariablesNeverWritten
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    self instanceVariablesNeverWrittenIn:checkedClass theNonMetaclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
invalidKeyInImageResourceMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    Icon flushCachedIcons.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    checkedClass instAndClassSelectorsAndMethodsDo:[:sel :mthd | 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
        |img key name mclass|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
        (mthd hasImageResource) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
           ((mclass := mthd mclass) notNil and:[mclass isMeta]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
               img := mthd valueWithReceiver:(mclass theNonMetaclass) arguments:#().
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
               key := (Icon classVarAt:#KnownIcons) keyAtIdentityValue:img.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
               key notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
                   name := (mclass name , ' ', mthd selector).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
                   name ~= key ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
                       name := (mclass theNonMetaclass name , ' ', mthd selector).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
                       name ~= key ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
                           self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
                               rememberBadMethod:mthd 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
                               key:#invalidKeyInImageResourceMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
                               info:('key in constantNamed: does not match the method name')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
                       ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
                   ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
               ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
           ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
        ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
messageNeverSent
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    "/ old code: (slow)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
"/    checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
"/        (self anySendsOf:mSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
"/            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
"/                rememberBadMethod:method 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
"/                info:('#' , mSelector , ' is nowhere sent (#messageNeverSent)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
"/        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
"/    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    |selectorsOfInterest|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    selectorsOfInterest := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |  selectorsOfInterest add:mSelector].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    (self messagesNeverSentIn:selectorsOfInterest) do:[:eachNeverSent |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
	self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
	    rememberBadMethod:(checkedClass compiledMethodAt:eachNeverSent) 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
	    key:#messageNeverSent
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
	    info:('#' , eachNeverSent allBold, ' is nowhere sent (#messageNeverSent)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    "Modified: / 18.8.2000 / 22:54:45 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
messageNeverSentAndNotUsedAsSymbol
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    |selectorsOfInterest|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    selectorsOfInterest := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |  selectorsOfInterest add:mSelector].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    (self messagesNeverSentAndNotUsedAsSymbolIn:selectorsOfInterest) do:[:eachNeverSent |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
	self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
	    rememberBadMethod:(checkedClass compiledMethodAt:eachNeverSent) 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
	    key:#messageNeverSentAndNotUsedAsSymbol
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
	    info:('#' , eachNeverSent allBold, ' is nowhere sent and selector-symbol not used in any method (#messageNeverSentAndNotUsedAsSymbol)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
    "Modified: / 18.8.2000 / 23:10:56 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
parseMethod:method in:aClass withParserDo:aBlock onErrorDo:errorBlock
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    |source parser|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    source := method source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    parser := Parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
                parseMethod:source
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
                in:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
                ignoreErrors:true
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
                ignoreWarnings:true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    (parser notNil and:[parser ~~ #Error]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
        aBlock value:parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    ] ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
        errorBlock value
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    "Created: / 18-05-2010 / 15:17:19 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
sendsObsoleteMessages
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    obsoleteWarners isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
        obsoleteWarners := Object selectors select:[:each | each startsWith:'obsoleteMethodWarning'].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    allObsoleteMethods isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
        allObsoleteMethods := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
        Method allSubInstancesDo:[:eachMethod | |lits selector|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
                ((lits := eachMethod literals) notNil
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
                and:[lits includesAny:obsoleteWarners]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
                     (eachMethod messagesSent includesAny:obsoleteWarners) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
                        selector := eachMethod selector.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
                        selector notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
                            allObsoleteMethods add:selector.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
                        ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
                    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
                ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
            ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
        "/ manually patchup; there are some which should not be considered as bad ...
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
        allObsoleteMethods removeAllFoundIn:#( #','  #'at:'  #'at:put:'  #'raise').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
        allObsoleteMethods removeAllFoundIn:#( #'asText').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
        allObsoleteMethods removeAllFoundIn:obsoleteWarners.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    checkedClass instAndClassSelectorsAndMethodsDo:[:sel :mthd | 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
        |lits sentMessages whichOnes pT searcher nodes|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
        ((lits := mthd literals) notNil
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
        and:[lits includesAny:allObsoleteMethods]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
            sentMessages := mthd messagesSent.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
            (sentMessages includesAny:allObsoleteMethods) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
                whichOnes := sentMessages select:[:each | allObsoleteMethods includes:each].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
                (RBParser notNil
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
                and:[RBParser isLoaded]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
                    "/ lets look at this a bit more detailed;
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
                    "/ parse it and see if we can filter out any messages 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
                    "/ (i.e. look if we can figure out the receiver type)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
"/                    pT := RBParser 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
"/                            parseMethod: (mthd source)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
"/                            onError: [:aString :pos | nil].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
"/                    pT notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
"/                        searcher := ParseTreeSearcher 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
"/                                        allMessageSendsMatchingAny:whichOnes ignoreCase:false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
"/                        nodes := searcher executeTree:pT initialAnswer:(OrderedCollection new).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
"/                        nodes := nodes 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
"/                            select:
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
"/                                [:aSendNode |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
"/                                    self halt.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
"/                                ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
"/                        whichOnes := nodes collect:[:aSendNode | aSendNode selector].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
"/                    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
                ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
                whichOnes asOrderedCollection sort do:[:eachObsoleteMessage |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
                    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
                        rememberBadMethod:mthd 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
                        key:#sendsObsoleteMessages
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
                        info:('possibly sends an obsolete message: ' , eachObsoleteMessage , ' (#sendsObsoleteMessages)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
                ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
            ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
        ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
sendsObsoleteMethodWarningButNotTaggedAsObsoleteOrViceVersa
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    |obsoleteWarners|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    obsoleteWarners := #( #'obsoleteMethodWarning' #'obsoleteMethodWarning:' ).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    checkedClass instAndClassSelectorsAndMethodsDo:[:sel :mthd | 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
        |lits sentMessages whichOnes pT searcher nodes|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
        ((lits := mthd literals) notNil
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
        and:[lits includesAny:obsoleteWarners]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
            mthd isObsolete ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
                self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
                    rememberBadMethod:mthd 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
                    key:#sendsObsoleteMethodWarningButNotTaggedAsObsoleteOrViceVersa
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
                    info:('sends obsoleteMethodWarning but not tagged as obsolete')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
            ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
        ] ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
            mthd isObsolete ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
                self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
                    rememberBadMethod:mthd 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
                    key:#sendsObsoleteMethodWarningButNotTaggedAsObsoleteOrViceVersa
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
                    info:('tagged as obsolete but does not send an obsoleteMethodWarning')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
            ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
sentNotImplemented
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
    |alreadyChecked alreadyCheckedSelf alreadyCheckedSuper|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
    alreadyChecked := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
    alreadyCheckedSelf := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
    alreadyCheckedSuper := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
    checkedClass methodDictionary keysAndValuesDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
	|sentSelectors selfSelectors superSelectors selectorsNoWhereImplemented|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
	selectorsNoWhereImplemented := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
	sentSelectors := method messagesSent.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
	sentSelectors do:[:eachSelector |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
	    (alreadyChecked includes:eachSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
		(self anyImplementationOf:eachSelector) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
		    alreadyChecked add:eachSelector
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
		] ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
		    selectorsNoWhereImplemented add:eachSelector.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
		    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
			rememberBadMethod:method 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
			key:#sentNotImplemented
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
			info:('#' , eachSelector allBold, ' is nowhere implemented (#sentNotImplemented)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
		]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
	selfSelectors := method messagesSentToSelf.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
	selfSelectors do:[:eachSelector |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
	    (selectorsNoWhereImplemented includes:eachSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
		(alreadyCheckedSelf includes:eachSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
		    (self anyImplementationOf:eachSelector inOrAbove:checkedClass) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
			alreadyCheckedSelf add:eachSelector
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
		    ] ifFalse:[            
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
			self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
			    rememberBadMethod:method 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
			    key:#sentNotImplemented
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
			    info:('#' , eachSelector allBold, ' is not implemented in the class (#sentNotImplemented)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
		    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
		]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
        
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
	superSelectors := method messagesSentToSuper.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
	superSelectors do:[:eachSelector |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
	    (selectorsNoWhereImplemented includes:eachSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
		(alreadyCheckedSuper includes:eachSelector) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
		    (self anyImplementationOf:eachSelector inOrAbove:(checkedClass superclass)) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
			alreadyCheckedSuper add:eachSelector
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
		    ] ifFalse:[            
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
			self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
			    rememberBadMethod:method 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
			    key:#sentNotImplemented
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
			    info:('#' , eachSelector allBold, ' is not implemented in any superclass (#sentNotImplemented)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
		    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
		]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
subclassResponsibilityNotDefined
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
    |classesInBetween|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
    checkedClass allSuperclasses do:[:eachSuperClass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
	eachSuperClass methodDictionary keysAndValuesDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
	    (method referencesLiteral:#subclassResponsibility) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
		"/ parse it to see if it really does ...
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
		(method sends:#subclassResponsibility) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
		    "/ ok, got one;
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
		    "/ now, see if it is defined below this superClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
		    classesInBetween := checkedClass withAllSuperclasses copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
		    classesInBetween removeAll:(eachSuperClass withAllSuperclasses).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
		    (self anyImplementationOf:mSelector in:classesInBetween) ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
			(self methodShouldBeIgnoredInSubclassResponsibilityNotDefined:method)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
			ifFalse:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
			    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
				rememberBadMethod:method 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
				key:#subclassResponsibilityNotDefined
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
				info:(checkedClass name allBold , ' should redefine the #' , mSelector allBold , ' method (#subclassResponsibilityNotDefined)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
			].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
		    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
		]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
	]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
unusedClassVariables
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
    |remainingVars|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
    remainingVars := checkedClass theNonMetaclass classVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    checkedClass theNonMetaclass withAllSubclassesDo:[:eachClassToCheck |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
        eachClassToCheck instAndClassMethodsDo:[:method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
                parseMethod:method in:method mclass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
                withParserDo:[:parser |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
                    remainingVars removeAllFoundIn:(parser usedClassVars)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
                ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
                onErrorDo:[]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
    remainingVars asSortedCollection do:[:eachVar |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
        self rememberBadClass:checkedClass info:'Unused class variable: ',eachVar
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
    "Created: / 18-05-2010 / 14:37:42 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
unusedInstanceVariables
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
    |remainingVars|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
    remainingVars := checkedClass theNonMetaclass instVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
    checkedClass theNonMetaclass withAllSubclassesDo:[:eachClassToCheck |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
        eachClassToCheck methodDictionary keysAndValuesDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
                parseMethod:method in:eachClassToCheck 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
                withParserDo:[:parser |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
                    remainingVars removeAllFoundIn:(parser usedInstVars)
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
                ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
                onErrorDo:[]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
    remainingVars asSortedCollection do:[:eachVar |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
        self rememberBadClass:checkedClass info:'Unused instance variable: ',eachVar
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
    "Created: / 18-05-2010 / 14:32:09 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
!ClassChecker methodsFor:'helpers'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
anyImplementationOf:aSelector
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
    Smalltalk allClassesDo:[:eachClass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
	(eachClass theNonMetaclass includesSelector:aSelector) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
	(eachClass theMetaclass includesSelector:aSelector) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
    ^ false
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
anyImplementationOf:aSelector in:aCollectionOfClasses
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
    ^ aCollectionOfClasses 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
        contains:[:aClass | (aClass includesSelector:aSelector) ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
anyImplementationOf:aSelector inOrAbove:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
    aClass withAllSuperclassesDo:[:eachClass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
	(eachClass includesSelector:aSelector) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
    ^ false
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
anySendsOf:aSelector
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
    Smalltalk allMethodsDo:[:mthd |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
        (mthd sends:aSelector) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
    ^ false
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
checkProtocolOf:aMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
    |mClass mSelector protocol superClass implClass superProtocol|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
    mClass := aMethod mclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
    mSelector := aMethod selector.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
    mClass isNil ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
    mSelector isNil ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
    protocol := aMethod category.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
    protocol isNil ifTrue: [^true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
    superClass := mClass superclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
    superClass isNil ifTrue: [^true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
    implClass := superClass whichClassIncludesSelector:mSelector.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
    implClass isNil ifTrue: [^true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
    superProtocol := (implClass compiledMethodAt:mSelector) category.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
    superProtocol = protocol ifTrue: [^true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
    superProtocol isNil ifTrue: [^true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
        rememberBadMethod:aMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
        key:#checkProtocols
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
        info:('#' , mSelector allBold , ' is classified under "' , protocol allBold , '" in '
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
              , mClass name , ' and under "' , superProtocol allBold , '" in ' , implClass name
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
              , ' (#checkProtocols)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
    "Modified: / 18.8.2000 / 23:13:53 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
checkUnusedVariables:aMethod rememberReadInstVarsIn:readInstVars writtenInstVarsIn:writtenInstVars readClassVarsIn:readClassVars writtenClassVarsIn:writtenClassVars
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
    |p mClass sourceString|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
    sourceString := aMethod source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
    mClass := aMethod mclass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    p := Parser parseMethodSilent:sourceString in:mClass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
    readInstVars addAll:(p readInstVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
    writtenInstVars addAll:(p modifiedInstVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
    readClassVars addAll:(p readClassVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
    writtenClassVars addAll:(p modifiedClassVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
instanceVariablesNeverUsedIn:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    |notUsedHere notUsedAnyWhere anySubclass|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
    notUsedHere := aClass instVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
    notUsedHere isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
    self removeUsedInstanceVariablesIn:aClass from:notUsedHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
    notUsedHere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
        notUsedAnyWhere := notUsedHere copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
        anySubclass := false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
        aClass allSubclassesDo:[:eachSubclass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
            anySubclass := true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
            notUsedAnyWhere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
                self removeUsedInstanceVariablesIn:eachSubclass from:notUsedAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
        notUsedHere do:[:eachVariable |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
            |className|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
            className := aClass name allBold.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
                rememberBadClass:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
                info:('instVar ' , eachVariable allBold , ' is unused in ' , className , ' (#instanceVariablesNeverUsed)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
            anySubclass ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
                (notUsedAnyWhere includes:eachVariable) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
                    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
                        rememberBadClass:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
                        info:('instVar ' , eachVariable allBold , ' is not even used in subclasses of ' , className , ' (#instanceVariablesNeverUsed)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
                ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
instanceVariablesNeverWrittenIn:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
    |notWrittenHere notWrittenAnyWhere anySubclass|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
    notWrittenHere := aClass instVarNames asNewSet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
    notWrittenHere isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
    self removeWrittenInstanceVariablesIn:aClass from:notWrittenHere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
    notWrittenHere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
        notWrittenAnyWhere := notWrittenHere copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
        anySubclass := false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
        aClass allSubclassesDo:[:eachSubclass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
            anySubclass := true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
            notWrittenAnyWhere notEmpty ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
                self removeWrittenInstanceVariablesIn:eachSubclass from:notWrittenAnyWhere.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
        notWrittenHere do:[:eachVariable |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
            |className|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
            className := aClass name allBold.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
            self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
                rememberBadClass:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
                info:('instVar ' , eachVariable allBold , ' is nowhere set in ' , className , ' (#instanceVariablesNeverWritten)').
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
            anySubclass ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
                (notWrittenAnyWhere includes:eachVariable) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
                    self 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
                        rememberBadClass:aClass
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
                        info:('instVar ' , eachVariable allBold , ' is not even set in subclasses of ' , className , ' (#instanceVariablesNeverWritten)')
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
                ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
messagesNeverSentAndNotUsedAsSymbolIn:selectorsOfInterest
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
    |remaining toRemove checkBlock|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
    remaining := selectorsOfInterest asNewIdentitySet.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
    toRemove := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
    checkBlock := [:eachClass |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
        eachClass instAndClassSelectorsAndMethodsDo:[:mSel :mthd | |lits|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
            lits := mthd literals.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
            lits notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
                lits traverse:[:eachLiteral |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
                    eachLiteral isSymbol ifTrue:[        
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
                        remaining remove:eachLiteral ifAbsent:nil.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
                    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
                ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
                remaining isEmpty ifTrue:[^ remaining].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
        ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
    "/ start searching in the checkedClass - chances are high, we find some here
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
    checkBlock value:checkedClass.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
    checkedClass superclass notNil ifTrue:[checkBlock value:checkedClass superclass].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
    Smalltalk allClassesDo:checkBlock.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
    ^ remaining
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
    "Modified: / 18.8.2000 / 23:05:53 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
    "Created: / 18.8.2000 / 23:06:55 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
messagesNeverSentIn:selectorsOfInterest
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    |remaining|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
    remaining := selectorsOfInterest copy.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
    Smalltalk allMethodsDo:[:mthd |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
        |lits|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
        lits := mthd literals.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
        lits notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
            (lits includesAny:remaining) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
                remaining removeAllFoundIn:(mthd messagesSent).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
                remaining isEmpty ifTrue:[^ remaining].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
            ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
        ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
    ^ remaining
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
    "Created: / 18.8.2000 / 22:53:38 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
    "Modified: / 18.8.2000 / 22:56:59 / cg"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
methodShouldBeIgnoredInSubclassResponsibilityNotDefined:aMethod
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
    "a kludge for now - would like to have a pragma, resource or other
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
     way to mark such a method"
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
    aMethod == (Object compiledMethodAt:#implementedBySubclass) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
    aMethod == (Object compiledMethodAt:#readBinaryContentsFromData:manager:) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
    aMethod == (Object compiledMethodAt:#finalize) ifTrue:[^ true].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
    ^ false.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
rememberBadClass:class info:whatIsWrong
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
    |entry|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
    badClasses isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
	badClasses := IdentitySet new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
    badClasses add:class.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
    badClassInfo isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
	badClassInfo := IdentityDictionary new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
    entry := badClassInfo at:class ifAbsentPut:[ OrderedCollection new ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
    entry add:whatIsWrong.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
rememberBadMethod:method key:key info:whatIsWrong
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
    |entry|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
    badMethods isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
        badMethods := Set new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
    (badMethods includes:(method -> key)) ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
    badMethods add:(method -> key).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
    badMethodInfo isNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
        badMethodInfo := IdentityDictionary new.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
    entry := badMethodInfo at:method ifAbsentPut:[ OrderedCollection new ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
    entry add:whatIsWrong.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
rememberBadMethods:methods key:key info:whatIsWrong
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
    methods do:[:eachMethod |  
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
	self rememberBadMethod:eachMethod key:key info:whatIsWrong
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
removeUsedClassVariablesIn:aClass from:aCollectionOfVariablenames
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
    aClass selectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
	|src usedVars parser|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
	src := method source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
	src notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
	    parser := Parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
			    parseMethod:src 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
			    in:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
			    ignoreErrors:true 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
			    ignoreWarnings:true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
	    (parser notNil and:[parser ~~ #Error]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
		aCollectionOfVariablenames removeAllFoundIn:(parser usedClassVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
		aCollectionOfVariablenames isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   860
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
removeUsedInstanceVariablesIn:aClass from:aCollectionOfVariablenames
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   862
    aClass selectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
	|src usedVars parser|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   864
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   865
	src := method source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
	src notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
	    parser := Parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   868
			    parseMethod:src 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
			    in:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
			    ignoreErrors:true 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
			    ignoreWarnings:true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
	    (parser notNil and:[parser ~~ #Error]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
		aCollectionOfVariablenames removeAllFoundIn:(parser usedInstVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
		aCollectionOfVariablenames isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
removeWrittenClassVariablesIn:aClass from:aCollectionOfVariablenames
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
    aClass selectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
	|src usedVars parser|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
	src := method source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
	src notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
	    parser := Parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
			    parseMethod:src 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
			    in:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
			    ignoreErrors:true 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   891
			    ignoreWarnings:true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
	    (parser notNil and:[parser ~~ #Error]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
		aCollectionOfVariablenames removeAllFoundIn:(parser modifiedClassVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
		aCollectionOfVariablenames isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   898
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   899
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   900
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   901
removeWrittenInstanceVariablesIn:aClass from:aCollectionOfVariablenames
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
    aClass selectorsAndMethodsDo:[:mSelector :method |
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   903
	|src usedVars parser|
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   904
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
	src := method source.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
	src notNil ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
	    parser := Parser
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
			    parseMethod:src 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
			    in:aClass 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
			    ignoreErrors:true 
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
			    ignoreWarnings:true.
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
	    (parser notNil and:[parser ~~ #Error]) ifTrue:[
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
		aCollectionOfVariablenames removeAllFoundIn:(parser modifiedInstVars).
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   915
		aCollectionOfVariablenames isEmpty ifTrue:[^ self].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
	    ]
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
	].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
    ].
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
!ClassChecker class methodsFor:'documentation'!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
version
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
    ^ '$Header: /cvs/stx/stx/libtool/Tools__ClassChecker.st,v 1.21 2014-11-28 16:09:23 cg Exp $'
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   925
!
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   927
version_CVS
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   928
    ^ '$Header: /cvs/stx/stx/libtool/Tools__ClassChecker.st,v 1.21 2014-11-28 16:09:23 cg Exp $'
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
! !
9dca60fd646c class: Tools::ClassChecker
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930