Metaclass.st
author claus
Tue, 11 Apr 1995 16:52:00 +0200
changeset 326 d2902942491d
parent 314 7581a5c57224
child 328 7b542c0bf1dd
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Class subclass:#Metaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Kernel-Classes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
Metaclass comment:'
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    21
COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    22
	      All Rights Reserved
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
    23
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
    24
$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.23 1995-04-11 14:49:45 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    25
'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    27
!Metaclass class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
 COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    32
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
"
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
    45
$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.23 1995-04-11 14:49:45 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    47
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    48
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
documentation
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    50
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    51
    every classes class is a subclass of Metaclass.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    52
    Metaclass provides support for creating new (sub)classes and/or 
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    53
    changing the definition of an already existing class.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    54
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    55
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
!Metaclass methodsFor:'creating classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
name:newName inEnvironment:aSystemDictionary
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    60
	     subclassOf:aClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    61
	     instanceVariableNames:stringOfInstVarNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    62
	     variable:variableBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    63
	     words:wordsBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    64
	     pointers:pointersBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    65
	     classVariableNames:stringOfClassVarNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    66
	     poolDictionaries:stringOfPoolNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    67
	     category:categoryString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    68
	     comment:commentString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    69
	     changed:changed
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    71
    "this is the main workhorse for installing new classes - special care
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    72
     has to be taken, when changing an existing classes definition. In this
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    73
     case, some or all of the methods and subclasses methods have to be
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    74
     recompiled.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    75
     Also, the old class(es) are still kept (but not accessable as a global),
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    76
     to allow existing instances some life. 
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    77
     This might change in the future.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    78
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    79
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    |newClass newMetaclass nInstVars nameString classSymbol oldClass 
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
    81
     classVarChange instVarChange superClassChange newComment
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
    82
     changeSet1 changeSet2 addedNames
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
    83
     anyChange oldInstVars newInstVars oldClassVars newClassVars superFlags newFlags
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
    84
     currentProject|
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    85
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    86
    "NOTICE:
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    87
     this method is too complex and should be splitted into managable pieces ...
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    88
     I dont like it anymore :-) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    89
     (However, its a good test for the compilers ability to handle big, complex methods ;-)
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    90
    "
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    91
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    92
    newName = aClass name ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    93
	self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    94
	^ nil
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    95
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
    97
    "check for invalid subclassing of UndefinedObject and SmallInteger"
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
    98
    aClass canBeSubclassed ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    99
	self error:('it is not possible to subclass ' , aClass name).
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   100
	^ nil
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   101
    ].
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   102
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    nInstVars := stringOfInstVarNames countWords.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
    nameString := newName asString.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   105
    classSymbol := newName asSymbol.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
    newComment := commentString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   108
    "look, if it already exists as a class"
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   109
    oldClass := aSystemDictionary at:classSymbol ifAbsent:[nil].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   110
    oldClass isBehavior ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   111
	oldClass := nil.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   112
    ] ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   113
	oldClass superclass notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   114
	    oldClass allSuperclasses do:[:cls |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   115
		cls name = nameString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   116
		    self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   117
		    ^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   118
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   119
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   120
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   121
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   122
	aClass superclass notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   123
	    aClass allSuperclasses do:[:cls |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   124
		cls name = nameString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   125
		    self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   126
		    ^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   127
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   128
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   129
	].
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   130
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   131
	newComment isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   132
	    newComment := oldClass comment
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   133
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   134
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   135
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   136
	 warn, if it exists with different category and different instvars,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   137
	 and the existing is not an autoload class.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   138
	 Usually, this indicates that someone wants to create a new class with
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   139
	 a name, which already exists (it happened a few times to myself, while 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   140
	 I wanted to create a new class called ReturnNode ...).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   141
	 This will be much less of a problem, once multiple name spaces are
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   142
	 implemented and classes can be put into separate packages.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   143
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   144
	oldClass isLoaded ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   145
	    oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   146
		oldClass instanceVariableString asCollectionOfWords 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   147
		~= stringOfInstVarNames asCollectionOfWords ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   148
		    (self confirm:'a class named ' , oldClass name , ' already exists -
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   149
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   150
create (i.e. change) anyway ?' withCRs)
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   151
		    ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   152
			^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   153
		    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   154
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   155
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   156
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   159
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   160
     Check for some 'considered bad-style' things, like lower case names.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   161
     But only do these checks for new classes - 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   162
     - thus, once confirmed, the warnings will not come again and again.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   163
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   164
     NOTICE:
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   165
     I dont like the confirmers there - we need a notifying: argument, to give
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   166
     the outer codeview a chance to highlight the error.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   167
     (but thats how its defined in the book - maybe I will change anyway).
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   168
    "
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   169
    oldClass isNil ifTrue:[
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   170
	(self checkConventionsFor:newName 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   171
		    instVarNames:stringOfInstVarNames 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   172
		    classVarNames:stringOfClassVarNames) ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   173
	    ^ nil
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   174
	]
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   175
    ].
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   176
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    "create the metaclass first"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
    newMetaclass setSuperclass:(aClass class).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    newMetaclass instSize:(aClass class instSize).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   181
    newMetaclass setName:(nameString , 'class') asSymbol.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    newMetaclass classVariableString:'' "stringOfClassVarNames".
226
9287f8ace7ae set package
claus
parents: 202
diff changeset
   183
"/    newMetaclass setComment:newComment category:categoryString.
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   184
226
9287f8ace7ae set package
claus
parents: 202
diff changeset
   185
    Project notNil ifTrue:[
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   186
	currentProject := Project current.
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   187
        currentProject notNil ifTrue:[
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   188
	    newMetaclass package:(currentProject packageName)
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   189
	]
226
9287f8ace7ae set package
claus
parents: 202
diff changeset
   190
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   192
    "then let the new meta create the class"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
    newClass setSuperclass:aClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    newClass instSize:(aClass instSize + nInstVars).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   196
    newClass setName:classSymbol.
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   197
    newClass setComment:newComment category:categoryString.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   199
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   200
     Allowing non-booleans as variableBoolean
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   201
     is a hack for backward (ST-80) compatibility:
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   202
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   203
     ST-80 code will pass true or false as variableBoolean,
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   204
     while ST/X also calls it with symbols such as #float, #double etc.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   205
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
    (variableBoolean == true) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   207
	pointersBoolean ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   208
	    newFlags := Behavior flagPointers
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   209
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   210
	    wordsBoolean ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   211
		newFlags := Behavior flagWords
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   212
	    ] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   213
		newFlags := Behavior flagBytes
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   214
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   215
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   217
	(variableBoolean == #float) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   218
	    newFlags := Behavior flagFloats
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   219
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   220
	    (variableBoolean == #double) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   221
		newFlags := Behavior flagDoubles
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   222
	    ] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   223
		(variableBoolean == #long) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   224
		    newFlags := Behavior flagLongs
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   225
		] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   226
		    newFlags := Behavior flagNotIndexed   
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   227
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   228
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   229
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   231
    superFlags := aClass flags bitAnd:(Behavior maskIndexType bitInvert). "preserve other bits"
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   232
    oldClass notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   233
	oldClass isBuiltInClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   234
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   235
	     special care when redefining Method, Block and other built-in classes,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   236
	     which might have other flag bits ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   237
	    "
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   238
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   239
	    newFlags := newFlags bitOr:(oldClass flags bitAnd:(Behavior maskIndexType bitInvert))
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   240
	]
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   241
    ].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   242
    newClass flags:(newFlags bitOr:superFlags). "preserve  inherited special bits"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
    (nInstVars ~~ 0) ifTrue:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   245
	newClass setInstanceVariableString:stringOfInstVarNames
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
    oldClass notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   248
	"setting first will make new class clear obsolete classvars"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   249
	newClass setClassVariableString:(oldClass classVariableString)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
    newClass classVariableString:stringOfClassVarNames.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   253
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   254
     for new classes, we are almost done here
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   255
     (also for autoloaded classes)
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   256
    "
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   257
    (oldClass isNil or:[oldClass isLoaded not]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   258
	oldClass isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   259
	    self addChangeRecordForClass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   260
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   262
	commentString notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   263
	    newClass comment:commentString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   264
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   265
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   266
	aSystemDictionary at:classSymbol put:newClass.
314
7581a5c57224 *** empty log message ***
claus
parents: 308
diff changeset
   267
7581a5c57224 *** empty log message ***
claus
parents: 308
diff changeset
   268
	oldClass isNil ifTrue:[
326
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   269
	    Project notNil ifTrue:[
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   270
	        currentProject := Project current.
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   271
	        currentProject notNil ifTrue:[
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   272
		    "
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   273
		     new classes get the package assigned
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   274
		    "
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   275
		    newClass package:(currentProject packageName asSymbol)
d2902942491d *** empty log message ***
claus
parents: 314
diff changeset
   276
		]
314
7581a5c57224 *** empty log message ***
claus
parents: 308
diff changeset
   277
	    ].
7581a5c57224 *** empty log message ***
claus
parents: 308
diff changeset
   278
	].
7581a5c57224 *** empty log message ***
claus
parents: 308
diff changeset
   279
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   280
	aSystemDictionary changed:#newClass with:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   281
	^ newClass
2
claus
parents: 1
diff changeset
   282
    ].
claus
parents: 1
diff changeset
   283
10
claus
parents: 5
diff changeset
   284
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   285
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   286
     here comes the hard part - we are actually changing the
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   287
     definition of an existing class ....
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   288
     Try hard to get away WITHOUT recompiling, since it makes all
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   289
     compiled code into interpreted ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   290
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   291
10
claus
parents: 5
diff changeset
   292
    oldInstVars := oldClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   293
    newInstVars := newClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   294
    oldClassVars := oldClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   295
    newClassVars := newClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   296
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   297
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   298
     we are on the bright side of life, if the instance layout and
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   299
     inheritance do not change.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   300
     In this case, we can go ahead and patch the class object.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   301
    "
2
claus
parents: 1
diff changeset
   302
    (oldClass superclass == newClass superclass) ifTrue:[
claus
parents: 1
diff changeset
   303
      (oldClass instSize == newClass instSize) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   304
	(oldClass flags == newClass flags) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   305
	  (oldClass name = newClass name) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   306
	    (oldInstVars = newInstVars) ifTrue:[
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   307
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   308
	      (newComment ~= oldClass comment) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   309
		  oldClass setComment:newComment.        "writes a change-chunk"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   310
		  oldClass changed:#comment with:oldClass comment.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   311
		  self addChangeRecordForClassComment:oldClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   312
	      ]. 
10
claus
parents: 5
diff changeset
   313
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   314
	      (oldClassVars = newClassVars) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   315
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   316
		 really no change (just comment and/or category)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   317
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   318
		anyChange := false.
10
claus
parents: 5
diff changeset
   319
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   320
		oldClass setInstanceVariableString:(newClass instanceVariableString).
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   321
		oldClass setClassVariableString:(newClass classVariableString).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   322
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   323
		oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   324
		    oldClass category:categoryString. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   325
		    self addChangeRecordForClass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   326
		    "notify change of organization"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   327
		    aSystemDictionary changed:#organization
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   328
		].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   329
		"notify change of class"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   330
"/                oldClass changed.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   331
		^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   332
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   333
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   334
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   335
	       when we arrive here, class variables have changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   336
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   337
	      oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   338
		  "notify change of organization"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   339
		  oldClass category:categoryString. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   340
		  "notify change of organization"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   341
		  aSystemDictionary changed:#organization
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   342
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   343
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   344
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   345
	       set class variable string; 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   346
	       this also updates the set of class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   347
	       by creating new / deleting obsolete ones.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   348
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   349
	      oldClass classVariableString:stringOfClassVarNames.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   350
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   351
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   352
	       get the set of changed class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   353
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   354
	      changeSet1 := Set new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   355
	      oldClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   356
		  (newClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   357
		      changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   358
		  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   359
	      ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   360
	      newClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   361
		  (oldClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   362
		      changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   363
		  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   364
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   365
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   366
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   367
	       recompile all methods accessing set of changed classvars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   368
	       here and also in all subclasses ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   369
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   370
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   371
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   372
	       dont update change file for the recompilation
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   373
	      "
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   374
	      Class withoutUpdatingChangesDo:[
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   375
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   376
		  Transcript showCr:'recompiling class & inst methods accessing ' , changeSet1 printString.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   377
		  Transcript endEntry.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   378
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   379
		  oldClass withAllSubclasses do:[:aClass |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   380
		      aClass class recompileMethodsAccessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   381
		      aClass recompileMethodsAccessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   382
		  ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   383
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   384
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   385
	      "notify change of class"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   386
	      self addChangeRecordForClass:oldClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   387
	      oldClass changed:#definition.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   388
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   389
	      ^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   390
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   391
	  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   392
	]
2
claus
parents: 1
diff changeset
   393
      ]
claus
parents: 1
diff changeset
   394
    ].
claus
parents: 1
diff changeset
   395
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   396
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   397
     here we enter the darkness of mordor ...
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   398
     since instance variable layout and/or inheritance has changed.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   399
    "
2
claus
parents: 1
diff changeset
   400
    (newComment ~= oldClass comment) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   401
	newClass comment:newComment
2
claus
parents: 1
diff changeset
   402
    ].
claus
parents: 1
diff changeset
   403
claus
parents: 1
diff changeset
   404
    superClassChange := oldClass superclass ~~ newClass superclass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   406
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   407
     dont allow built-in classes to be modified this way
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   408
    "
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   409
    (oldClass notNil and:[oldClass isBuiltInClass and:[superClassChange]]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   410
	self error:'the inheritance of this class is fixed - you cannot change it'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   411
	^ oldClass
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   412
    ].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   413
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   414
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   415
     catch special case, where superclass changed its layout and thus
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   416
     forced redefinition of this class; 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   417
     only log if this is not the case.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   418
    "
2
claus
parents: 1
diff changeset
   419
    (superClassChange 
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   420
     and:[(oldClass superclass isNil or:[oldClass superclass name = newClass superclass name])
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   421
     and:[(oldClassVars = newClassVars) 
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   422
     and:[(oldInstVars = newInstVars)
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   423
     and:[newComment = oldClass comment]]]]) ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   424
	self addChangeRecordForClass:newClass.
2
claus
parents: 1
diff changeset
   425
    ].
claus
parents: 1
diff changeset
   426
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   427
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   428
     care for class methods ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   429
    "
2
claus
parents: 1
diff changeset
   430
    changeSet1 := Set new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
2
claus
parents: 1
diff changeset
   432
    classVarChange := false.
claus
parents: 1
diff changeset
   433
claus
parents: 1
diff changeset
   434
    superClassChange ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   435
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   436
	 superclass changed:
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   437
	 must recompile all class methods accessing ANY classvar
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   438
	 (
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   439
	  actually, we could be less strict and handle the case where
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   440
	  both the old and the new superclass have a common ancestor,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   441
	  and both have no new classvariables in between.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   442
	  This would speedup the case when a class is inserted into
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   443
	  the inheritance chain.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   444
	 )
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   445
	"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   447
	oldClass allClassVarNames do:[:nm | changeSet1 add:nm].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   448
	newClass allClassVarNames do:[:nm | changeSet1 add:nm].
2
claus
parents: 1
diff changeset
   449
claus
parents: 1
diff changeset
   450
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   451
	Transcript showCr:'recompiling class methods accessing any classvar'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   452
	Transcript endEntry.
2
claus
parents: 1
diff changeset
   453
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   454
	self copyInvalidatedMethodsFrom:(oldClass class) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   455
				    for:newMetaclass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   456
			   accessingAny:changeSet1
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   457
				orSuper:true.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   458
	newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
2
claus
parents: 1
diff changeset
   459
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   460
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   461
	 same superclass, find out which classvars have changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   462
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   463
	classVarChange := oldClassVars ~= newClassVars.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   464
	classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   465
	    oldClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   466
		(newClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   467
		    changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   468
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   469
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   470
	    newClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   471
		(oldClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   472
		    changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   473
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   474
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   475
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   477
	classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   478
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   479
	     must recompile some class-methods
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   480
	    "
2
claus
parents: 1
diff changeset
   481
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   482
	    Transcript showCr:'recompiling class methods accessing ' , changeSet1 printString.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   483
	    Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   484
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   485
	    self copyInvalidatedMethodsFrom:(oldClass class) for:newMetaclass accessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   486
	    newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   487
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   488
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   489
	     class methods still work
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   490
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   491
	    self copyMethodsFrom:(oldClass class) for:newMetaclass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   492
	].
2
claus
parents: 1
diff changeset
   493
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   495
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   496
     care for instance methods ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   497
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   498
2
claus
parents: 1
diff changeset
   499
    superClassChange ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   500
	"superclass changed,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   501
	 must recompile all methods accessing any class or instvar.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   502
	 If number of instvars (i.e. the instances instSize) is the same,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   503
	 we can limit the set of recompiled instance methods to those methods,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   504
	 which refer to an instvar with a different inst-index
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   505
	"
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   506
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   507
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   508
	 the changeset consists of instance variables, 
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   509
	 with a different position
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   510
	"
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   511
	changeSet2 := self differentInstanceVariableOffsetsIn:oldClass and:newClass.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   512
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   513
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   514
	 merge in the changed class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   515
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   516
	changeSet1 do:[:nm | changeSet2 add:nm].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   517
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   518
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   519
	Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   520
	Transcript endEntry.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   521
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   522
	self copyInvalidatedMethodsFrom:oldClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   523
				    for:newClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   524
			   accessingAny:changeSet2
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   525
				orSuper:true.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   526
	newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   527
2
claus
parents: 1
diff changeset
   528
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   529
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   530
	 same inheritance ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   531
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   532
	instVarChange := oldInstVars ~= newInstVars.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   533
	instVarChange ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   534
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   535
	     same instance variables ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   536
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   537
	    classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   538
		"recompile all inst methods accessing changed classvars"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
2
claus
parents: 1
diff changeset
   540
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   541
		Transcript showCr:'recompiling instance methods accessing ' , changeSet1 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   542
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   543
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   544
		self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   545
		newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   546
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   547
	] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   548
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   549
	     dont allow built-in classes to be modified
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   550
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   551
	    (oldClass notNil and:[oldClass isBuiltInClass and:[instVarChange]]) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   552
		self error:'the layout of this class is fixed - you cannot change it'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   553
		^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   554
	    ].
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   555
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   556
	    ((oldInstVars size == 0) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   557
	    or:[newInstVars startsWith:oldInstVars]) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   558
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   559
		 only new inst variable(s) has/have been added - 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   560
		 old methods still work (the existing inst-indices are still valid)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   561
		"
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   562
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   563
		Transcript showCr:'copying methods ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   564
		Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   565
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   566
		self copyMethodsFrom:oldClass for:newClass.
2
claus
parents: 1
diff changeset
   567
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   568
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   569
		 but: we have to recompile all methods accessing new instars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   570
		 (it might have been a classVar/global before ...)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   571
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   572
		addedNames := newInstVars select:[:nm | (oldInstVars includes:nm) not].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   573
		"merge in class variables"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   574
		changeSet1 do:[:nm | addedNames add:nm].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
2
claus
parents: 1
diff changeset
   576
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   577
		Transcript showCr:'recompiling instance methods accessing ' , addedNames printString ,  '...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   578
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   579
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   580
		newClass recompileMethodsAccessingAny:addedNames.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   581
	    ] ifFalse:[
2
claus
parents: 1
diff changeset
   582
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   583
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   584
		 the changeset consists of instance variables, 
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   585
		 with a different position
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   586
		"
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   587
		changeSet2 := self differentInstanceVariableOffsetsIn:oldClass and:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   589
		"merge in the class variables"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   590
		changeSet1 do:[:nm | changeSet2 add:nm].
2
claus
parents: 1
diff changeset
   591
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   592
		Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   593
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   594
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   595
		self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet2.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   596
		newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   597
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   598
	].
2
claus
parents: 1
diff changeset
   599
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   601
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   602
     WOW, everything done for this class
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   603
     what about subclasses ?
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   604
    "
2
claus
parents: 1
diff changeset
   605
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   606
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   607
     update superclass of immediate subclasses - 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   608
     this forces recompilation (recursively) if needed
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   609
     (dont update change file for the subclass changes)
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   610
    "
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   611
    Class withoutUpdatingChangesDo:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   612
	oldClass subclassesDo:[:aClass |
2
claus
parents: 1
diff changeset
   613
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   614
	    Transcript showCr:'changing superclass of:' , aClass name.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   615
	    Transcript endEntry.
2
claus
parents: 1
diff changeset
   616
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   617
	    aClass superclass:newClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   618
	]
2
claus
parents: 1
diff changeset
   619
    ].
claus
parents: 1
diff changeset
   620
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   621
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   622
     change category in oldClass - so we see immediately what it is ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   623
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   624
    oldClass category:'obsolete'.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   625
    oldClass class category:'obsolete'.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   626
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   627
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   628
     and make the new class globally known
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   629
    "
2
claus
parents: 1
diff changeset
   630
    aSystemDictionary at:classSymbol put:newClass.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   631
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   632
    oldClass category ~= categoryString ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   633
	"notify change of organization"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   634
	aSystemDictionary changed:#organization
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   635
    ].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   636
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   637
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   638
     Not becoming the old class creates some update problems;
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   639
     the browsers must check carefully - a simple identity compare is
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   640
     not enough ...
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   641
     QUESTION: is this a good idea ?
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   642
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   643
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   644
    newClass dependents:(oldClass dependents).
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   645
    newClass changed:#definition.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   646
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   647
    "just to make certain ... - tell dependents of oldClass, that something changed
85
claus
parents: 77
diff changeset
   648
     (systemBrowsers will react on this, and update their views)"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   649
    oldClass changed:#definition with:newClass.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   650
2
claus
parents: 1
diff changeset
   651
    ObjectMemory flushCaches.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   652
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
new
2
claus
parents: 1
diff changeset
   657
    "create & return a new metaclass (a classes class)"
claus
parents: 1
diff changeset
   658
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
    newClass setSuperclass:(Object class)
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   663
		 selectors:(Array new:0)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   664
		   methods:(Array new:0)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   665
		  instSize:0
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   666
		     flags:(Behavior flagNotIndexed).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   667
"/    newClass setComment:(self comment) category:(self category).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
!Metaclass methodsFor:'class instance variables'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
instanceVariableNames:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
    "changing / adding class-inst vars -
251
claus
parents: 226
diff changeset
   675
     this actually creates a new metaclass and class, leaving the original
claus
parents: 226
diff changeset
   676
     classes around as obsolete classes. This may also be true for all subclasses,
claus
parents: 226
diff changeset
   677
     if class instance variables are added/removed.
claus
parents: 226
diff changeset
   678
     Existing instances continue to be defined by their original classes.
claus
parents: 226
diff changeset
   679
claus
parents: 226
diff changeset
   680
     Time will show, if this is an acceptable behavior or if we should migrate
claus
parents: 226
diff changeset
   681
     instances to become insts. of the new classes."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
    |newClass newMetaclass nClassInstVars oldClass 
2
claus
parents: 1
diff changeset
   684
     allSubclasses t oldVars
claus
parents: 1
diff changeset
   685
     oldNames newNames addedNames
claus
parents: 1
diff changeset
   686
     oldOffsets newOffsets offset changeSet delta
251
claus
parents: 226
diff changeset
   687
     oldToNew newSubMeta newSub oldSubMeta oldSuper
claus
parents: 226
diff changeset
   688
     commonClassInstVars|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   690
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   691
     cleanup needed here: extract common things with name:inEnvironment:...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   692
     and restructure things ... currently way too complex.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   693
    "
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   694
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
    oldVars := self instanceVariableString.
2
claus
parents: 1
diff changeset
   696
    aString = oldVars ifTrue:[
claus
parents: 1
diff changeset
   697
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   698
	Transcript showCr:'no change (', oldVars , ') -> (', aString , ')'.
2
claus
parents: 1
diff changeset
   699
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   700
	^ self
2
claus
parents: 1
diff changeset
   701
    ].
claus
parents: 1
diff changeset
   702
claus
parents: 1
diff changeset
   703
    oldNames := oldVars asCollectionOfWords.
claus
parents: 1
diff changeset
   704
    newNames := aString asCollectionOfWords.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
2
claus
parents: 1
diff changeset
   706
    oldNames = newNames ifTrue:[
claus
parents: 1
diff changeset
   707
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   708
	Transcript showCr:'no real change'.
2
claus
parents: 1
diff changeset
   709
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   710
	"no real change (just formatting)"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   711
	self setInstanceVariableString:aString.
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   712
	^ self
2
claus
parents: 1
diff changeset
   713
    ]. 
claus
parents: 1
diff changeset
   714
251
claus
parents: 226
diff changeset
   715
"/    "
claus
parents: 226
diff changeset
   716
"/     let user confirm, if any name is no good (and was good before)
claus
parents: 226
diff changeset
   717
"/    "
claus
parents: 226
diff changeset
   718
"/    (oldNames inject:true
claus
parents: 226
diff changeset
   719
"/                into:[:okSoFar :word |
claus
parents: 226
diff changeset
   720
"/                         okSoFar and:[word first isUppercase]
claus
parents: 226
diff changeset
   721
"/                     ])
claus
parents: 226
diff changeset
   722
"/    ifTrue:[
claus
parents: 226
diff changeset
   723
"/        "was ok before"
claus
parents: 226
diff changeset
   724
"/        (newNames inject:true
claus
parents: 226
diff changeset
   725
"/                    into:[:okSoFar :word |
claus
parents: 226
diff changeset
   726
"/                             okSoFar and:[word first isUppercase]
claus
parents: 226
diff changeset
   727
"/                         ])
claus
parents: 226
diff changeset
   728
"/        ifFalse:[
claus
parents: 226
diff changeset
   729
"/            (self confirm:'class instance variable names should start with an uppercase letter
claus
parents: 226
diff changeset
   730
"/(by convention only)
claus
parents: 226
diff changeset
   731
"/
claus
parents: 226
diff changeset
   732
"/install anyway ?' withCRs)
claus
parents: 226
diff changeset
   733
"/            ifFalse:[
claus
parents: 226
diff changeset
   734
"/                ^ nil
claus
parents: 226
diff changeset
   735
"/            ]
claus
parents: 226
diff changeset
   736
"/        ]
claus
parents: 226
diff changeset
   737
"/    ].
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   738
2
claus
parents: 1
diff changeset
   739
    nClassInstVars := newNames size.
claus
parents: 1
diff changeset
   740
claus
parents: 1
diff changeset
   741
"
claus
parents: 1
diff changeset
   742
    Transcript showCr:'create new class/metaclass'.
claus
parents: 1
diff changeset
   743
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
251
claus
parents: 226
diff changeset
   745
    "
claus
parents: 226
diff changeset
   746
     create the new metaclass
claus
parents: 226
diff changeset
   747
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
    newMetaclass setSuperclass:superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
    newMetaclass instSize:(superclass instSize + nClassInstVars).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
    (nClassInstVars ~~ 0) ifTrue:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   752
	newMetaclass setInstanceVariableString:aString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
    ].
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   754
    newMetaclass flags:(Behavior flagNotIndexed).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
    newMetaclass setName:name.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
    newMetaclass classVariableString:classvars.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
    newMetaclass category:category.
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   758
    newMetaclass setComment:(self comment).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
    "find the class which is my sole instance"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
    t := Smalltalk allClasses select:[:element | element class == self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
    (t size ~~ 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   764
	self error:'oops - I should have exactly one instance'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   765
	^ nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
    oldClass := t anElement.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   768
251
claus
parents: 226
diff changeset
   769
    "
claus
parents: 226
diff changeset
   770
     create the new class
claus
parents: 226
diff changeset
   771
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   772
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
    newClass setSuperclass:(oldClass superclass).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
    newClass instSize:(oldClass instSize).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
    newClass flags:(oldClass flags).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
    newClass setName:(oldClass name).
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   777
    newClass setInstanceVariableString:(oldClass instanceVariableString).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
    newClass classVariableString:(oldClass classVariableString).
2
claus
parents: 1
diff changeset
   779
    newClass setComment:(oldClass comment).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
    newClass category:(oldClass category).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
2
claus
parents: 1
diff changeset
   782
    changeSet := Set new.
claus
parents: 1
diff changeset
   783
    ((oldNames size == 0) 
claus
parents: 1
diff changeset
   784
    or:[newNames startsWith:oldNames]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   785
	"new variable(s) has/have been added - old methods still work"
2
claus
parents: 1
diff changeset
   786
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   787
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   788
	Transcript showCr:'copying methods ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   789
	Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   790
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   791
	self copyMethodsFrom:self for:newMetaclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   792
	self copyMethodsFrom:oldClass for:newClass.
2
claus
parents: 1
diff changeset
   793
251
claus
parents: 226
diff changeset
   794
	"
claus
parents: 226
diff changeset
   795
	 but have to recompile methods accessing stuff now defined
claus
parents: 226
diff changeset
   796
	 (it might have been a global before ...)
claus
parents: 226
diff changeset
   797
	"
2
claus
parents: 1
diff changeset
   798
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   799
	addedNames := newNames select:[:nm | (oldNames includes:nm) not].
251
claus
parents: 226
diff changeset
   800
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   801
	Transcript showCr:'recompiling methods accessing ' , addedNames printString ,  '...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   802
	Transcript endEntry.
251
claus
parents: 226
diff changeset
   803
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   804
	"recompile class-methods"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   805
	newMetaclass recompileMethodsAccessingAny:addedNames.
2
claus
parents: 1
diff changeset
   806
    ] ifFalse:[
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   807
	"
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   808
	 create the changeSet; thats the set of class instvar names
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   809
	 which have changed their position or are new
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   810
	"
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   811
	offset := 0. oldOffsets := Dictionary new.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   812
	oldNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   813
	offset := 0. newOffsets := Dictionary new.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   814
	newNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   815
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   816
	oldOffsets associationsDo:[:a |
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   817
	    |k|
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   818
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   819
	    k := a key.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   820
	    (newOffsets includesKey:k) ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   821
		changeSet add:k
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   822
	    ] ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   823
		(a value ~~ (newOffsets at:k)) ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   824
		    changeSet add:k
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   825
		]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   826
	    ]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   827
	].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   828
	newOffsets associationsDo:[:a |
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   829
	    |k|
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   830
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   831
	    k := a key.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   832
	    (oldOffsets includesKey:k) ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   833
		changeSet add:k
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   834
	    ] ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   835
		(a value ~~ (oldOffsets at:k)) ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   836
		    changeSet add:k
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   837
		]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   838
	    ]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   839
	].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   840
251
claus
parents: 226
diff changeset
   841
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   842
	Transcript showCr:'recompiling methods accessing ' , changeSet printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   843
	Transcript endEntry.
251
claus
parents: 226
diff changeset
   844
" "
claus
parents: 226
diff changeset
   845
	"
claus
parents: 226
diff changeset
   846
	 recompile class-methods
claus
parents: 226
diff changeset
   847
	"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   848
	self copyInvalidatedMethodsFrom:self for:newMetaclass accessingAny:changeSet.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   849
	newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   850
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   851
	self copyMethodsFrom:oldClass for:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   852
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   853
2
claus
parents: 1
diff changeset
   854
    delta := newNames size - oldNames size.
claus
parents: 1
diff changeset
   855
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   856
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   857
     get list of all subclasses - do before superclass is changed
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   858
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   859
    allSubclasses := oldClass allSubclasses.
2
claus
parents: 1
diff changeset
   860
    allSubclasses := allSubclasses asSortedCollection:[:a :b |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   861
				b isSubclassOf:a
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   862
		     ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   863
2
claus
parents: 1
diff changeset
   864
    oldToNew := IdentityDictionary new.
claus
parents: 1
diff changeset
   865
251
claus
parents: 226
diff changeset
   866
    "
claus
parents: 226
diff changeset
   867
     create a new class tree, based on new version
claus
parents: 226
diff changeset
   868
    "
2
claus
parents: 1
diff changeset
   869
    allSubclasses do:[:aSubclass |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   870
	oldSuper := aSubclass superclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   871
	oldSubMeta := aSubclass class.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   872
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   873
	newSubMeta := Metaclass new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   874
	oldSuper == oldClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   875
	    newSubMeta setSuperclass:newMetaclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   876
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   877
	    newSubMeta setSuperclass:(oldToNew at:oldSuper) class.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   878
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   879
	newSubMeta instSize:(oldSubMeta instSize + delta).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   880
	newSubMeta flags:(oldSubMeta flags).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   881
	newSubMeta setName:(oldSubMeta name).
251
claus
parents: 226
diff changeset
   882
	newSubMeta setInstanceVariableString:(oldSubMeta instanceVariableString).
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   883
	newSubMeta classVariableString:(oldSubMeta classVariableString).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   884
	newSubMeta setComment:(oldSubMeta comment).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   885
	newSubMeta category:(oldSubMeta category).
2
claus
parents: 1
diff changeset
   886
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   887
	newSub := newSubMeta new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   888
	oldSuper == oldClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   889
	    newSub setSuperclass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   890
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   891
	    newSub setSuperclass:(oldToNew at:oldSuper).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   892
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   893
	newSub setSelectorArray:(aSubclass selectorArray).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   894
	newSub setMethodArray:(aSubclass methodArray).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   895
	newSub setName:(aSubclass name).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   896
	newSub classVariableString:(aSubclass classVariableString).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   897
	newSub setComment:(aSubclass comment).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   898
	newSub category:(aSubclass category).
2
claus
parents: 1
diff changeset
   899
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   900
	oldToNew at:aSubclass put:newSub.
2
claus
parents: 1
diff changeset
   901
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   902
	aSubclass category:'obsolete'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   903
	aSubclass class category:'obsolete'.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   904
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   905
2
claus
parents: 1
diff changeset
   906
    "recompile what needs to be"
claus
parents: 1
diff changeset
   907
claus
parents: 1
diff changeset
   908
    delta == 0 ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   909
	"only have to recompile class methods accessing 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   910
	 class instvars from changeset
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   911
	"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   912
251
claus
parents: 226
diff changeset
   913
	allSubclasses do:[:oldSubclass |
claus
parents: 226
diff changeset
   914
	    |newSubclass|
claus
parents: 226
diff changeset
   915
claus
parents: 226
diff changeset
   916
	    newSubclass := oldToNew at:oldSubclass.
claus
parents: 226
diff changeset
   917
claus
parents: 226
diff changeset
   918
Transcript showCr:'recompiling class methods of ' , newSubclass class name ,
claus
parents: 226
diff changeset
   919
		  ' accessing any of ' , changeSet printString.
claus
parents: 226
diff changeset
   920
claus
parents: 226
diff changeset
   921
	    newSubclass class recompileMethodsAccessingAny:changeSet.
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   922
	]
2
claus
parents: 1
diff changeset
   923
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   924
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   925
	 have to recompile all class methods accessing class instvars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   926
	"
251
claus
parents: 226
diff changeset
   927
	commonClassInstVars := oldClass class allInstVarNames.
claus
parents: 226
diff changeset
   928
	changeSet do:[:v |
claus
parents: 226
diff changeset
   929
	    commonClassInstVars remove:v ifAbsent:[]
claus
parents: 226
diff changeset
   930
	].
2
claus
parents: 1
diff changeset
   931
251
claus
parents: 226
diff changeset
   932
	allSubclasses do:[:oldSubclass |
claus
parents: 226
diff changeset
   933
	    |newSubclass classInstVars|
claus
parents: 226
diff changeset
   934
claus
parents: 226
diff changeset
   935
	    newSubclass := oldToNew at:oldSubclass.
2
claus
parents: 1
diff changeset
   936
251
claus
parents: 226
diff changeset
   937
	    classInstVars := newSubclass class allInstVarNames asSet.
claus
parents: 226
diff changeset
   938
	    classInstVars removeAll:commonClassInstVars.
claus
parents: 226
diff changeset
   939
	    classInstVars addAll:changeSet.
claus
parents: 226
diff changeset
   940
claus
parents: 226
diff changeset
   941
Transcript showCr:'recompiling class methods of ' , newSubclass class name ,
claus
parents: 226
diff changeset
   942
		  ' accessing any of ' , classInstVars printString.
claus
parents: 226
diff changeset
   943
claus
parents: 226
diff changeset
   944
	    newSubclass class recompileMethodsAccessingAny:classInstVars.
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   945
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   946
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   947
2
claus
parents: 1
diff changeset
   948
    self addChangeRecordForClassInstvars:newClass.
claus
parents: 1
diff changeset
   949
claus
parents: 1
diff changeset
   950
    "install all new classes"
claus
parents: 1
diff changeset
   951
claus
parents: 1
diff changeset
   952
    Smalltalk at:(oldClass name asSymbol) put:newClass.
claus
parents: 1
diff changeset
   953
    ObjectMemory flushCachesFor:oldClass.
251
claus
parents: 226
diff changeset
   954
claus
parents: 226
diff changeset
   955
    allSubclasses do:[:oldClass |
claus
parents: 226
diff changeset
   956
	|newClass|
claus
parents: 226
diff changeset
   957
claus
parents: 226
diff changeset
   958
	newClass := oldToNew at:oldClass.
claus
parents: 226
diff changeset
   959
"
claus
parents: 226
diff changeset
   960
Transcript showCr:'install ' , newClass name , '(' , newClass category , ')' ,
claus
parents: 226
diff changeset
   961
		  ' as ' , newClass name.
claus
parents: 226
diff changeset
   962
"
claus
parents: 226
diff changeset
   963
	Smalltalk at:newClass name asSymbol put:newClass.
claus
parents: 226
diff changeset
   964
	ObjectMemory flushCachesFor:oldClass.
2
claus
parents: 1
diff changeset
   965
    ].
claus
parents: 1
diff changeset
   966
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   967
    "tell dependents ..."
10
claus
parents: 5
diff changeset
   968
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   969
    oldClass changed:#definition.
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
   970
    self changed:#definition.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   971
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   972
    ^ newMetaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   973
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   974
a27a279701f8 Initial revision
claus
parents:
diff changeset
   975
!Metaclass methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   976
a27a279701f8 Initial revision
claus
parents:
diff changeset
   977
isMeta
a27a279701f8 Initial revision
claus
parents:
diff changeset
   978
    "return true, if the receiver is some kind of metaclass;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   979
     true is returned here. Redefines isMeta in Object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   980
a27a279701f8 Initial revision
claus
parents:
diff changeset
   981
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   983
a27a279701f8 Initial revision
claus
parents:
diff changeset
   984
!Metaclass methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   986
invalidMethod
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   987
    "When recompiling classes after a definition-change, all
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   988
     uncompilable methods will be bound to this method here,
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   989
     so that evaluating such an uncompilable method will trigger an error.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   990
     Can also happen when Compiler/runtime system is broken."
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   991
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   992
    self error:'invalid method - this method failed to compile when the class was changed'
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   993
!
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   994
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   995
differentInstanceVariableOffsetsIn:class1 and:class2
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   996
    "return a set of instance variable names which have different
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   997
     positions in class1 and class2.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   998
     Also, variables which are only present in one class are returned.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
   999
     This is used to find methods which need recompilation after a
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1000
     change in the instance variables."
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1001
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1002
    |offsets1 offsets2 changeSet|
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1003
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1004
    changeSet := Set new.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1005
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1006
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1007
     collect the instvar-indices in the old and new class
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1008
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1009
    offsets1 := class1 instanceVariableOffsets.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1010
    offsets2 := class2 instanceVariableOffsets.
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1011
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1012
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1013
     the changeset consists of instance variables, 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1014
     with a different position
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1015
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1016
    offsets1 keysAndValuesDo:[:varName :varIndex |
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1017
	(offsets2 includesKey:varName) ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1018
	    changeSet add:varName 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1019
	] ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1020
	    (varIndex ~~ (offsets2 at:varName)) ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1021
		changeSet add:varName 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1022
	    ]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1023
	]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1024
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1025
    offsets2 keysAndValuesDo:[:varName :varIndex |
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1026
	(offsets1 includesKey:varName) ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1027
	    changeSet add:varName
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1028
	] ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1029
	    (varIndex ~~ (offsets1 at:varName)) ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1030
		changeSet add:varName
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1031
	    ]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1032
	]
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1033
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1034
    ^ changeSet
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1035
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1036
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1037
     View class 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1038
	differentInstanceVariableOffsetsIn:View
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1039
				       and:StandardSystemView
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1040
     View class 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1041
	differentInstanceVariableOffsetsIn:Object 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1042
				       and:Point 
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1043
    "
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1044
!
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1045
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1046
copyMethodsFrom:oldClass for:newClass
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1047
    "copy all methods from oldClass to newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1048
     This is used for class-methods when a class has changed, but metaclass is 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1049
     unaffected (i.e. classVars/inheritance have not changed) so there is no need
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1050
     to recompile the class methods."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1051
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1052
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1053
	       methods:(oldClass methodArray copy)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1054
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1055
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1056
copyInvalidatedMethodsFrom:oldClass for:newClass
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1057
    "copy all methods from oldClass to newClass and change their code
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1058
     to a trap method reporting an error.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1059
     This is used when a class has been changed its layout or inheritance,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1060
     for all methods; before recompilation is attempted.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1061
     This allows us to keep the source while trapping uncompilable (due to
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1062
     now undefined instvars) methods. Compilation of these methods will show
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1063
     an error on the transcript and lead to the debugger once called."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1064
251
claus
parents: 226
diff changeset
  1065
    |trap trapCode trapByteCode oldMethod newMethod oldMethodArray newMethodArray|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1066
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1067
    trap := Metaclass compiledMethodAt:#invalidMethod.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1068
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1069
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1070
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1071
    oldMethodArray := oldClass methodArray.
2
claus
parents: 1
diff changeset
  1072
    newMethodArray := Array new:(oldMethodArray size).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1073
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1074
	       methods:newMethodArray.
2
claus
parents: 1
diff changeset
  1075
    1 to:oldMethodArray size do:[:i |
251
claus
parents: 226
diff changeset
  1076
	oldMethod := oldMethodArray at:i.
claus
parents: 226
diff changeset
  1077
	oldMethod isWrapped ifTrue:[
claus
parents: 226
diff changeset
  1078
	    oldMethod := oldMethod originalMethod
claus
parents: 226
diff changeset
  1079
	].
claus
parents: 226
diff changeset
  1080
	newMethod := oldMethod copy.
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1081
	newMethod code:trapCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1082
	newMethod literals:nil.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1083
	newMethod byteCode:trapByteCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1084
	newMethodArray at:i put:newMethod
2
claus
parents: 1
diff changeset
  1085
    ]
claus
parents: 1
diff changeset
  1086
!
claus
parents: 1
diff changeset
  1087
claus
parents: 1
diff changeset
  1088
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames
claus
parents: 1
diff changeset
  1089
    "copy all methods from oldClass to newClass. Those methods accessing
claus
parents: 1
diff changeset
  1090
     a variable in setOfNames will be copied as invalid method, leading to
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1091
     a trap when its executed. This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1092
     layout for all methods which are affected by the change."
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1093
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1094
    self copyInvalidatedMethodsFrom:oldClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1095
				for:newClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1096
		       accessingAny:setOfNames 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1097
			    orSuper:false 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1098
!
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1099
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1100
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames orSuper:superBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1101
    "copy all methods from oldClass to newClass. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1102
     Those methods accessing a variable in setOfNames will be copied as invalid method, 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1103
     leading to a trap when its executed. If superBoolean is true, this is also done
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1104
     for methods accessing super.  This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1105
     layout for all methods which are affected by the change."
2
claus
parents: 1
diff changeset
  1106
251
claus
parents: 226
diff changeset
  1107
    |trap trapCode trapByteCode p source mustInvalidate
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1108
     oldMethod newMethod oldMethodArray newMethodArray|
2
claus
parents: 1
diff changeset
  1109
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1110
    trap := Metaclass compiledMethodAt:#invalidMethod.
2
claus
parents: 1
diff changeset
  1111
    trapCode := trap code.
claus
parents: 1
diff changeset
  1112
    trapByteCode := trap byteCode.
claus
parents: 1
diff changeset
  1113
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1114
    oldMethodArray := oldClass methodArray.
2
claus
parents: 1
diff changeset
  1115
    newMethodArray := Array new:(oldMethodArray size).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1116
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1117
	       methods:newMethodArray.
2
claus
parents: 1
diff changeset
  1118
    1 to:oldMethodArray size do:[:i |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1119
	oldMethod := oldMethodArray at:i.
251
claus
parents: 226
diff changeset
  1120
	oldMethod isWrapped ifTrue:[
claus
parents: 226
diff changeset
  1121
	    oldMethod := oldMethod originalMethod
claus
parents: 226
diff changeset
  1122
	].
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1123
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1124
	"before parsing (which may take some time),
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1125
	 do a string search if its only one variable,
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1126
	 we are looking for."
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1127
251
claus
parents: 226
diff changeset
  1128
	source := oldMethod source.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1129
	((setOfNames size == 1) and:[superBoolean not]) ifTrue:[
251
claus
parents: 226
diff changeset
  1130
	    mustInvalidate := (source findString:(setOfNames first)) ~~ 0.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1131
	] ifFalse:[
251
claus
parents: 226
diff changeset
  1132
	    ((setOfNames size == 0) and:[superBoolean]) ifTrue:[
claus
parents: 226
diff changeset
  1133
		mustInvalidate := (source findString:'super') ~~ 0.
claus
parents: 226
diff changeset
  1134
	    ] ifFalse:[
claus
parents: 226
diff changeset
  1135
		mustInvalidate := true
claus
parents: 226
diff changeset
  1136
	    ].
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1137
	].
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1138
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1139
	mustInvalidate ifTrue:[
251
claus
parents: 226
diff changeset
  1140
	    "we have to parse it ..."
claus
parents: 226
diff changeset
  1141
	    p := Parser parseMethod:source in:newClass.
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1142
	    (p isNil 
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1143
	     or:[(p usedVars notNil and:[p usedVars includesAny:setOfNames])
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1144
	     or:[superBoolean and:[p usesSuper]]]) ifFalse:[
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1145
		mustInvalidate := false
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1146
	    ]
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1147
	].
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1148
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1149
	mustInvalidate ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1150
	    newMethod := oldMethod copy.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1151
	    newMethod code:trapCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1152
	    newMethod literals:nil.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1153
	    newMethod byteCode:trapByteCode
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1154
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1155
	    newMethod := oldMethod.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1156
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1157
	newMethodArray at:i put:newMethod
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1158
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1159
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1160
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1161
anyInvalidatedMethodsIn:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1162
    "return true, if aClass has any invalidated methods in it"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1163
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1164
    |trap trapCode trapByteCode|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1165
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1166
    trap := Metaclass compiledMethodAt:#invalidMethod.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1167
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1168
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1169
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1170
    aClass methodArray do:[:aMethod |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1171
	trapCode notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1172
	    (aMethod code == trapCode) ifTrue:[^ true]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1173
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1174
	trapByteCode notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1175
	    (aMethod byteCode == trapByteCode) ifTrue:[^ true]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1176
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1177
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1178
    ^ false
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1179
!
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1180
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1181
checkConventionsFor:className instVarNames:instVarNameString classVarNames:classVarNameString
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1182
    "Check for some 'considered bad-style' things, like lower case names.
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1183
     NOTICE:
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1184
     I dont like the confirmers below - we need a notifying: argument, to give
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1185
     the outer codeview a chance to highlight the error.
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1186
     (but thats how its defined in the book - maybe I will change it anyway).
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1187
    "
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1188
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1189
    "let user confirm, if the classname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1190
    className first isUppercase ifFalse:[
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1191
	(self confirm:'classename ''' , className , ''' should start with an uppercase letter
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1192
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1193
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1194
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1195
	    ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1196
		^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1197
	    ]
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1198
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1199
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1200
    "let user confirm, if any instvarname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1201
    (instVarNameString asCollectionOfWords 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1202
    findFirst:[:word | word first isUppercase]) ~~ 0 ifTrue:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1203
	(self confirm:'instance variable names should start with a lowercase letter
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1204
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1205
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1206
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1207
	ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1208
	    ^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1209
	]
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1210
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1211
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1212
    "let user confirm, if any classvarname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1213
    (classVarNameString asCollectionOfWords 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1214
    findFirst:[:word | word first isLowercase]) ~~ 0 ifTrue:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1215
	(self confirm:'class variable names should start with an uppercase letter
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1216
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1217
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1218
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1219
	ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1220
	    ^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1221
	].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1222
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1223
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1224
    ^ true
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1225
! !