Metaclass.st
author Claus Gittinger <cg@exept.de>
Fri, 16 Jul 1999 20:49:45 +0200
changeset 4399 b2ef9e2347bd
parent 4398 df208587581f
child 4451 ca4d77871c1c
permissions -rw-r--r--
checkin from browser
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
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
    13
ClassDescription subclass:#Metaclass
1047
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
    14
	instanceVariableNames:'myClass'
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    15
	classVariableNames:'ConfirmationQuerySignal'
1047
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
    16
	poolDictionaries:''
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
    17
	category:'Kernel-Classes'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
    20
!Metaclass class methodsFor:'documentation'!
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
    21
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    22
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    23
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    24
 COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    25
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    27
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    32
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    33
"
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    34
!
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    35
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    36
documentation
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    37
"
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    38
    every classes class is a subclass of Metaclass.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    39
    (i.e. every class is the sole instance of its Metaclass)
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    40
    Metaclass provides support for creating new (sub)classes and/or 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    41
    changing the definition of an already existing class.
1292
89497fff7f87 documentation
Claus Gittinger <cg@exept.de>
parents: 1266
diff changeset
    42
89497fff7f87 documentation
Claus Gittinger <cg@exept.de>
parents: 1266
diff changeset
    43
    [author:]
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
    44
	Claus Gittinger
1669
4951596746f7 comments & code cleanup
Claus Gittinger <cg@exept.de>
parents: 1655
diff changeset
    45
4951596746f7 comments & code cleanup
Claus Gittinger <cg@exept.de>
parents: 1655
diff changeset
    46
    [see also:]
4951596746f7 comments & code cleanup
Claus Gittinger <cg@exept.de>
parents: 1655
diff changeset
    47
	Behavior ClassDescription Class
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
    48
"
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    51
!Metaclass class methodsFor:'Signal constants'!
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    52
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    53
confirmationQuerySignal
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    54
    "return the query signal which is raised to ask if user
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    55
     confirmation dialogs should be opened.
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    56
     If unhandled, they are."
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    57
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    58
    ^ ConfirmationQuerySignal
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    59
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    60
    "Created: 31.7.1997 / 21:55:39 / cg"
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    61
! !
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    62
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    63
!Metaclass class methodsFor:'class initialization'!
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    64
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    65
initialize
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    66
    ConfirmationQuerySignal := QuerySignal new defaultAnswer:true
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    67
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    68
    "Modified: 31.7.1997 / 21:54:44 / cg"
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    69
! !
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
    70
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
    71
!Metaclass class methodsFor:'creating metaclasses'!
356
claus
parents: 328
diff changeset
    72
claus
parents: 328
diff changeset
    73
new
claus
parents: 328
diff changeset
    74
    "creating a new metaclass - have to set the new classes
claus
parents: 328
diff changeset
    75
     flags correctly to have it behave like a metaclass ...
claus
parents: 328
diff changeset
    76
     Not for normal applications - creating new metaclasses is a very
claus
parents: 328
diff changeset
    77
     tricky thing; should be left to the gurus ;-)"
claus
parents: 328
diff changeset
    78
claus
parents: 328
diff changeset
    79
    |newMetaclass|
claus
parents: 328
diff changeset
    80
claus
parents: 328
diff changeset
    81
    newMetaclass := super new.
claus
parents: 328
diff changeset
    82
    newMetaclass instSize:(Class instSize).
claus
parents: 328
diff changeset
    83
    newMetaclass setSuperclass:Class.
claus
parents: 328
diff changeset
    84
claus
parents: 328
diff changeset
    85
    ^ newMetaclass
claus
parents: 328
diff changeset
    86
claus
parents: 328
diff changeset
    87
    "
claus
parents: 328
diff changeset
    88
     Metaclass new           <- new metaclass
claus
parents: 328
diff changeset
    89
     Metaclass new new       <- new class
claus
parents: 328
diff changeset
    90
     Metaclass new new new   <- new instance
claus
parents: 328
diff changeset
    91
    "
claus
parents: 328
diff changeset
    92
! !
claus
parents: 328
diff changeset
    93
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
    94
!Metaclass class methodsFor:'queries'!
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
    95
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
    96
isBuiltInClass
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
    97
    "return true if this class is known by the run-time-system.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
    98
     Here, true is returned for myself, false for subclasses."
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
    99
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
   100
    ^ self == Metaclass class or:[self == Metaclass]
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
   101
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
   102
    "Modified: 23.4.1996 / 15:59:44 / cg"
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
   103
! !
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
   104
3012
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   105
!Metaclass methodsFor:'ST80 compatibility'!
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   106
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   107
comment:aString
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   108
    "ignored - sometimes found in ST-80 fileOut files.
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   109
     Comments are supposed to be defined via class messages."
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   110
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   111
    "Created: 9.10.1997 / 18:14:34 / cg"
3079
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   112
!
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   113
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   114
sourceCodeTemplate
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   115
    "ST80 compatibility - return a definition message for myself.
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   116
     Same as #definition"
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   117
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   118
    ^ self soleInstance definition
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   119
f177f98675c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3049
diff changeset
   120
    "Created: / 1.11.1997 / 13:16:45 / cg"
3012
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   121
! !
25d64e4f2a4d added #comment:
Claus Gittinger <cg@exept.de>
parents: 2822
diff changeset
   122
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   123
!Metaclass methodsFor:'class instance variables'!
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   124
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   125
instanceVariableNames:aString
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   126
    "changing / adding class-inst vars -
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   127
     this actually creates a new metaclass and class, leaving the original
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   128
     classes around as obsolete classes. This may also be true for all subclasses,
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   129
     if class instance variables are added/removed.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   130
     Existing instances continue to be defined by their original classes.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   131
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   132
     Time will show, if this is an acceptable behavior or if we should migrate
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   133
     instances to become insts. of the new classes."
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   134
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   135
    |newClass newMetaclass nClassInstVars oldClass 
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   136
     allSubclasses oldVars
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   137
     oldNames newNames addedNames
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   138
     oldOffsets newOffsets offset changeSet delta
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   139
     oldToNew newSubMeta newSub oldSubMeta oldSuper
986
c3a9f590146d removed unused locals
Claus Gittinger <cg@exept.de>
parents: 943
diff changeset
   140
     commonClassInstVars t|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   141
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   142
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   143
     cleanup needed here: extract common things with name:inEnvironment:...
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   144
     and restructure things ... currently way too complex.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   145
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   146
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   147
    oldVars := self instanceVariableString.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   148
    aString = oldVars ifTrue:[
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   149
"
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   150
        Transcript showCR:'no change (', oldVars , ') -> (', aString , ')'.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   151
"
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   152
        ^ self
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   153
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   154
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   155
    oldNames := oldVars asCollectionOfWords.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   156
    newNames := aString asCollectionOfWords.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   157
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   158
    oldNames = newNames ifTrue:[
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   159
"
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   160
        Transcript showCR:'no real change'.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   161
"
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   162
        "no real change (just formatting)"
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   163
        self setInstanceVariableString:aString.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   164
        ^ self
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   165
    ]. 
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   166
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   167
"/    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   168
"/     let user confirm, if any name is no good (and was good before)
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   169
"/    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   170
"/    (oldNames inject:true
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   171
"/                into:[:okSoFar :word |
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   172
"/                         okSoFar and:[word first isUppercase]
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   173
"/                     ])
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   174
"/    ifTrue:[
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   175
"/        "was ok before"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   176
"/        (newNames inject:true
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   177
"/                    into:[:okSoFar :word |
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   178
"/                             okSoFar and:[word first isUppercase]
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   179
"/                         ])
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   180
"/        ifFalse:[
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   181
"/            (self confirm:'class instance variable names should start with an uppercase letter
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   182
"/(by convention only)
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   183
"/
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   184
"/install anyway ?' withCRs)
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   185
"/            ifFalse:[
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   186
"/                ^ nil
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   187
"/            ]
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   188
"/        ]
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   189
"/    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   190
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   191
    nClassInstVars := newNames size.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   192
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   193
"
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   194
    Transcript showCR:'create new class/metaclass'.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   195
"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   196
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   197
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   198
     create the new metaclass
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   199
    "
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   200
    self isPrivate ifTrue:[
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   201
        newMetaclass := PrivateMetaclass new.
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   202
        newMetaclass setOwningClass:(self owningClass).
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   203
    ] ifFalse:[
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   204
        newMetaclass := Metaclass new.
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   205
    ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   206
    newMetaclass setSuperclass:superclass.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   207
    newMetaclass instSize:(superclass instSize + nClassInstVars).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   208
    (nClassInstVars ~~ 0) ifTrue:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   209
        newMetaclass setInstanceVariableString:aString
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   210
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   211
"/    newMetaclass flags:(Behavior flagBehavior "flagNotIndexed").
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   212
"/    newMetaclass setName:name.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   213
"/    newMetaclass classVariableString:classvars.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   214
"/    newMetaclass setComment:(self comment).
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   215
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   216
    "find the class which is my sole instance"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   217
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   218
    oldClass := myClass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   219
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   220
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   221
     create the new class
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   222
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   223
    newClass := newMetaclass new.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   224
    newClass setSuperclass:(oldClass superclass).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   225
    newClass instSize:(oldClass instSize).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   226
    newClass flags:(oldClass flags).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   227
    newClass setName:(oldClass name).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   228
    newClass setInstanceVariableString:(oldClass instanceVariableString).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   229
    newClass classVariableString:(oldClass classVariableString).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   230
    newClass setComment:(oldClass comment).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   231
    newClass category:(oldClass category).
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   232
    (t := oldClass primitiveSpec) notNil ifTrue:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   233
        newClass primitiveSpec:t.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   234
    ].        
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   235
    newClass setClassFilename:(oldClass classFilename).
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   236
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   237
    "/ set the new classes package
566
3d2527a9e96d preserve package when class definition changes - its required for the SourceCodeManager
Claus Gittinger <cg@exept.de>
parents: 544
diff changeset
   238
    "/ from the old package
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   239
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   240
    newClass package:(oldClass package).
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   241
723
ebc969b4678d preserve binaryRevision when adding instVars
Claus Gittinger <cg@exept.de>
parents: 682
diff changeset
   242
    "/ and keep the binary revision
2415
7bf60d51a383 Keep binary revision when adding class instvars.
Stefan Vogel <sv@exept.de>
parents: 2340
diff changeset
   243
    newClass setBinaryRevision:(oldClass binaryRevision).
723
ebc969b4678d preserve binaryRevision when adding instVars
Claus Gittinger <cg@exept.de>
parents: 682
diff changeset
   244
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   245
    changeSet := Set new.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   246
    ((oldNames size == 0) 
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   247
    or:[newNames startsWith:oldNames]) ifTrue:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   248
        "new variable(s) has/have been added - old methods still work"
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   249
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   250
"/        Transcript showCR:'copying methods ...'.
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   251
"/        Transcript endEntry.
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   252
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   253
        self copyMethodsFrom:self for:newMetaclass.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   254
        self copyMethodsFrom:oldClass for:newClass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   255
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   256
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   257
         but have to recompile methods accessing stuff now defined
3686
13a16c077970 comments only
Claus Gittinger <cg@exept.de>
parents: 3640
diff changeset
   258
         (it might have been a global/undeclared before ...)
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   259
        "
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   260
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   261
        addedNames := newNames select:[:nm | (oldNames includes:nm) not].
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   262
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   263
"/        Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   264
"/            Transcript showCR:'recompiling class methods of ' , newMetaclass name ,
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   265
"/                              ' accessing any of ' , addedNames printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   266
"/        ].
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   267
3278
bbc08c1a165d do not longer remove all class methods after defining instance class vars
tz
parents: 3079
diff changeset
   268
        "recompile class-methods"    
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   269
        newMetaclass recompileMethodsAccessingAny:addedNames.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   270
    ] ifFalse:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   271
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   272
         create the changeSet; thats the set of class instvar names
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   273
         which have changed their position or are new
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   274
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   275
        offset := 0. oldOffsets := Dictionary new.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   276
        oldNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   277
        offset := 0. newOffsets := Dictionary new.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   278
        newNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   279
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   280
        oldOffsets associationsDo:[:a |
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   281
            |k|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   282
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   283
            k := a key.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   284
            (newOffsets includesKey:k) ifFalse:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   285
                changeSet add:k
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   286
            ] ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   287
                (a value ~~ (newOffsets at:k)) ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   288
                    changeSet add:k
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   289
                ]
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   290
            ]
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   291
        ].
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   292
        newOffsets associationsDo:[:a |
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   293
            |k|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   294
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   295
            k := a key.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   296
            (oldOffsets includesKey:k) ifFalse:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   297
                changeSet add:k
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   298
            ] ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   299
                (a value ~~ (oldOffsets at:k)) ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   300
                    changeSet add:k
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   301
                ]
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   302
            ]
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   303
        ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   304
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   305
"/        Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   306
"/            Transcript showCR:'recompiling class methods of ' , newMetaclass name ,
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   307
"/                              ' accessing any of ' , changeSet printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   308
"/        ].
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   309
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   310
        "
3686
13a16c077970 comments only
Claus Gittinger <cg@exept.de>
parents: 3640
diff changeset
   311
         recompile class-methods accessing any c-instvar with a changed position
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   312
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   313
        self copyInvalidatedMethodsFrom:self for:newMetaclass accessingAny:changeSet.
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
   314
        newMetaclass recompileInvalidatedMethods.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   315
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   316
        self copyMethodsFrom:oldClass for:newClass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   317
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   318
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   319
    delta := newNames size - oldNames size.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   320
3379
422c91c556c5 must care for subclass owners when changing class-instVars
Claus Gittinger <cg@exept.de>
parents: 3282
diff changeset
   321
    "/ preserve existing classInstVar values (but not those from Class)
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   322
    newMetaclass allInstVarNames do:[:nm |
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   323
        |v|
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   324
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   325
        (Class class allInstVarNames includes:nm) ifFalse:[
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   326
            v := oldClass instVarNamed:nm ifAbsent:nil.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   327
            v notNil ifTrue:[
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   328
                newClass instVarNamed:nm put:v.    
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   329
            ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   330
        ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   331
    ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   332
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   333
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   334
     get list of all subclasses - do before superclass is changed
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   335
    "
3703
9ef3fd9febd3 need topological sort, when changing subclasses
Claus Gittinger <cg@exept.de>
parents: 3686
diff changeset
   336
    allSubclasses := oldClass allSubclasses asOrderedCollection.
9ef3fd9febd3 need topological sort, when changing subclasses
Claus Gittinger <cg@exept.de>
parents: 3686
diff changeset
   337
    "/ cg: wrong: allSubclasses := allSubclasses asSortedCollection:[:a :b | b isSubclassOf:a].
9ef3fd9febd3 need topological sort, when changing subclasses
Claus Gittinger <cg@exept.de>
parents: 3686
diff changeset
   338
    allSubclasses := allSubclasses topologicalSort:[:a :b | b isSubclassOf:a]. 
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   339
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   340
    oldToNew := IdentityDictionary new.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   341
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   342
    "
3703
9ef3fd9febd3 need topological sort, when changing subclasses
Claus Gittinger <cg@exept.de>
parents: 3686
diff changeset
   343
     create a new class tree, based on the new version
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   344
    "
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   345
    allSubclasses do:[:aSubclass |
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   346
        oldSuper := aSubclass superclass.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   347
        oldSubMeta := aSubclass class.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   348
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   349
        newSubMeta := Metaclass new.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   350
        oldSuper == oldClass ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   351
            newSubMeta setSuperclass:newMetaclass.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   352
        ] ifFalse:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   353
            newSubMeta setSuperclass:(oldToNew at:oldSuper) class.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   354
        ].
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   355
        newSubMeta instSize:(oldSubMeta instSize + delta).
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   356
        newSubMeta flags:(oldSubMeta flags).
2687
2c2d15429457 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2684
diff changeset
   357
"/        newSubMeta setName:(oldSubMeta name).
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   358
        newSubMeta setInstanceVariableString:(oldSubMeta instanceVariableString).
2687
2c2d15429457 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2684
diff changeset
   359
"/        newSubMeta setComment:(oldSubMeta comment).
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   360
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   361
        newSub := newSubMeta new.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   362
        oldSuper == oldClass ifTrue:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   363
            newSub setSuperclass:newClass.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   364
        ] ifFalse:[
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   365
            newSub setSuperclass:(oldToNew at:oldSuper).
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   366
        ].
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   367
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   368
"/        newSub setMethodDictionary:(aSubclass methodDictionary copy).
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   369
"/        newSub class setMethodDictionary:(aSubclass class methodDictionary copy).
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   370
        newSub setName:(aSubclass name).
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   371
        newSub classVariableString:(aSubclass classVariableString).
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   372
        newSub setInstanceVariableString:(aSubclass instanceVariableString).
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   373
        (t := aSubclass primitiveSpec) notNil ifTrue:[
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   374
            newSub primitiveSpec:t.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   375
        ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   376
        newSub package:(aSubclass package).
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   377
        newSub setClassFilename:(oldClass classFilename).
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   378
        newSub setComment:(aSubclass comment).
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   379
        newSub category:(aSubclass category).
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   380
        newSub instSize:(aSubclass instSize).
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   381
        newSub setBinaryRevision:(aSubclass binaryRevision).
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   382
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   383
        oldToNew at:aSubclass put:newSub.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   384
1655
fb6ee1b55ec4 use *-categories
Claus Gittinger <cg@exept.de>
parents: 1515
diff changeset
   385
        aSubclass category:#'* obsolete *'.
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   386
3686
13a16c077970 comments only
Claus Gittinger <cg@exept.de>
parents: 3640
diff changeset
   387
        "/ preserve existing classInstVar values (but not those from Class)
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   388
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   389
        newSubMeta allInstVarNames do:[:nm |
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   390
            |v|
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   391
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   392
            (Class class allInstVarNames includes:nm) ifFalse:[
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   393
                v := aSubclass instVarNamed:nm ifAbsent:nil.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   394
                v notNil ifTrue:[
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   395
                    newSub instVarNamed:nm put:v.    
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   396
                ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   397
            ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   398
        ].
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   399
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   400
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   401
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   402
    "recompile what needs to be"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   403
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   404
    delta == 0 ifTrue:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   405
        "only have to recompile class methods accessing 
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   406
         class instvars from changeset
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   407
        "
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   408
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   409
        allSubclasses do:[:oldSubclass |
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   410
            |newSubclass|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   411
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   412
            newSubclass := oldToNew at:oldSubclass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   413
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   414
"/            Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   415
"/                Transcript showCR:'recompiling class methods of ' , newSubclass class name ,
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   416
"/                                  ' accessing any of ' , changeSet printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   417
"/            ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   418
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   419
            self 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   420
                copyInvalidatedMethodsFrom:oldSubclass class for:newSubclass class 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   421
                accessingAny:changeSet orSuper:true.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   422
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   423
            self 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   424
                copyInvalidatedMethodsFrom:oldSubclass for:newSubclass 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   425
                accessingAny:#() orSuper:true.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   426
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   427
            newSubclass class recompileInvalidatedMethods.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   428
            newSubclass recompileInvalidatedMethods.
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   429
        ]
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   430
    ] ifFalse:[
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   431
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   432
         have to recompile all class methods accessing class instvars
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   433
        "
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   434
        commonClassInstVars := oldClass class allInstVarNames.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   435
        changeSet do:[:v |
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   436
            commonClassInstVars remove:v ifAbsent:[]
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   437
        ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   438
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   439
        allSubclasses do:[:oldSubclass |
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   440
            |newSubclass classInstVars|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   441
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   442
            newSubclass := oldToNew at:oldSubclass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   443
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   444
            classInstVars := newSubclass class allInstVarNames asSet.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   445
            classInstVars removeAll:commonClassInstVars.
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   446
            classInstVars addAll:changeSet.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   447
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   448
"/            Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   449
"/                Transcript showCR:'recompiling class methods of ' , newSubclass class name ,
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   450
"/                                  ' accessing any of ' , classInstVars printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
   451
"/            ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   452
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   453
            self 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   454
                copyInvalidatedMethodsFrom:oldSubclass class for:newSubclass class 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   455
                accessingAny:classInstVars orSuper:true.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   456
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   457
            self 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   458
                copyInvalidatedMethodsFrom:oldSubclass for:newSubclass 
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   459
                accessingAny:#() orSuper:true.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   460
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   461
            newSubclass class recompileInvalidatedMethods.
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   462
            newSubclass recompileInvalidatedMethods.
1416
48631b5d2017 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1392
diff changeset
   463
        ]
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   464
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   465
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   466
    newClass addChangeRecordForClassInstvars:newClass.
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   467
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   468
    "install all new classes"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   469
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   470
    (Smalltalk at:(oldClass name asSymbol) ifAbsent:nil) == oldClass ifTrue:[
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   471
        Smalltalk at:(oldClass name asSymbol) put:newClass.
1798
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
   472
        self checkForAliasesOf:oldClass with:newClass.
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   473
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   474
        "
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   475
         change any private subclasses' owners
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   476
        "
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   477
        oldClass privateClassesDo:[:aClass |
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   478
            aClass class setOwningClass:newClass
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   479
        ].
1821
0ef23966c67b move privateClasses when changing classInstVars
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
   480
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   481
    ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   482
    ObjectMemory flushCachesFor:oldClass.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   483
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   484
    allSubclasses do:[:oldSubClass |
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   485
        |newSubClass|
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   486
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   487
        newSubClass := oldToNew at:oldSubClass.
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   488
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   489
"/        Transcript showCR:'install ' , newSubClass name , '(' , newSubClass category , ')' ,
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   490
"/                          ' as ' , newSubClass name.
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   491
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   492
        (Smalltalk at:(oldSubClass name asSymbol) ifAbsent:nil) == oldSubClass ifTrue:[
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   493
            Smalltalk at:oldSubClass name asSymbol put:newSubClass.
1798
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
   494
            self checkForAliasesOf:oldSubClass with:newSubClass.
1671
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   495
        ].
cceee8a44757 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1669
diff changeset
   496
        ObjectMemory flushCachesFor:oldSubClass.
3379
422c91c556c5 must care for subclass owners when changing class-instVars
Claus Gittinger <cg@exept.de>
parents: 3282
diff changeset
   497
422c91c556c5 must care for subclass owners when changing class-instVars
Claus Gittinger <cg@exept.de>
parents: 3282
diff changeset
   498
        oldSubClass privateClassesDo:[:aClass |
422c91c556c5 must care for subclass owners when changing class-instVars
Claus Gittinger <cg@exept.de>
parents: 3282
diff changeset
   499
            aClass class setOwningClass:newSubClass
422c91c556c5 must care for subclass owners when changing class-instVars
Claus Gittinger <cg@exept.de>
parents: 3282
diff changeset
   500
        ].
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   501
    ].
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   502
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   503
    "tell dependents ..."
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   504
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   505
    oldClass changed:#definition.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   506
    self changed:#definition.
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   507
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   508
    ^ newMetaclass
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   509
3282
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   510
    "Created: / 29.10.1995 / 19:57:08 / cg"
9cb867744e4c I hope this does the class-instVar change ...
Claus Gittinger <cg@exept.de>
parents: 3278
diff changeset
   511
    "Modified: / 1.4.1997 / 15:44:09 / stefan"
3703
9ef3fd9febd3 need topological sort, when changing subclasses
Claus Gittinger <cg@exept.de>
parents: 3686
diff changeset
   512
    "Modified: / 31.7.1998 / 18:02:00 / cg"
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   513
! !
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   514
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   515
!Metaclass methodsFor:'copying'!
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   516
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   517
postCopy
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   518
    "redefined - a copy may have a new instance"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   519
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   520
    myClass := nil
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   521
! !
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
   522
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
!Metaclass methodsFor:'creating classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
   525
name:newName in:aSystemDictionaryOrClass
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   526
             subclassOf:aClass
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   527
             instanceVariableNames:stringOfInstVarNames
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   528
             variable:variableBoolean
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   529
             words:wordsBoolean
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   530
             pointers:pointersBoolean
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   531
             classVariableNames:stringOfClassVarNames
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   532
             poolDictionaries:stringOfPoolNames
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   533
             category:categoryString
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   534
             comment:commentString
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   535
             changed:changed
2688
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   536
             classInstanceVariableNames:stringOfClassInstVarNamesOrNil
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   537
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   538
    "this is the main workhorse for installing new classes - special care
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   539
     has to be taken, when changing an existing classes definition. In this
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   540
     case, some or all of the methods and subclasses methods have to be
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   541
     recompiled.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   542
     Also, the old class(es) are still kept (but not accessable as a global),
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   543
     to allow existing instances some life. 
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   544
     This might change in the future.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   545
    "
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   546
1910
65a41a013d9c more care fore namespaces
Claus Gittinger <cg@exept.de>
parents: 1904
diff changeset
   547
    |newClass newMetaclass nInstVars nameString classSymbol nameKey oldClass 
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   548
     classVarChange instVarChange superClassChange newComment
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   549
     changeSet1 changeSet2 addedNames
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   550
     anyChange oldInstVars newInstVars oldClassVars newClassVars superFlags newFlags
3587
e7359c9f22d4 keep old package when redefining a class.
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   551
     pkg oldPkg idx spec nClassInstVars 
2564
0259b286c09a removed unused vars
Claus Gittinger <cg@exept.de>
parents: 2440
diff changeset
   552
     realNewName thisIsPrivate oldCIVNames newCIVNames nsName namespace
0259b286c09a removed unused vars
Claus Gittinger <cg@exept.de>
parents: 2440
diff changeset
   553
     oldSuperClass newSuperClass oldCategory
3596
d19a2f605da3 also allow catching of class redefinitions.
Claus Gittinger <cg@exept.de>
parents: 3589
diff changeset
   554
     recompileGlobalAccessTo stringOfClassInstVarNames answer|
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   555
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   556
    "NOTICE:
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   557
     this method is too complex and should be splitted into managable pieces ...
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   558
     I dont like it anymore :-) 
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   559
     (well, at least, its a good test for the compilers ability 
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   560
      to handle big, complex methods ;-)
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   561
     take it as an example of bad coding style ...
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   562
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   563
     ST-80 uses a ClassBuilder object to collect the work and perform all updates;
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   564
     this method may be changed to do something similar in the future ...
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   565
    "
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   566
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   567
    (newName isSymbol not
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   568
    or:[newName size == 0]) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   569
        self error:'invalid class name (must be a nonEmpty symbol)'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   570
        ^ nil
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   571
    ].
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   572
    newName first isLetter ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   573
        self error:'invalid class name (must start with a letter)'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   574
        ^ nil
1733
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   575
    ].
2cc88c50db99 check for valid className (symbol & startsWith a letter).
Claus Gittinger <cg@exept.de>
parents: 1732
diff changeset
   576
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   577
    "check for invalid subclassing of UndefinedObject and SmallInteger"
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   578
    aClass notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   579
        aClass canBeSubclassed ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   580
            self error:('it is not possible to subclass ' , aClass name).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   581
            ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   582
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   583
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   584
3049
a635eb5f1f6d autoload a privateclasses owner
Claus Gittinger <cg@exept.de>
parents: 3012
diff changeset
   585
    "/ owner must be loaded
a635eb5f1f6d autoload a privateclasses owner
Claus Gittinger <cg@exept.de>
parents: 3012
diff changeset
   586
    (aSystemDictionaryOrClass notNil and:[aSystemDictionaryOrClass isLoaded not]) ifTrue:[
a635eb5f1f6d autoload a privateclasses owner
Claus Gittinger <cg@exept.de>
parents: 3012
diff changeset
   587
        aSystemDictionaryOrClass autoload
a635eb5f1f6d autoload a privateclasses owner
Claus Gittinger <cg@exept.de>
parents: 3012
diff changeset
   588
    ].
a635eb5f1f6d autoload a privateclasses owner
Claus Gittinger <cg@exept.de>
parents: 3012
diff changeset
   589
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   590
    (stringOfInstVarNames size > 0
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   591
    or:[stringOfClassVarNames size > 0]) ifTrue:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   592
        "
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   593
         Check for invalid variable names (duplicates)
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   594
        "
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   595
        (self 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   596
            checkValidVarNamesFor:newName
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   597
            subClassOf:aClass
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   598
            instVarNames:stringOfInstVarNames 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   599
            classVarNames:stringOfClassVarNames) 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   600
        ifFalse:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   601
            ^ nil
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   602
        ].
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   603
        nInstVars := stringOfInstVarNames countWords.
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   604
    ] ifFalse:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   605
        nInstVars := 0.
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
   606
    ].
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
   607
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   608
    nameString := newName asString.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   609
    classSymbol := newName asSymbol.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   610
    newComment := commentString.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   611
1829
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
   612
    namespace := aSystemDictionaryOrClass.
1910
65a41a013d9c more care fore namespaces
Claus Gittinger <cg@exept.de>
parents: 1904
diff changeset
   613
    nameKey := classSymbol.
1749
c146bb48d03b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1742
diff changeset
   614
1829
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
   615
    (namespace notNil
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
   616
    and:[namespace isNamespace not]) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   617
        thisIsPrivate := true.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   618
        realNewName := (namespace name , '::' , classSymbol) asSymbol.
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
   619
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   620
        thisIsPrivate := false.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   621
        realNewName := classSymbol.
1829
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
   622
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   623
        "/ does the name imply a nameSpace ?
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   624
        ((idx := realNewName indexOf:$:)) ~~ 0 ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   625
            "/ check for this namespace to exist
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   626
            nsName := realNewName copyTo:(idx - 1).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   627
            nsName := nsName asSymbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   628
            (realNewName indexOf:$: startingAt:(idx+2)) ~~ 0 ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   629
                self warn:('nested namespaces are not (yet) implemented.') withCRs.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   630
                ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   631
            ].
1830
1f4118554dae checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1829
diff changeset
   632
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   633
            namespace := Smalltalk at:nsName ifAbsent:nil.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   634
            namespace isNamespace ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   635
                namespace isNil ifTrue:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
   636
                    (Class createNameSpaceQuerySignal query
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   637
                    or:[(self 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   638
                            confirm:('nonexistent namespace: `' , nsName , '''.\\Create ?') withCRs)])
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   639
                    ifFalse:[^ nil].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   640
                    namespace := Namespace name:nsName.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   641
                ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   642
                    self warn:('a global named ' , nsName , ' exists, but is no namespace.') withCRs.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   643
                    ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   644
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   645
            ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   646
            namespace isNamespace ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   647
                nameKey := (classSymbol copyFrom:(nsName size + 3)) asSymbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   648
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   649
        ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   650
            (namespace notNil and:[namespace ~~ Smalltalk]) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   651
                realNewName := (namespace name , '::' , classSymbol) asSymbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   652
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   653
        ]
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
   654
    ].
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
   655
2233
0dd796870a34 a cyclic definition is not always what is seems to be
Claus Gittinger <cg@exept.de>
parents: 2132
diff changeset
   656
    (aClass notNil and:[realNewName = aClass name]) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   657
        self error:'trying to create circular class definition'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   658
        ^ nil
2233
0dd796870a34 a cyclic definition is not always what is seems to be
Claus Gittinger <cg@exept.de>
parents: 2132
diff changeset
   659
    ].
0dd796870a34 a cyclic definition is not always what is seems to be
Claus Gittinger <cg@exept.de>
parents: 2132
diff changeset
   660
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   661
    "look, if it already exists as a class"
1829
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
   662
    namespace notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   663
        thisIsPrivate ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   664
            oldClass := namespace at:nameKey ifAbsent:[nil].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   665
        ] ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   666
            oldClass := namespace privateClassesAt:classSymbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   667
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   668
    ].
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
   669
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   670
    (oldClass isBehavior and:[oldClass isLoaded]) ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   671
        oldClass := nil.
1749
c146bb48d03b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1742
diff changeset
   672
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   673
        thisIsPrivate ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   674
            Compiler warnSTXSpecials ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   675
                (self confirm:('support for private classes is an ST/X extension.\\continue ?') withCRs)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   676
                ifFalse:[^ nil].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   677
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   678
        ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   679
    ] ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   680
        oldClass name ~= realNewName ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   681
            (self confirm:(classSymbol , ' is an alias for ' , oldClass name , '\\continue ?') withCRs)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   682
            ifFalse:[^ nil].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   683
            oldClass := nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   684
        ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   685
            "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   686
            "/ some consisteny checks
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   687
            "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   688
            oldClass superclass notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   689
                oldClass allSuperclasses do:[:cls |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   690
                    cls name = realNewName ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   691
                        self error:'trying to create circular class definition'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   692
                        ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   693
                    ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   694
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   695
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   696
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   697
            aClass notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   698
                aClass superclass notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   699
                    aClass allSuperclasses do:[:cls |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   700
                        cls name = realNewName ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   701
                            self error:'trying to create circular class definition'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   702
                            ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   703
                        ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   704
                    ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   705
                ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   706
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   707
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   708
            newComment isNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   709
                newComment := oldClass comment
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   710
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   711
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   712
            "
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   713
             warn, if it exists with different category and different instvars,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   714
             and the existing is not an autoload class.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   715
             Usually, this indicates that someone wants to create a new class with
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   716
             a name, which already exists (it happened a few times to myself, while 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   717
             I wanted to create a new class called ReturnNode ...).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   718
             This will be much less of a problem, once multiple name spaces are
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   719
             implemented and classes can be put into separate packages.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   720
            "
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   721
            oldClass isLoaded ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   722
                oldClass category ~= categoryString ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   723
                    oldClass instanceVariableString asCollectionOfWords 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   724
                    ~= stringOfInstVarNames asCollectionOfWords ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   725
                        (self confirm:'a class named ' , oldClass name , 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   726
                                      ' already exists -\\create (i.e. change) anyway ?' withCRs)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   727
                        ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   728
                            ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   729
                        ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   730
                    ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   731
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   732
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   733
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   734
            "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   735
            "/ hints - warn, if creating a variableSubclass of a Set
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   736
            "/ (common error - containers in ST/X do not use variable-slots)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   737
            "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   738
            ((variableBoolean == true) and:[pointersBoolean]) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   739
                (oldClass isKindOf:Set class) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   740
                    (self confirm:'ST/X Set & Dictionary are not variable-classes\create anyway ?' withCRs)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   741
                    ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   742
                        ^ nil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   743
                    ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   744
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   745
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   746
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   747
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   748
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   749
    "/ Check for some 'considered bad-style' things, like lower case names.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   750
    "/ But only do these checks for new classes - 
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   751
    "/ - thus, once confirmed, the warnings will not come again and again.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   752
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   753
    "/ NOTICE:
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   754
    "/ I dont like the confirmers there - we need a notifying: argument, to give
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   755
    "/ the outer codeview a chance to highlight the error.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   756
    "/ (but thats how its defined in the book - maybe I will change anyway).
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   757
    "/ - or use upQueries in future versions.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   758
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   759
    oldClass isNil ifTrue:[
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   760
        (stringOfInstVarNames size > 0
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   761
        or:[stringOfClassVarNames size > 0]) ifTrue:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   762
            (self 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   763
                checkConventionsFor:newName
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   764
                subClassOf:aClass
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   765
                instVarNames:stringOfInstVarNames 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   766
                classVarNames:stringOfClassVarNames) 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   767
            ifFalse:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   768
                ^ nil
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   769
            ]
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   770
        ].
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   771
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   772
        (self
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   773
            checkInstvarRedefsWith:stringOfInstVarNames 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   774
            subclassOf:aClass 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   775
            old:oldClass 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   776
            name:newName) ifFalse:[^ nil].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   777
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   778
2688
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   779
    stringOfClassInstVarNamesOrNil isNil ifTrue:[
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   780
        oldClass isNil ifTrue:[
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   781
            stringOfClassInstVarNames := ''
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   782
        ] ifFalse:[
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   783
            stringOfClassInstVarNames := oldClass class instanceVariableString
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   784
        ]
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   785
    ] ifFalse:[
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   786
        stringOfClassInstVarNames := stringOfClassInstVarNamesOrNil
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   787
    ].
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
   788
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   789
    nClassInstVars := stringOfClassInstVarNames countWords.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   790
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   791
    "create the metaclass first"
1749
c146bb48d03b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1742
diff changeset
   792
    thisIsPrivate ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   793
        newMetaclass := PrivateMetaclass new
1725
eaa45019ad44 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1724
diff changeset
   794
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   795
        newMetaclass := Metaclass new.
1725
eaa45019ad44 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1724
diff changeset
   796
    ].
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   797
    aClass isNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   798
        newMetaclass setSuperclass:Class.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   799
        newMetaclass instSize:(Class instSize + nClassInstVars).
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   800
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   801
        newMetaclass setSuperclass:(aClass class).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   802
        newMetaclass instSize:(aClass class instSize + nClassInstVars).
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   803
    ].
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   804
"/    newMetaclass classVariableString:''.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   805
    newMetaclass setInstanceVariableString:stringOfClassInstVarNames.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   806
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   807
    "then let the new meta create the class"
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   808
    newClass := newMetaclass new.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   809
    newClass setSuperclass:aClass.
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   810
    aClass isNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   811
        newClass instSize:nInstVars.
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   812
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   813
        newClass instSize:(aClass instSize + nInstVars).
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   814
    ].
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
   815
1749
c146bb48d03b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1742
diff changeset
   816
    thisIsPrivate ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   817
        "/ some private class
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   818
        newMetaclass setOwningClass:namespace.
1921
bfaa8f683985 handle namespace-classes
Claus Gittinger <cg@exept.de>
parents: 1920
diff changeset
   819
    ].
bfaa8f683985 handle namespace-classes
Claus Gittinger <cg@exept.de>
parents: 1920
diff changeset
   820
bfaa8f683985 handle namespace-classes
Claus Gittinger <cg@exept.de>
parents: 1920
diff changeset
   821
    (namespace notNil 
bfaa8f683985 handle namespace-classes
Claus Gittinger <cg@exept.de>
parents: 1920
diff changeset
   822
    and:[namespace ~~ Smalltalk]) ifTrue:[
4399
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
   823
        newClass setName:realNewName.
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   824
        "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   825
        "/ if that key exists in smalltalk,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   826
        "/ must recompile everything in that nameSpace,
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   827
        "/ which refers to the unprefixed global.
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   828
        "/
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   829
        recompileGlobalAccessTo := nameKey.
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
   830
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   831
        newClass setName:classSymbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   832
        recompileGlobalAccessTo := nil.
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
   833
    ].
4029
eb75f8295dfe recompilation when new classes arrive (fixed for private classes)
Claus Gittinger <cg@exept.de>
parents: 4027
diff changeset
   834
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   835
    newClass setComment:newComment category:categoryString.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   836
1778
fd558245c662 preserve values of classInstVars when creating a new class
Claus Gittinger <cg@exept.de>
parents: 1776
diff changeset
   837
    oldClass notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   838
        "/ copy over classInstanceVariables
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   839
        "/ but not those inherited from class
1778
fd558245c662 preserve values of classInstVars when creating a new class
Claus Gittinger <cg@exept.de>
parents: 1776
diff changeset
   840
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   841
        oldCIVNames := oldClass class allInstVarNames asSet.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   842
        newCIVNames := newClass class allInstVarNames asSet.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   843
        Class class allInstVarNames do:[:n |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   844
             oldCIVNames remove:n ifAbsent:nil.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   845
             newCIVNames remove:n ifAbsent:nil.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   846
        ].
1778
fd558245c662 preserve values of classInstVars when creating a new class
Claus Gittinger <cg@exept.de>
parents: 1776
diff changeset
   847
            
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   848
        newCIVNames size > 0 ifTrue:[
4094
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   849
"/            Smalltalk silentLoading ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   850
"/                Transcript show:'preserving classInstVar values: '; showCR:newCIVNames.
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   851
"/            ].
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   852
            newCIVNames do:[:n |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   853
                (oldCIVNames includes:n) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   854
                    newClass instVarNamed:n put:(oldClass instVarNamed:n)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   855
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   856
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   857
        ].
1778
fd558245c662 preserve values of classInstVars when creating a new class
Claus Gittinger <cg@exept.de>
parents: 1776
diff changeset
   858
    ].
fd558245c662 preserve values of classInstVars when creating a new class
Claus Gittinger <cg@exept.de>
parents: 1776
diff changeset
   859
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   860
    "/ set the new classes package
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   861
    "/ but prefer the old package
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   862
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   863
    oldClass isNil ifTrue:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
   864
        pkg := Class packageQuerySignal query.
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   865
    ] ifFalse:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
   866
"/        pkg := Class packageQuerySignal query.
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   867
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   868
        pkg := oldPkg := oldClass package.
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   869
        oldClass isLoaded ifTrue:[
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   870
            "/ if not autoloading, check if we are in another project-package
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   871
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
   872
            pkg := Class packageQuerySignal query.
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   873
            oldPkg ~= pkg ifTrue:[
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   874
                newClass package:pkg.
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   875
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   876
                answer := Class classRedefinitionSignal
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   877
                              raiseRequestWith:(oldClass -> newClass)
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   878
                              errorString:('redefinition of class: ' , oldClass name).
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   879
                answer == #keep ifTrue:[
4094
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   880
"/                    Smalltalk silentLoading ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   881
"/                      Transcript showCR:('keeping original package: ''' , oldPkg , ''' of class: ' , oldClass name).
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
   882
"/                    ].
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   883
                    pkg := oldPkg.
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   884
                ] ifFalse:[
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   885
                    answer ~~ #continue ifTrue:[
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   886
                        ^ nil
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   887
                   ].
3596
d19a2f605da3 also allow catching of class redefinitions.
Claus Gittinger <cg@exept.de>
parents: 3589
diff changeset
   888
                ].
d19a2f605da3 also allow catching of class redefinitions.
Claus Gittinger <cg@exept.de>
parents: 3589
diff changeset
   889
            ].
4034
56e754b6ded8 preserve package (when changing a classes definition).
Claus Gittinger <cg@exept.de>
parents: 4032
diff changeset
   890
            newClass setBinaryRevision:(oldClass binaryRevision).
3587
e7359c9f22d4 keep old package when redefining a class.
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   891
        ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   892
    ].
1835
e90fe211cdf1 oops - corrupted the package on autolaod
Claus Gittinger <cg@exept.de>
parents: 1830
diff changeset
   893
    pkg notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   894
        "/ newMetaclass package:pkg.
3589
fbb0b1f59758 removed leftover transcript message
Claus Gittinger <cg@exept.de>
parents: 3587
diff changeset
   895
        "/ Transcript showCR:('set package of class: ' , newClass name , ' to ' , pkg printString).
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   896
        newClass package:pkg.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   897
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   898
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   899
    "/ Allowing non-booleans as variableBoolean
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   900
    "/ is a hack for backward (ST-80) compatibility:
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   901
    "/ ST-80 code will pass true or false as variableBoolean,
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   902
    "/ while ST/X also calls it with symbols such as #float, #double etc.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   903
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   904
    (variableBoolean == true) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   905
        pointersBoolean ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   906
            newFlags := Behavior flagPointers
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   907
        ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   908
            wordsBoolean ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   909
                newFlags := Behavior flagWords
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   910
            ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   911
                newFlags := Behavior flagBytes
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   912
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   913
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   914
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   915
        "/ false or symbol.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   916
        newFlags := Behavior flagForSymbolic:variableBoolean.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   917
    ].
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   918
    aClass isNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   919
        superFlags := 0
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   920
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   921
        superFlags := aClass flags bitAnd:(Behavior maskIndexType bitInvert). "preserve other bits"
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   922
    ].
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
   923
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   924
    oldClass notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   925
        oldClass isBuiltInClass ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   926
            "
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   927
             special care when redefining Method, Block and other built-in classes,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   928
             which might have other flag bits ...
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   929
            "
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   930
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   931
            newFlags := newFlags bitOr:(oldClass flags bitAnd:(Behavior maskIndexType bitInvert))
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   932
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   933
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   934
    newClass flags:(newFlags bitOr:superFlags). "preserve  inherited special bits"
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   935
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   936
    (nInstVars ~~ 0) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   937
        newClass setInstanceVariableString:stringOfInstVarNames
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   938
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   939
    oldClass notNil ifTrue:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   940
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   941
        "/ setting first will make new class clear obsolete classvars
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   942
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   943
        newClass setClassVariableString:(oldClass classVariableString).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   944
        (spec := oldClass primitiveSpec) notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   945
            newClass primitiveSpec:spec.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   946
            newClass setClassFilename:(oldClass classFilename).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   947
        ]        
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   948
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   949
    newClass classVariableString:stringOfClassVarNames.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   950
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   951
    "/ for new classes, we are almost done here
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   952
    "/ (also for autoloaded classes)
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   953
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   954
    (oldClass isNil or:[oldClass isLoaded not]) ifTrue:[
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   955
        (oldClass isNil and:[changed]) ifTrue:[
2584
d8449ccdc4a8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2564
diff changeset
   956
            aClass ~~ Autoload ifTrue:[
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   957
                newClass addChangeRecordForClass:newClass.
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
   958
            ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   959
        ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
   960
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   961
        commentString notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   962
            newClass comment:commentString
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   963
        ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   964
        namespace notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   965
            thisIsPrivate ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   966
                namespace privateClassesAt:classSymbol put:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   967
            ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   968
                namespace at:nameKey put:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   969
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   970
        ].
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   971
3587
e7359c9f22d4 keep old package when redefining a class.
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   972
"/        oldClass isNil ifTrue:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
   973
"/            newClass package:(Class packageQuerySignal query)
3587
e7359c9f22d4 keep old package when redefining a class.
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   974
"/        ].
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   975
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   976
        oldClass notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   977
            "/ since we changed the classes inheritance (from Autoloaded)
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   978
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   979
            "/ actually, could optimize to:
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   980
            "/  Behavior updateSuperclassInfoFor:oldClass superclass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   981
            "/  Behavior updateSuperclassInfoFor:newClass superclass.
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
   982
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   983
            Behavior flushSubclassInfo.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   984
        ].
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
   985
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   986
        namespace notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   987
            thisIsPrivate ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   988
                namespace changed.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   989
            ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   990
                namespace changed:#newClass with:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   991
                namespace ~~ Smalltalk ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   992
                    Smalltalk changed:#newClass with:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   993
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   994
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
   995
        ].
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
   996
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   997
        "/ be very careful, when adding classes
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   998
        "/ to a namespace or adding a privateClass. 
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
   999
        "/ When adding, all methods within that namespace/owning class
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1000
        "/ which access the unprefixed-global,
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1001
        "/ must be recompiled (so they access the new class)
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1002
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1003
        recompileGlobalAccessTo notNil ifTrue:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1004
            self recompileGlobalAccessorsTo:recompileGlobalAccessTo
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1005
                 in:namespace
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1006
                 except:newClass
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1007
        ].
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1008
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1009
        ^ newClass
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1010
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1011
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1012
    "/ here comes the hard part - we are actually changing the
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1013
    "/ definition of an existing class ....
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1014
    "/ Try hard to get away WITHOUT recompiling, since it makes all
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1015
    "/ compiled code into interpreted ...
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1016
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1017
    oldInstVars := oldClass instanceVariableString asCollectionOfWords.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1018
    newInstVars := newClass instanceVariableString asCollectionOfWords.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1019
    oldClassVars := oldClass classVariableString asCollectionOfWords.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1020
    newClassVars := newClass classVariableString asCollectionOfWords.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1021
2039
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
  1022
    oldSuperClass := oldClass superclass.
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
  1023
    newSuperClass := newClass superclass.
6a03b5a9d4e2 handle nil subclasses here
Claus Gittinger <cg@exept.de>
parents: 2035
diff changeset
  1024
    superClassChange := oldSuperClass ~~ newSuperClass.
2002
6af05dcbebf8 no need to recompile class methods, if
Claus Gittinger <cg@exept.de>
parents: 1937
diff changeset
  1025
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1026
    "/ we are on the bright side of life, if the instance layout and
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1027
    "/ inheritance do not change.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1028
    "/ In this case, we can go ahead and patch the class object.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1029
    "/ (only comment and/or classVars have changed)
2002
6af05dcbebf8 no need to recompile class methods, if
Claus Gittinger <cg@exept.de>
parents: 1937
diff changeset
  1030
6af05dcbebf8 no need to recompile class methods, if
Claus Gittinger <cg@exept.de>
parents: 1937
diff changeset
  1031
    superClassChange ifFalse:[
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1032
      (oldClass instSize == newClass instSize) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1033
        (oldClass flags == newClass flags) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1034
          (oldClass name = newClass name) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1035
            (oldInstVars = newInstVars) ifTrue:[
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1036
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1037
              (newComment ~= oldClass comment) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1038
                  oldClass setComment:newComment.        "writes a change-chunk"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1039
                  oldClass changed:#comment with:oldClass comment.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1040
                  changed ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1041
                      oldClass addChangeRecordForClassComment:oldClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1042
                  ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1043
              ]. 
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1044
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1045
              (oldClassVars = newClassVars) ifTrue:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1046
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1047
                "/ really no change (just comment and/or category)
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1048
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1049
                anyChange := false.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1050
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1051
                oldClass setInstanceVariableString:(newClass instanceVariableString).
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1052
                oldClass setClassVariableString:(newClass classVariableString).
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1053
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1054
                oldClass category ~= categoryString ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1055
                    oldClass category:categoryString. 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1056
                    changed ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1057
                        newClass addChangeRecordForClass:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1058
                    ].    
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1059
                    namespace notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1060
                        thisIsPrivate ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1061
                            "notify change of category"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1062
                            namespace changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1063
                            namespace ~~ Smalltalk ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1064
                                Smalltalk changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1065
                            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1066
                        ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1067
                    ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1068
                ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1069
                "notify change of class"
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1070
"/                oldClass changed.
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1071
                ^ oldClass
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1072
              ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1073
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1074
              "/ when we arrive here, class variables have changed
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1075
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1076
              oldClass category ~= categoryString ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1077
                  "notify change of organization"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1078
                  oldClass category:categoryString. 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1079
                  namespace notNil ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1080
                       thisIsPrivate ifFalse:[ 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1081
                            "notify change of organization"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1082
                            namespace changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1083
                            namespace ~~ Smalltalk ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1084
                                Smalltalk changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1085
                            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1086
                        ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1087
                  ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1088
              ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1089
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1090
              "/ set class variable string; 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1091
              "/ this also updates the set of class variables
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1092
              "/ by creating new / deleting obsolete ones.
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1093
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1094
              oldClass classVariableString:stringOfClassVarNames.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1095
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1096
              "
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1097
               get the set of changed class variables
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1098
              "
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1099
              changeSet1 := Set new.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1100
              oldClassVars do:[:nm |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1101
                  (newClassVars includes:nm) ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1102
                      "/ a removed classVar;
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1103
                      "/ must recompile methods accessing that one:
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1104
                      "/ access was: classVar; now: global.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1105
                      changeSet1 add:nm
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1106
                  ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1107
              ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1108
              newClassVars do:[:nm |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1109
                  (oldClassVars includes:nm) ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1110
                      "/ an added classVar;
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1111
                      "/ must recompile methods accessing that one:
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1112
                      "/ access was: global; now: classVar.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1113
                      "/ but only, if such a global existed in the first
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1114
                      "/ place. (otherwise, it is a brand-new name)
4111
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1115
"/ cg: no, this is not a good check.
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1116
"/                      (Smalltalk includesKey:nm asSymbol) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1117
                          changeSet1 add:nm
4111
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1118
"/                      ]  
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1119
                  ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1120
              ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1121
4111
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1122
              changeSet1 notEmpty ifTrue:[
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1123
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1124
                  "/ recompile all methods accessing set of changed classvars
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1125
                  "/ here and also in all subclasses ...
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1126
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1127
                  "/ dont update change file for the recompilation
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1128
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1129
                  Class withoutUpdatingChangesDo:[
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1130
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1131
"/                      Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1132
"/                          Transcript showCR:'recompiling class & inst methods accessing ' , changeSet1 printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1133
"/                          Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1134
"/                      ].
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1135
                      oldClass withAllSubclasses do:[:aClass |
4111
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1136
                          aClass class recompileMethodsAccessingAnyClassvarOrGlobal:changeSet1.
dd1d4e2afab7 faster recompilation if only a classVar was added/removed/renamed.
Claus Gittinger <cg@exept.de>
parents: 4095
diff changeset
  1137
                          aClass recompileMethodsAccessingAnyClassvarOrGlobal:changeSet1.
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1138
                      ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1139
                  ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1140
              ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1141
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1142
              "notify change of class"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1143
              changed ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1144
                  oldClass addChangeRecordForClass:oldClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1145
              ].  
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1146
              oldClass changed:#definition.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1147
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1148
              ^ oldClass
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1149
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1150
          ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1151
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1152
      ]
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1153
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1154
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1155
    "/ here we enter the darkness of mordor ...
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1156
    "/ since instance variable layout and/or inheritance has changed.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1157
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1158
    (newComment ~= oldClass comment) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1159
        newClass comment:newComment
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1160
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1161
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1162
    "/ dont allow built-in classes to be modified this way
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1163
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1164
    (oldClass notNil and:[oldClass isBuiltInClass and:[superClassChange]]) ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1165
        self error:'the inheritance of this class is fixed - you cannot change it'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1166
        ^ oldClass
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1167
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1168
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1169
    "/ since we will change the inheritance of some class(es)
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1170
    Behavior flushSubclassInfo.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1171
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1172
    "/ catch special case, where superclass changed its layout and thus
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1173
    "/ forced redefinition of this class; 
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1174
    "/ only log if this is not the case.
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1175
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1176
    changed ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1177
        (superClassChange 
3614
51d01f893c63 care for nil superclass when comparing names.
Claus Gittinger <cg@exept.de>
parents: 3596
diff changeset
  1178
         and:[(oldSuperClass isNil or:[newSuperClass notNil and:[oldSuperClass name = newSuperClass name]])
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1179
         and:[(oldClassVars = newClassVars) 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1180
         and:[(oldInstVars = newInstVars)
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1181
         and:[newComment = oldClass comment]]]]) ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1182
            newClass addChangeRecordForClass:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1183
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1184
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1185
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1186
    "/ care for class methods ...
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1187
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1188
    changeSet1 := Set new.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1189
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1190
    classVarChange := false.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1191
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1192
    superClassChange ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1193
        (oldSuperClass notNil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1194
        and:[newSuperClass notNil
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1195
        and:[oldSuperClass allClassVarNames = newSuperClass allClassVarNames
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1196
        and:[oldSuperClass name = newSuperClass name
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1197
        and:[oldClassVars = newClassVars]]]])
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1198
        ifTrue:[
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1199
2684
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1200
"/            Transcript showCR:'keep class methods (same classvars)'.
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1201
"/            Transcript endEntry.
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1202
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1203
            "/ class methods still work
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1204
2684
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1205
            self copyMethodsFrom:(oldClass class) for:newMetaclass.
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1206
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1207
"/            Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1208
"/                Transcript showCR:'recompiling class methods accessing super ...'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1209
"/                Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1210
"/            ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1211
2684
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1212
            "/ however, those accessing super must be recompiled
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1213
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1214
            self copyInvalidatedMethodsFrom:(oldClass class) 
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1215
                                        for:newMetaclass 
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1216
                               accessingAny:#()
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1217
                                    orSuper:true.
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1218
        ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1219
            "/ superclass changed:
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1220
            "/  must recompile all class methods accessing ANY classvar
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1221
            "/  (actually, we could be less strict and handle the case where
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1222
            "/   both the old and the new superclass have a common ancestor,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1223
            "/   and both have no new classvariables in between.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1224
            "/   This would speedup the case when a class is inserted into
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1225
            "/   the inheritance chain.)
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1226
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1227
            oldClass allClassVarNames do:[:nm | changeSet1 add:nm].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1228
            newClass allClassVarNames do:[:nm | changeSet1 add:nm].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1229
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1230
"/            Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1231
"/                Transcript showCR:'recompiling class methods accessing any classvar or super ...'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1232
"/                Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1233
"/            ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1234
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1235
            self copyInvalidatedMethodsFrom:(oldClass class) 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1236
                                        for:newMetaclass 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1237
                               accessingAny:changeSet1
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1238
                                    orSuper:true.
2684
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1239
        ].
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1240
        newMetaclass recompileInvalidatedMethods.
011188940530 recompile class methods accessing super ...
Claus Gittinger <cg@exept.de>
parents: 2668
diff changeset
  1241
    ] ifFalse:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1242
        "/ same superclass, find out which classvars have changed
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1243
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1244
        classVarChange := oldClassVars ~= newClassVars.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1245
        classVarChange ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1246
            oldClassVars do:[:nm |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1247
                (newClassVars includes:nm) ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1248
                    changeSet1 add:nm
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1249
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1250
            ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1251
            newClassVars do:[:nm |
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1252
                (oldClassVars includes:nm) ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1253
                    changeSet1 add:nm
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1254
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1255
            ].
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1256
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1257
            "/ must recompile some class-methods
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1258
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1259
"/            Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1260
"/                Transcript showCR:'recompiling class methods accessing ' , changeSet1 printString.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1261
"/                Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1262
"/            ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1263
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1264
            self copyInvalidatedMethodsFrom:(oldClass class) for:newMetaclass accessingAny:changeSet1.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1265
            newMetaclass recompileInvalidatedMethods.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1266
        ] ifFalse:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1267
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1268
            "/ class methods still work
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1269
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1270
            self copyMethodsFrom:(oldClass class) for:newMetaclass
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1271
        ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1272
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1273
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1274
    "/ care for instance methods ...
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1275
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1276
    superClassChange ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1277
        "/ superclass changed,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1278
        "/  must recompile all methods accessing any class or instvar.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1279
        "/  If number of instvars (i.e. the instances instSize) is the same,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1280
        "/  we can limit the set of recompiled instance methods to those methods,
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1281
        "/  which refer to an instvar with a different inst-index
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1282
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1283
        "/ the changeset consists of instance variables, 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1284
        "/ with a different position
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1285
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1286
        changeSet2 := self differentInstanceVariableOffsetsIn:oldClass and:newClass.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1287
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1288
        "/ merge in the changed class variables
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1289
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1290
        changeSet1 do:[:nm | changeSet2 add:nm].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1291
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1292
"/        Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1293
"/             Transcript showCR:'recompiling instance methods accessing ' , changeSet2 printString , ' [superclass change]...'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1294
"/             Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1295
"/        ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1296
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1297
        self copyInvalidatedMethodsFrom:oldClass 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1298
                                    for:newClass 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1299
                           accessingAny:changeSet2
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1300
                                orSuper:true.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1301
        newClass recompileInvalidatedMethods.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1302
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1303
    ] ifFalse:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1304
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1305
        "/ same inheritance ...
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1306
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1307
        instVarChange := oldInstVars ~= newInstVars.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1308
        instVarChange ifFalse:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1309
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1310
            "/ same instance variables ...
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1311
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1312
            classVarChange ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1313
                "recompile all inst methods accessing changed classvars"
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1314
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1315
"/                Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1316
"/                    Transcript showCR:'recompiling instance methods accessing classvars ' , changeSet1 printString , ' ...'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1317
"/                    Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1318
"/                ].
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1319
                self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet1.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1320
                newClass recompileInvalidatedMethods.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1321
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1322
        ] ifTrue:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1323
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1324
            "/ dont allow built-in classes to be modified
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1325
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1326
            (oldClass notNil and:[oldClass isBuiltInClass and:[instVarChange]]) ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1327
                self error:'the layout of this class is fixed - you cannot change it'.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1328
                ^ oldClass
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1329
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1330
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1331
            ((oldInstVars size == 0) 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1332
            or:[newInstVars startsWith:oldInstVars]) ifTrue:[
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1333
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1334
                "/ only new inst variable(s) has/have been added - 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1335
                "/ old methods still work (the existing inst-indices are still valid)
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1336
4094
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1337
"/                Transcript showCR:'copying methods ...'.
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1338
"/                Transcript endEntry.
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1339
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1340
                self copyMethodsFrom:oldClass for:newClass.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1341
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1342
                "/ but: we have to recompile all methods accessing new instars
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1343
                "/ (it might have been a classVar/global before ...)
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1344
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1345
                addedNames := newInstVars select:[:nm | (oldInstVars includes:nm) not].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1346
                "merge in class variables"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1347
                changeSet1 do:[:nm | addedNames add:nm].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1348
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1349
"/                Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1350
"/                    Transcript showCR:'recompiling instance methods accessing ' , addedNames printString ,  '... [added instvars]'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1351
"/                    Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1352
"/                ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1353
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1354
                newClass recompileMethodsAccessingAny:addedNames.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1355
            ] ifFalse:[
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1356
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1357
                "/ the changeset consists of instance variables, 
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1358
                "/ with a different position
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1359
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1360
                changeSet2 := self differentInstanceVariableOffsetsIn:oldClass and:newClass.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1361
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1362
                "merge in the class variables"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1363
                changeSet1 do:[:nm | changeSet2 add:nm].
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1364
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1365
"/                Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1366
"/                    Transcript showCR:'recompiling instance methods accessing ' , changeSet2 printString , ' ... [changed instvars]'.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1367
"/                    Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1368
"/                ].
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1369
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1370
                self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet2.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1371
                newClass recompileInvalidatedMethods.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1372
            ].
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1373
        ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1374
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1375
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1376
    "/ WOW, everything done for this class
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1377
    "/ what about subclasses ?
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1378
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1379
    "/ update superclass of immediate subclasses - 
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1380
    "/ this forces recompilation (recursively) if needed
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1381
    "/ (dont update change file for the subclass changes)
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1382
3629
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1383
    Class classRedefinitionSignal answer:#keep do:[
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1384
        Class withoutUpdatingChangesDo:[
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1385
            oldClass subclasses copy do:[:aClass |
4094
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1386
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1387
"/                Transcript showCR:'changing superclass of:' , aClass name.
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1388
"/                Transcript endEntry.
Claus Gittinger <cg@exept.de>
parents: 4057
diff changeset
  1389
3629
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1390
                aClass superclass:newClass
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1391
            ]
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1392
        ]
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1393
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1394
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1395
    "/ change any private subclasses' owners
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1396
1819
e53f745ed80b when changing a class, do not forget to move the privateClasses
Claus Gittinger <cg@exept.de>
parents: 1809
diff changeset
  1397
    oldClass privateClassesDo:[:aClass |
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1398
        aClass class setOwningClass:newClass
1819
e53f745ed80b when changing a class, do not forget to move the privateClasses
Claus Gittinger <cg@exept.de>
parents: 1809
diff changeset
  1399
    ].
e53f745ed80b when changing a class, do not forget to move the privateClasses
Claus Gittinger <cg@exept.de>
parents: 1809
diff changeset
  1400
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1401
    "/ change category in oldClass - so we see immediately what it is ...
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1402
2108
09db34dc073f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2106
diff changeset
  1403
    oldCategory := oldClass category.
1655
fb6ee1b55ec4 use *-categories
Claus Gittinger <cg@exept.de>
parents: 1515
diff changeset
  1404
    oldClass category:#'* obsolete *'.
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1405
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1406
    "/ and make the new class globally known
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1407
1829
9e2a9fea35d0 ask to create nameSpace if it does not exist.
Claus Gittinger <cg@exept.de>
parents: 1821
diff changeset
  1408
    namespace notNil ifTrue:[
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1409
        thisIsPrivate ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1410
            namespace privateClassesAt:classSymbol put:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1411
        ] ifFalse:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1412
            namespace at:nameKey put:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1413
            namespace == Smalltalk ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1414
                self checkForAliasesOf:oldClass with:newClass.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1415
            ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1416
2668
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1417
            oldCategory ~= categoryString ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1418
                "notify change of organization"
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1419
                namespace changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1420
                namespace ~~ Smalltalk ifTrue:[
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1421
                    Smalltalk changed:#organization.
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1422
                ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1423
            ]
fb4a2e42a60d Metaclass no longer responds to #category:
Claus Gittinger <cg@exept.de>
parents: 2666
diff changeset
  1424
        ].
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1425
    ].
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1426
2440
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1427
    "/ Not becoming the old class creates some update problems;
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1428
    "/ the browsers must check carefully - a simple identity compare is
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1429
    "/ not enough ...
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1430
    "/ QUESTION: is this a good idea ?
c6e6beba8184 try to avoid flushing of the subClassInfo;
Claus Gittinger <cg@exept.de>
parents: 2415
diff changeset
  1431
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1432
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1433
    newClass dependents:(oldClass dependents).
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1434
    newClass changed:#definition.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1435
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1436
    "just to make certain ... - tell dependents of oldClass, that something changed
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1437
     (systemBrowsers will react on this, and update their views)"
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1438
    oldClass changed:#definition with:newClass.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1440
    ObjectMemory flushCaches.
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1441
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1442
    ^ newClass
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1443
3587
e7359c9f22d4 keep old package when redefining a class.
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
  1444
    "Created: / 26.5.1996 / 11:55:26 / cg"
3629
e26cadd7ede5 auto-keep package in subclasses - when changing a classes definition
Claus Gittinger <cg@exept.de>
parents: 3614
diff changeset
  1445
    "Modified: / 20.6.1998 / 18:08:25 / cg"
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1446
    "Modified: / 18.3.1999 / 18:23:31 / stefan"
1439
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1447
!
d8a58d20a93c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1416
diff changeset
  1448
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1449
name:newName inEnvironment:aSystemDictionary
2688
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1450
             subclassOf:aClass
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1451
             instanceVariableNames:stringOfInstVarNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1452
             variable:variableBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1453
             words:wordsBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1454
             pointers:pointersBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1455
             classVariableNames:stringOfClassVarNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1456
             poolDictionaries:stringOfPoolNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1457
             category:categoryString
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1458
             comment:commentString
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1459
             changed:changed
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1460
885
ca805f0f4984 changed class creation to allow create including classInstVars (may be used to avoid recompilation)
Claus Gittinger <cg@exept.de>
parents: 870
diff changeset
  1461
    ^ self
2688
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1462
        name:newName 
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1463
        in:aSystemDictionary
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1464
        subclassOf:aClass
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1465
        instanceVariableNames:stringOfInstVarNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1466
        variable:variableBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1467
        words:wordsBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1468
        pointers:pointersBoolean
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1469
        classVariableNames:stringOfClassVarNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1470
        poolDictionaries:stringOfPoolNames
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1471
        category:categoryString
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1472
        comment:commentString
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1473
        changed:changed
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1474
        classInstanceVariableNames:nil
885
ca805f0f4984 changed class creation to allow create including classInstVars (may be used to avoid recompilation)
Claus Gittinger <cg@exept.de>
parents: 870
diff changeset
  1475
2688
a7777c381e7e care for classInstVars when redefining superclass
Claus Gittinger <cg@exept.de>
parents: 2687
diff changeset
  1476
    "Modified: 16.6.1997 / 11:53:58 / cg"
885
ca805f0f4984 changed class creation to allow create including classInstVars (may be used to avoid recompilation)
Claus Gittinger <cg@exept.de>
parents: 870
diff changeset
  1477
!
ca805f0f4984 changed class creation to allow create including classInstVars (may be used to avoid recompilation)
Claus Gittinger <cg@exept.de>
parents: 870
diff changeset
  1478
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1479
new
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1480
    "create & return a new metaclass (a classes class).
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1481
     Since metaclasses only have one instance (the class),
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1482
     complain if there is already one.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1483
     You get a new class by sending #new to the returned metaclass
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1484
     (confusing - isn't it ?)"
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1485
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1486
    |newClass|
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1487
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1488
    myClass notNil ifTrue:[
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1489
        ^ self error:'Each metaclass may only have one instance'.
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1490
    ].
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1491
    newClass := self basicNew.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1492
    newClass setSuperclass:Object
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1493
          methodDictionary:MethodDictionary new
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1494
                instSize:0 
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1495
                   flags:(Behavior flagBehavior).
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1496
    myClass := newClass.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1497
    ^ newClass
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1498
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1499
    "Modified: 1.4.1997 / 15:44:50 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1500
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1501
3640
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1502
!Metaclass methodsFor:'fileOut'!
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1503
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1504
fileOutDefinitionOn:aStream
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1505
    myClass fileOutClassInstVarDefinitionOn:aStream
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1506
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1507
    "Modified: / 21.6.1998 / 04:10:02 / cg"
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1508
! !
523d80dfc3ac added #fileOutDefinitionOn: (show c-instVars) for ST80 compatibility
Claus Gittinger <cg@exept.de>
parents: 3629
diff changeset
  1509
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1510
!Metaclass methodsFor:'private'!
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1511
1752
1ef6932982a2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1749
diff changeset
  1512
checkConventionsFor:className subClassOf:aClass instVarNames:instVarNameString classVarNames:classVarNameString
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1513
    "Check for some 'considered bad-style' things, like lower case names.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1514
     NOTICE:
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1515
     I dont like the confirmers below - we need a notifying: argument, to give
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1516
     the outer codeview a chance to highlight the error.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1517
     (but thats how its defined in the book - maybe I will change it anyway).
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1518
    "
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1519
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1520
    |names idx what doChecks answ|
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1521
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1522
    doChecks := ConfirmationQuerySignal query.
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1523
    doChecks == false ifTrue:[^ true].
1752
1ef6932982a2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1749
diff changeset
  1524
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1525
    "let user confirm, if the classname is no good"
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1526
    className first isUppercase ifFalse:[
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1527
        aClass == Namespace ifTrue:[
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1528
            what := 'namespace'
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1529
        ] ifFalse:[
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1530
            what := 'class'
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1531
        ].
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1532
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1533
        answ := Class classConventionViolationConfirmationQuerySignal query.
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1534
        answ notNil ifTrue:[^ answ].
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1535
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1536
        (self confirm:(what , ' name ''' , className , 
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1537
                             ''' should start with an uppercase letter
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1538
(by convention only)
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1539
2008
381a5160be9a only a nicer warning message
Claus Gittinger <cg@exept.de>
parents: 2002
diff changeset
  1540
install anyway ?') withCRs)
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1541
        ifFalse:[
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1542
            ^ false
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1543
        ]
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1544
    ].
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1545
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1546
    names := instVarNameString asCollectionOfWords.
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1547
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1548
    "let user confirm, if any instvarname is no good"
1936
7c2d0ae1a76d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
  1549
    (idx := names findFirst:[:word | word first isUppercase]) ~~ 0 ifTrue:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1550
        answ := Class classConventionViolationConfirmationQuerySignal query.
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1551
        answ notNil ifTrue:[^ answ].
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1552
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1553
        (self confirm:className , ': instance variable named ''' , (names at:idx) asText allBold , ''' 
1937
d8aa32975ead *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1936
diff changeset
  1554
should start with a lowercase letter (by convention only).
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1555
1937
d8aa32975ead *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1936
diff changeset
  1556
Install anyway ?' withCRs)
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1557
        ifFalse:[
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1558
            ^ false
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1559
        ]
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1560
    ].
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1561
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1562
    names := classVarNameString asCollectionOfWords. 
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1563
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1564
    "let user confirm, if any classvarname is no good"
1936
7c2d0ae1a76d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
  1565
    (idx := names findFirst:[:word | word first isLowercase]) ~~ 0 ifTrue:[
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1566
        answ := Class classConventionViolationConfirmationQuerySignal query.
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1567
        answ notNil ifTrue:[^ answ].
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1568
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1569
        (self confirm:className , ': class variable named ''' , (names at:idx) asText allBold  , ''' 
1937
d8aa32975ead *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1936
diff changeset
  1570
should start with an uppercase letter (by convention only).
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1571
1937
d8aa32975ead *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1936
diff changeset
  1572
Install anyway ?' withCRs)
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1573
        ifFalse:[
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1574
            ^ false
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  1575
        ].
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1576
    ].
308
f04744ef7b5d *** empty log message ***
claus
parents: 251
diff changeset
  1577
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1578
    ^ true
1752
1ef6932982a2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1749
diff changeset
  1579
3965
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1580
    "Created: / 15.10.1996 / 11:56:38 / cg"
cef66fdfff9e allow suppress of dialog when filed-in classes violate conventions
Claus Gittinger <cg@exept.de>
parents: 3804
diff changeset
  1581
    "Modified: / 3.2.1999 / 11:24:52 / cg"
4057
8a3481835e3c Use #query instead of #raise when invoking QuerySignals
Stefan Vogel <sv@exept.de>
parents: 4034
diff changeset
  1582
    "Modified: / 18.3.1999 / 18:22:47 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1583
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1584
1798
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1585
checkForAliasesOf:oldClass with:newClass
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1586
    "oldClass changed its identity (now use newClass).
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1587
     check if there are any global aliases, which should also be changed"
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1588
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1589
    Smalltalk keysAndValuesDo:[:nm :o |
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1590
	o == oldClass ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1591
	    nm ~~ oldClass name ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1592
		(self confirm:('The global `' , nm , ''' is an alias for ' , oldClass name , '.\\Change it to the new class ?') withCRs)
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1593
		ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1594
		    Smalltalk at:nm put:newClass
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1595
		]
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1596
	    ]
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1597
	]
1798
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1598
    ].
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1599
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1600
    "Created: 22.10.1996 / 15:20:59 / cg"
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1601
    "Modified: 22.10.1996 / 15:25:50 / cg"
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1602
!
543f1601bbeb look for aliases, when migrating classes
Claus Gittinger <cg@exept.de>
parents: 1778
diff changeset
  1603
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1604
checkInstvarRedefsWith:stringOfInstVarNames subclassOf:aClass old:oldClass name:newName
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1605
    |superInstVars msg|
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1606
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1607
    aClass notNil ifTrue:[
4348
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1608
        "
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1609
         check for instVar redef of superClass instVars
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1610
        "
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1611
        superInstVars := aClass allInstVarNames.
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1612
        stringOfInstVarNames asCollectionOfWords do:[:nm |
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1613
            (superInstVars includes:nm) ifTrue:[
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1614
                (oldClass notNil 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1615
                and:[stringOfInstVarNames = oldClass instanceVariableString])
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1616
                ifTrue:[
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1617
                    Transcript showCR:('instVar conflict in `' , newName , ''' for `' , nm , ''' due to superclass change.').
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1618
                    msg := 'instVar conflict in `' , newName , ''' for `' , nm , ''' due to superclass change.\You now have two different instVar slots with the same name.\\Dont forget to fix this later.'.
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1619
                    self warn:msg withCRs.
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1620
                ] ifFalse:[
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1621
                    Transcript showCR:('instVar `' , nm , ''' is already defined in a superclass of `' , newName , '''.').
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1622
                    msg := 'instVar `' , nm , ''' is already defined in a superclass.\Change the definition of `' , newName , ''' anyway ?\\Notice: you must fix the superclass later.'.
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1623
                    ^ self confirm:msg withCRs
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1624
                ].
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1625
            ]
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1626
        ].
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1627
    ].
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1628
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1629
    oldClass notNil ifTrue:[
4348
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1630
        "
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1631
         check for instVar redefs in subclass instVars
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1632
        "
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1633
        oldClass allSubclassesDo:[:sub |
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1634
            |vars|
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1635
4348
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1636
            vars := sub instVarNames.
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1637
            stringOfInstVarNames asCollectionOfWords do:[:nm |
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1638
                (vars includes:nm) ifTrue:[
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1639
                    ^ self confirm:('subclass ' 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1640
                                    , sub name 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1641
                                    , ' already defines an instVar named `' 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1642
                                    , nm 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1643
                                    , '''.\\Change the definition of `' 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1644
                                    , newName 
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1645
                                    , ''' anyway ?\Notice: you must fix the subclass later.'
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1646
                                   ) withCRs
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1647
                ]
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1648
            ]
c3c08808bfb6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4111
diff changeset
  1649
        ]
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1650
    ].
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1651
    ^ true
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1652
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1653
    "Created: 29.1.1997 / 17:42:11 / cg"
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1654
!
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1655
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1656
checkValidVarNamesFor:className subClassOf:aClass instVarNames:instVarNameString classVarNames:classVarNameString
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1657
    "Check for some 'considered bad-style' things, like lower case names.
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1658
     NOTICE:
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1659
     I dont like the confirmers below - we need a notifying: argument, to give
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1660
     the outer codeview a chance to highlight the error.
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1661
     (but thats how its defined in the book - maybe I will change it anyway).
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1662
    "
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1663
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1664
    |names|
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1665
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1666
    names := instVarNameString asCollectionOfWords.
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1667
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1668
    "check for instvar redefs within local instvars"
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1669
    names keysAndValuesDo:[:index :aName |
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1670
        (names indexOf:aName startingAt:index+1) ~~ 0 ifTrue:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1671
            self warn:'instance variable ''' , aName , '''\occurs multiple times in instVarString.\\Class not installed.' withCRs.
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1672
            ^ false.
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1673
        ]
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1674
    ].
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1675
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1676
    names := classVarNameString asCollectionOfWords. 
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1677
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1678
    "check for classvar redefs within local instvars"
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1679
    names keysAndValuesDo:[:index :aName |
4398
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1680
        (names indexOf:aName startingAt:index+1) ~~ 0 ifTrue:[
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1681
            self warn:'class variable ''' , aName , '''\occurs multiple times in classVarString.\\Class not installed.' withCRs.
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1682
            ^ false.
df208587581f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4348
diff changeset
  1683
        ]
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1684
    ].
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1685
    ^ true
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1686
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1687
    "Created: 8.1.1997 / 21:09:14 / cg"
2106
f9d613a66493 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2103
diff changeset
  1688
    "Modified: 9.1.1997 / 02:10:02 / cg"
2103
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1689
!
bb1c173afc55 more checks
Claus Gittinger <cg@exept.de>
parents: 2047
diff changeset
  1690
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1691
copyInvalidatedMethodsFrom:oldClass for:newClass
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1692
    "copy all methods from oldClass to newClass and change their code
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1693
     to a trap method reporting an error.
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1694
     This is done when a class has changed its layout or inheritance,
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1695
     before recompilation is attempted.
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1696
     This allows us to keep the source while trapping uncompilable (due to
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1697
     now undefined instvars) methods. Later compilation of these methods will show
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1698
     an error on the transcript and lead to the debugger once called."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1699
986
c3a9f590146d removed unused locals
Claus Gittinger <cg@exept.de>
parents: 943
diff changeset
  1700
    |trap trapCode trapByteCode oldMethod newMethod
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1701
     oldDict newDict|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1702
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1703
    oldDict := oldClass methodDictionary.
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1704
    newDict := MethodDictionary new:oldDict size.
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1705
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1706
    oldDict keysAndValuesDo:[ :sel :mthd |
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1707
	trap := mthd trapMethodForNumArgs:(mthd numArgs).
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1708
	trapCode := trap code.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1709
	trapByteCode := trap byteCode.
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1710
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1711
	mthd isWrapped ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1712
	    oldMethod := mthd originalMethod
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1713
	] ifFalse:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1714
	    oldMethod := mthd.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1715
	].
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1716
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1717
	newMethod := oldMethod copy.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1718
	newMethod makeInvalid.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1719
	newDict at:sel put:newMethod
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1720
    ].
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1721
        
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1722
    newClass methodDictionary:newDict.
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1723
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1724
    "Modified: 12.6.1996 / 10:44:27 / stefan"
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1725
    "Modified: 4.11.1996 / 22:55:57 / cg"
2
claus
parents: 1
diff changeset
  1726
!
claus
parents: 1
diff changeset
  1727
claus
parents: 1
diff changeset
  1728
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames
claus
parents: 1
diff changeset
  1729
    "copy all methods from oldClass to newClass. Those methods accessing
claus
parents: 1
diff changeset
  1730
     a variable in setOfNames will be copied as invalid method, leading to
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1731
     a trap when its executed. This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1732
     layout for all methods which are affected by the change."
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1733
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1734
    self copyInvalidatedMethodsFrom:oldClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1735
				for:newClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1736
		       accessingAny:setOfNames 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1737
			    orSuper:false 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1738
!
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1739
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1740
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames orSuper:superBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1741
    "copy all methods from oldClass to newClass. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1742
     Those methods accessing a variable in setOfNames will be copied as invalid method, 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1743
     leading to a trap when its executed. If superBoolean is true, this is also done
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1744
     for methods accessing super.  This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1745
     layout for all methods which are affected by the change."
2
claus
parents: 1
diff changeset
  1746
1875
215b61efaae9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1835
diff changeset
  1747
    |p source mustInvalidate
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1748
     oldMethod newMethod methodDict newMethodDict nNames|
2
claus
parents: 1
diff changeset
  1749
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1750
    methodDict := oldClass methodDictionary.
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1751
    newMethodDict := methodDict copy.
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1752
    nNames := setOfNames size.
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1753
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1754
    methodDict keysAndValuesDo:[:selector :method |
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1755
        method isWrapped ifTrue:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1756
            oldMethod := method originalMethod
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1757
        ] ifFalse:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1758
            oldMethod := method
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1759
        ].
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1760
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1761
        "before parsing (which may take some time),
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1762
         do a string search if its only one variable,
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1763
         we are looking for.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1764
         Could look for more than one variable by string compare, but then
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1765
         parsing it right away may be faster ..."
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1766
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1767
        source := oldMethod source.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1768
        ((nNames == 1) and:[superBoolean not]) ifTrue:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1769
            mustInvalidate := (source findString:(setOfNames first)) ~~ 0.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1770
        ] ifFalse:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1771
            ((nNames == 0) and:[superBoolean]) ifTrue:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1772
                mustInvalidate := (source findString:'super') ~~ 0.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1773
            ] ifFalse:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1774
                mustInvalidate := true
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1775
            ].
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1776
        ].
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1777
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1778
        mustInvalidate ifTrue:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1779
            "we have to parse it ..."
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1780
            p := Parser parseMethod:source in:newClass.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1781
            (p isNil 
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1782
             or:[(p usedVars includesAny:setOfNames)
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1783
             or:[superBoolean and:[p usesSuper]]]) ifFalse:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1784
                mustInvalidate := false
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1785
            ]
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1786
        ].
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 195
diff changeset
  1787
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1788
        mustInvalidate ifTrue:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1789
            newMethod := oldMethod copy.
4095
12e870f233c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4094
diff changeset
  1790
"/            Smalltalk silentLoading ifFalse:[
12e870f233c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4094
diff changeset
  1791
"/                Transcript showCR:'invalidating ' , selector , '...'.
12e870f233c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4094
diff changeset
  1792
"/	      ].
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1793
            newMethod makeInvalid.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1794
        ] ifFalse:[
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1795
            newMethod := oldMethod.
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1796
        ].
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1797
        newMethodDict at:selector put:newMethod
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1798
    ].
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1799
    newClass methodDictionary:newMethodDict.
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1800
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1801
    "Modified: 7.6.1996 / 08:33:52 / stefan"
2700
71d1736d40f4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2688
diff changeset
  1802
    "Modified: 19.6.1997 / 18:27:09 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1803
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1804
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1805
copyMethodsFrom:oldClass for:newClass
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1806
    "copy all methods from oldClass to newClass.
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1807
     This is used for class-methods when a class has changed, but its metaclass is 
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1808
     unaffected (i.e. classVars/inheritance have not changed) so there is no need
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1809
     to recompile the class methods."
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1810
1461
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1811
    newClass methodDictionary:(oldClass methodDictionary copy).
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1812
dd25bb1e9973 Use methodDictionary instead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 1442
diff changeset
  1813
    "Modified: 7.6.1996 / 08:34:43 / stefan"
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1814
!
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1815
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1816
differentInstanceVariableOffsetsIn:class1 and:class2
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1817
    "return a set of instance variable names which have different
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1818
     positions in class1 and class2.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1819
     Also, variables which are only present in one class are returned.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1820
     This is used to find methods which need recompilation after a
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1821
     change in the instance variable layout."
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1822
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1823
    |offsets1 offsets2 changeSet|
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1824
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1825
    changeSet := Set new.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1826
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1827
    "
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1828
     collect the instvar-indices in the old and new class
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1829
    "
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1830
    offsets1 := class1 instanceVariableOffsets.
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1831
    offsets2 := class2 instanceVariableOffsets.
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1832
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1833
    "
912
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1834
     compute the changeset as a set of instance variables, 
a009f25a6800 be careful with self-chaning selector/methodArrays (done in VM's lookup)
Claus Gittinger <cg@exept.de>
parents: 904
diff changeset
  1835
     which have a different position
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1836
    "
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1837
    offsets1 keysAndValuesDo:[:varName :varIndex |
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1838
	(offsets2 includesKey:varName) ifFalse:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1839
	    changeSet add:varName 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1840
	] ifTrue:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1841
	    (varIndex ~~ (offsets2 at:varName)) ifTrue:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1842
		changeSet add:varName 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1843
	    ]
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1844
	]
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1845
    ].
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1846
    offsets2 keysAndValuesDo:[:varName :varIndex |
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1847
	(offsets1 includesKey:varName) ifFalse:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1848
	    changeSet add:varName
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1849
	] ifTrue:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1850
	    (varIndex ~~ (offsets1 at:varName)) ifTrue:[
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1851
		changeSet add:varName
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1852
	    ]
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1853
	]
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1854
    ].
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1855
    ^ changeSet
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1856
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1857
    "
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1858
     View class 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1859
	differentInstanceVariableOffsetsIn:View
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1860
				       and:StandardSystemView
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1861
     View class 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1862
	differentInstanceVariableOffsetsIn:Object 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1863
				       and:Point 
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  1864
    "
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1865
!
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1866
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1867
recompileGlobalAccessorsTo:aGlobalKey in:aNamespace except:someClass
2313
f7b903af509d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1868
    "when a new class enters a namespace, all accessors to the same-named
f7b903af509d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1869
     class in smalltalk must be recompiled"
f7b903af509d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1870
3804
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1871
    |blk|
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1872
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1873
    blk := [:aClass |
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1874
        aClass ~~ someClass ifTrue:[
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1875
            aClass isLoaded ifTrue:[
4032
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1876
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1877
"/                Smalltalk silentLoading ifFalse:[
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1878
"/                    Transcript showCR:'recompiling methods in ''' , aClass name , ''' accessing ''' , aGlobalKey , ''''.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1879
"/                    Transcript endEntry.
1c3822a69aeb disabled 'recompiling' info messages
Claus Gittinger <cg@exept.de>
parents: 4030
diff changeset
  1880
"/                ].
4027
4385bdb59ec1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3998
diff changeset
  1881
3804
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1882
                aClass recompileMethodsAccessingGlobal:aGlobalKey.
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1883
                aClass class recompileMethodsAccessingGlobal:aGlobalKey.
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1884
                "/ actually - must eventually recompile USERS of this namespace too
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1885
            ]
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1886
        ]
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1887
    ].
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1888
    aNamespace isNamespace ifTrue:[
3998
361746a3ad11 oops - when recompiling global accessors,
Claus Gittinger <cg@exept.de>
parents: 3965
diff changeset
  1889
        aNamespace allBehaviorsDo:[:cls |
4399
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
  1890
            cls isLoaded ifTrue:[  "/ no need to compile unloaded ones
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
  1891
                blk value:cls.
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
  1892
                cls allPrivateClassesDo:blk
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
  1893
            ]
3998
361746a3ad11 oops - when recompiling global accessors,
Claus Gittinger <cg@exept.de>
parents: 3965
diff changeset
  1894
        ]
3804
cde2641a3f91 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3778
diff changeset
  1895
    ] ifFalse:[
3998
361746a3ad11 oops - when recompiling global accessors,
Claus Gittinger <cg@exept.de>
parents: 3965
diff changeset
  1896
        aNamespace allPrivateClassesDo:blk
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1897
    ]
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1898
2340
1225948b7473 no recompilation messages
Claus Gittinger <cg@exept.de>
parents: 2322
diff changeset
  1899
    "Modified: 31.1.1997 / 11:22:57 / cg"
2308
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1900
!
db44ef9a050e when adding a class in a nameSpace, recompile accessors of
Claus Gittinger <cg@exept.de>
parents: 2233
diff changeset
  1901
1047
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
  1902
setSoleInstance:aClass 
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
  1903
    myClass := aClass
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
  1904
5d4d1c7411ab dont clobber the binaryRevision from a nonBinary-one
ca
parents: 986
diff changeset
  1905
    "Created: 12.12.1995 / 13:46:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1906
! !
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1907
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1908
!Metaclass methodsFor:'queries'!
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1909
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1910
category
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1911
    "return my category"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1912
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1913
    ^ myClass category
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1914
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1915
    "Created: 2.4.1997 / 00:46:11 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1916
!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1917
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1918
comment
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1919
    "return my comment"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1920
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1921
    ^ myClass comment
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1922
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1923
    "Created: 2.4.1997 / 00:51:35 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1924
!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1925
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1926
isBuiltInClass
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
  1927
    "return true if this class is known by the run-time-system.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
  1928
     Here, true is returned for myself, false for subclasses."
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
  1929
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1930
    ^ self == Metaclass class or:[self == Metaclass]
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1931
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1932
    "Created: 15.4.1996 / 17:17:34 / cg"
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1179
diff changeset
  1933
    "Modified: 23.4.1996 / 15:59:37 / cg"
1179
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1934
!
3e0f32177af4 allow subclasses of Class to be changed
Claus Gittinger <cg@exept.de>
parents: 1087
diff changeset
  1935
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1936
isMeta
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1937
    "return true, if the receiver is some kind of metaclass;
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1938
     true is returned here. Redefines isMeta in Object"
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1939
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1940
    ^ true
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1941
!
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1942
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1943
name
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1944
    "return my name - that is the name of my sole class, with ' class'
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1945
     appended."
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1946
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1947
    |nm|
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1948
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1949
    myClass isNil ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1950
        ^ #someMetaclass
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1951
    ].
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1952
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1953
    (nm := myClass name) isNil ifTrue:[
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1954
        'Metaclass [warning]: no name in my class' errorPrintCR.
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1955
        ^ #'unnamed class'
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1956
    ].
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1957
    ^ nm , ' class'
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1958
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1959
    "Modified: 10.1.1997 / 17:55:08 / cg"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1960
    "Modified: 1.4.1997 / 15:53:11 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1961
!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  1962
1920
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1963
nameSpace
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1964
    "return the nameSpace I am contained in.
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1965
     Due to the implementation of nameSpaces (as classVariables),
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1966
     a class can only be contained in one nameSpace (which is the desired)"
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1967
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1968
    "/ this information is in the class
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1969
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1970
    ^ myClass nameSpace
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1971
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1972
    "Created: 7.11.1996 / 13:18:52 / cg"
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1973
!
6178e0048794 added namespace query
Claus Gittinger <cg@exept.de>
parents: 1916
diff changeset
  1974
1724
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1975
owningClass
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1976
    "return nil here - regular metaclasses are never private"
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1977
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1978
    ^ nil
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1979
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1980
    "Created: 12.10.1996 / 20:12:16 / cg"
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1981
!
ef3f680996db support for private classes
Claus Gittinger <cg@exept.de>
parents: 1698
diff changeset
  1982
1757
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1983
package
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1984
    "return my package-id"
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1985
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1986
    ^ myClass package
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1987
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1988
    "Created: 15.10.1996 / 19:44:51 / cg"
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1989
!
c153e56cbcad *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1752
diff changeset
  1990
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1991
soleInstance 
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1992
    "return my sole class."
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1993
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  1994
    ^ myClass
2047
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  1995
!
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  1996
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  1997
topOwningClass
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  1998
    "return nil here - regular metaclasses are never private"
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  1999
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  2000
    ^ nil
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  2001
8150a3ae6fa0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2039
diff changeset
  2002
    "Created: 3.1.1997 / 19:18:06 / cg"
457
41c73cbee305 change classes versionString when class changes (prepare for sourceCode system)
Claus Gittinger <cg@exept.de>
parents: 423
diff changeset
  2003
! !
621
87602c9d071c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 566
diff changeset
  2004
2666
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2005
!Metaclass methodsFor:'source management'!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2006
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2007
binaryRevision
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2008
    ^ myClass binaryRevision
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2009
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2010
    "
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2011
     Object binaryRevision
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2012
     Object class binaryRevision
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2013
    "
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2014
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2015
    "Modified: 2.4.1997 / 01:17:04 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2016
!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2017
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2018
sourceStream
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2019
    "return the classes source stream"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2020
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2021
    ^ myClass sourceStream
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2022
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2023
    "Modified: 1.4.1997 / 14:36:31 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2024
!
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2025
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2026
sourceStreamFor:className
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2027
    "return the sourceStream for className"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2028
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2029
    ^ myClass sourceStreamFor:className
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2030
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2031
    "Modified: 1.4.1997 / 14:36:38 / stefan"
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2032
! !
7981b615b48a Make Metaclass a subclass of ClassDescription instead of Class.
Stefan Vogel <sv@exept.de>
parents: 2584
diff changeset
  2033
1742
e1ee359969f5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1733
diff changeset
  2034
!Metaclass class methodsFor:'documentation'!
639
9ff94fa31be6 version at the end
Claus Gittinger <cg@exept.de>
parents: 621
diff changeset
  2035
9ff94fa31be6 version at the end
Claus Gittinger <cg@exept.de>
parents: 621
diff changeset
  2036
version
4399
b2ef9e2347bd checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4398
diff changeset
  2037
    ^ '$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.147 1999-07-16 18:49:45 cg Exp $'
639
9ff94fa31be6 version at the end
Claus Gittinger <cg@exept.de>
parents: 621
diff changeset
  2038
! !
2822
64829ed8f8c6 allow for conventions-dialog to be suppressed (offer a querySignal)
Claus Gittinger <cg@exept.de>
parents: 2700
diff changeset
  2039
Metaclass initialize!