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