|
@@ -394,38 +394,44 @@ ClassBuilder is responsible for compiling new classes or modifying existing clas
|
|
|
|
|
|
Rather than using ClassBuilder directly to compile a class, use `Class >> subclass:instanceVariableNames:package:`.!
|
|
Rather than using ClassBuilder directly to compile a class, use `Class >> subclass:instanceVariableNames:package:`.!
|
|
|
|
|
|
-!ClassBuilder methodsFor: 'api'!
|
|
|
|
|
|
+!ClassBuilder methodsFor: 'accessing'!
|
|
|
|
|
|
-class: aClass instanceVariableNames: aString
|
|
|
|
- self basicClass: aClass instanceVariableNames: aString.
|
|
|
|
- self setupClass: aClass.
|
|
|
|
|
|
+instanceVariableNamesFor: aString
|
|
|
|
+ ^(aString tokenize: ' ') reject: [ :each | each isEmpty ]
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ClassBuilder methodsFor: 'class definition'!
|
|
|
|
+
|
|
|
|
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
|
|
|
|
+ | theClass |
|
|
|
|
|
|
- SystemAnnouncer current
|
|
|
|
- announce: (ClassDefinitionChanged new
|
|
|
|
- theClass: aClass;
|
|
|
|
- yourself)
|
|
|
|
-!
|
|
|
|
|
|
+ theClass := Smalltalk current at: aString.
|
|
|
|
+
|
|
|
|
+ theClass ifNotNil: [
|
|
|
|
+ theClass superclass == aClass ifFalse: [
|
|
|
|
+ ^ self
|
|
|
|
+ migrateClassNamed: aString
|
|
|
|
+ superclass: aClass
|
|
|
|
+ instanceVariableNames: aCollection
|
|
|
|
+ package: packageName ] ].
|
|
|
|
|
|
-installMethod: aCompiledMethod forClass: aBehavior category: aString
|
|
|
|
- aCompiledMethod category: aString.
|
|
|
|
- aBehavior addCompiledMethod: aCompiledMethod.
|
|
|
|
- self setupClass: aBehavior.
|
|
|
|
- ^aCompiledMethod
|
|
|
|
|
|
+ ^ self
|
|
|
|
+ basicAddSubclassOf: aClass
|
|
|
|
+ named: aString
|
|
|
|
+ instanceVariableNames: aCollection
|
|
|
|
+ package: packageName
|
|
!
|
|
!
|
|
|
|
|
|
-renameClass: aClass to: aString
|
|
|
|
- self basicRenameClass: aClass to: aString.
|
|
|
|
|
|
+class: aClass instanceVariableNames: aString
|
|
|
|
+ self basicClass: aClass instanceVariableNames: aString.
|
|
|
|
+ self setupClass: aClass.
|
|
|
|
|
|
SystemAnnouncer current
|
|
SystemAnnouncer current
|
|
- announce: (ClassRenamed new
|
|
|
|
|
|
+ announce: (ClassDefinitionChanged new
|
|
theClass: aClass;
|
|
theClass: aClass;
|
|
yourself)
|
|
yourself)
|
|
!
|
|
!
|
|
|
|
|
|
-setupClass: aClass
|
|
|
|
- <smalltalk.init(aClass);>
|
|
|
|
-!
|
|
|
|
-
|
|
|
|
superclass: aClass subclass: aString
|
|
superclass: aClass subclass: aString
|
|
^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
|
|
^self superclass: aClass subclass: aString instanceVariableNames: '' package: nil
|
|
!
|
|
!
|
|
@@ -446,64 +452,60 @@ superclass: aClass subclass: aString instanceVariableNames: aString2 package: aS
|
|
^newClass
|
|
^newClass
|
|
! !
|
|
! !
|
|
|
|
|
|
-!ClassBuilder methodsFor: 'private'!
|
|
|
|
|
|
+!ClassBuilder methodsFor: 'class migration'!
|
|
|
|
|
|
-addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
|
|
|
|
- | theClass |
|
|
|
|
|
|
+migrateClass: aClass superclass: anotherClass
|
|
|
|
+ console log: aClass name.
|
|
|
|
+ self
|
|
|
|
+ migrateClassNamed: aClass name
|
|
|
|
+ superclass: anotherClass
|
|
|
|
+ instanceVariableNames: aClass instanceVariableNames
|
|
|
|
+ package: aClass package name
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+migrateClassNamed: aString superclass: aClass instanceVariableNames: aCollection package: packageName
|
|
|
|
+ | oldClass newClass tmp |
|
|
|
|
|
|
- theClass := Smalltalk current at: aString.
|
|
|
|
|
|
+ tmp := 'new*', aString.
|
|
|
|
+ oldClass := Smalltalk current at: aString.
|
|
|
|
|
|
- theClass ifNotNil: [
|
|
|
|
- theClass superclass == aClass ifFalse: [
|
|
|
|
- ^ self
|
|
|
|
- migrateClassNamed: aString
|
|
|
|
- superclass: aClass
|
|
|
|
- instanceVariableNames: aCollection
|
|
|
|
- package: packageName ] ].
|
|
|
|
-
|
|
|
|
- ^ self
|
|
|
|
- basicAddSubclassOf: aClass
|
|
|
|
- named: aString
|
|
|
|
- instanceVariableNames: aCollection
|
|
|
|
- package: packageName
|
|
|
|
-!
|
|
|
|
|
|
+ newClass := self
|
|
|
|
+ addSubclassOf: aClass
|
|
|
|
+ named: tmp
|
|
|
|
+ instanceVariableNames: aCollection
|
|
|
|
+ package: packageName.
|
|
|
|
|
|
-basicAddSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
|
|
|
|
- <
|
|
|
|
- smalltalk.addClass(aString, aClass, aCollection, packageName);
|
|
|
|
- return smalltalk[aString]
|
|
|
|
- >
|
|
|
|
-!
|
|
|
|
|
|
+ self basicSwapClassNames: oldClass with: newClass.
|
|
|
|
|
|
-basicClass: aClass instanceVariableNames: aString
|
|
|
|
- self basicClass: aClass instanceVariables: (self instanceVariableNamesFor: aString)
|
|
|
|
-!
|
|
|
|
|
|
+ [ self copyClass: oldClass to: newClass ]
|
|
|
|
+ on: Error
|
|
|
|
+ do: [ :exception |
|
|
|
|
+ self
|
|
|
|
+ basicSwapClassNames: oldClass with: newClass;
|
|
|
|
+ basicRemoveClass: newClass.
|
|
|
|
+ exception signal ].
|
|
|
|
|
|
-basicClass: aClass instanceVariables: aCollection
|
|
|
|
|
|
+ self
|
|
|
|
+ rawRenameClass: oldClass to: tmp;
|
|
|
|
+ rawRenameClass: newClass to: aString.
|
|
|
|
|
|
- aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
|
|
|
|
- aClass basicAt: 'iVarNames' put: aCollection
|
|
|
|
-!
|
|
|
|
|
|
+ oldClass subclasses do: [ :each |
|
|
|
|
+ self migrateClass: each superclass: newClass ].
|
|
|
|
|
|
-basicRemoveClass: aClass
|
|
|
|
- <smalltalk.removeClass(aClass)>
|
|
|
|
|
|
+ self basicRemoveClass: oldClass.
|
|
|
|
+ ^newClass
|
|
!
|
|
!
|
|
|
|
|
|
-basicRenameClass: aClass to: aString
|
|
|
|
- <
|
|
|
|
- smalltalk[aString] = aClass;
|
|
|
|
- delete smalltalk[aClass.className];
|
|
|
|
- aClass.className = aString;
|
|
|
|
- >
|
|
|
|
-!
|
|
|
|
|
|
+renameClass: aClass to: aString
|
|
|
|
+ self basicRenameClass: aClass to: aString.
|
|
|
|
+
|
|
|
|
+ SystemAnnouncer current
|
|
|
|
+ announce: (ClassRenamed new
|
|
|
|
+ theClass: aClass;
|
|
|
|
+ yourself)
|
|
|
|
+! !
|
|
|
|
|
|
-basicSwapClassNames: aClass with: anotherClass
|
|
|
|
- <
|
|
|
|
- var tmp = aClass.className;
|
|
|
|
- aClass.className = anotherClass.className;
|
|
|
|
- anotherClass.className = tmp;
|
|
|
|
- >
|
|
|
|
-!
|
|
|
|
|
|
+!ClassBuilder methodsFor: 'copying'!
|
|
|
|
|
|
copyClass: aClass named: aString
|
|
copyClass: aClass named: aString
|
|
| newClass |
|
|
| newClass |
|
|
@@ -532,52 +534,54 @@ copyClass: aClass to: anotherClass
|
|
Compiler new install: each source forClass: anotherClass class category: each category ].
|
|
Compiler new install: each source forClass: anotherClass class category: each category ].
|
|
|
|
|
|
self setupClass: anotherClass
|
|
self setupClass: anotherClass
|
|
-!
|
|
|
|
|
|
+! !
|
|
|
|
|
|
-instanceVariableNamesFor: aString
|
|
|
|
- ^(aString tokenize: ' ') reject: [ :each | each isEmpty ]
|
|
|
|
-!
|
|
|
|
|
|
+!ClassBuilder methodsFor: 'method definition'!
|
|
|
|
|
|
-migrateClass: aClass superclass: anotherClass
|
|
|
|
- console log: aClass name.
|
|
|
|
- self
|
|
|
|
- migrateClassNamed: aClass name
|
|
|
|
- superclass: anotherClass
|
|
|
|
- instanceVariableNames: aClass instanceVariableNames
|
|
|
|
- package: aClass package name
|
|
|
|
|
|
+installMethod: aCompiledMethod forClass: aBehavior category: aString
|
|
|
|
+ aCompiledMethod category: aString.
|
|
|
|
+ aBehavior addCompiledMethod: aCompiledMethod.
|
|
|
|
+ self setupClass: aBehavior.
|
|
|
|
+ ^aCompiledMethod
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ClassBuilder methodsFor: 'private'!
|
|
|
|
+
|
|
|
|
+basicAddSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName
|
|
|
|
+ <
|
|
|
|
+ smalltalk.addClass(aString, aClass, aCollection, packageName);
|
|
|
|
+ return smalltalk[aString]
|
|
|
|
+ >
|
|
!
|
|
!
|
|
|
|
|
|
-migrateClassNamed: aString superclass: aClass instanceVariableNames: aCollection package: packageName
|
|
|
|
- | oldClass newClass tmp |
|
|
|
|
-
|
|
|
|
- tmp := 'new*', aString.
|
|
|
|
- oldClass := Smalltalk current at: aString.
|
|
|
|
-
|
|
|
|
- newClass := self
|
|
|
|
- addSubclassOf: aClass
|
|
|
|
- named: tmp
|
|
|
|
- instanceVariableNames: aCollection
|
|
|
|
- package: packageName.
|
|
|
|
|
|
+basicClass: aClass instanceVariableNames: aString
|
|
|
|
+ self basicClass: aClass instanceVariables: (self instanceVariableNamesFor: aString)
|
|
|
|
+!
|
|
|
|
|
|
- self basicSwapClassNames: oldClass with: newClass.
|
|
|
|
|
|
+basicClass: aClass instanceVariables: aCollection
|
|
|
|
|
|
- [ self copyClass: oldClass to: newClass ]
|
|
|
|
- on: Error
|
|
|
|
- do: [ :exception |
|
|
|
|
- self
|
|
|
|
- basicSwapClassNames: oldClass with: newClass;
|
|
|
|
- basicRemoveClass: newClass.
|
|
|
|
- exception signal ].
|
|
|
|
|
|
+ aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
|
|
|
|
+ aClass basicAt: 'iVarNames' put: aCollection
|
|
|
|
+!
|
|
|
|
|
|
- self
|
|
|
|
- rawRenameClass: oldClass to: tmp;
|
|
|
|
- rawRenameClass: newClass to: aString.
|
|
|
|
|
|
+basicRemoveClass: aClass
|
|
|
|
+ <smalltalk.removeClass(aClass)>
|
|
|
|
+!
|
|
|
|
|
|
- oldClass subclasses do: [ :each |
|
|
|
|
- self migrateClass: each superclass: newClass ].
|
|
|
|
|
|
+basicRenameClass: aClass to: aString
|
|
|
|
+ <
|
|
|
|
+ smalltalk[aString] = aClass;
|
|
|
|
+ delete smalltalk[aClass.className];
|
|
|
|
+ aClass.className = aString;
|
|
|
|
+ >
|
|
|
|
+!
|
|
|
|
|
|
- self basicRemoveClass: oldClass.
|
|
|
|
- ^newClass
|
|
|
|
|
|
+basicSwapClassNames: aClass with: anotherClass
|
|
|
|
+ <
|
|
|
|
+ var tmp = aClass.className;
|
|
|
|
+ aClass.className = anotherClass.className;
|
|
|
|
+ anotherClass.className = tmp;
|
|
|
|
+ >
|
|
!
|
|
!
|
|
|
|
|
|
rawRenameClass: aClass to: aString
|
|
rawRenameClass: aClass to: aString
|
|
@@ -586,6 +590,12 @@ rawRenameClass: aClass to: aString
|
|
>
|
|
>
|
|
! !
|
|
! !
|
|
|
|
|
|
|
|
+!ClassBuilder methodsFor: 'public'!
|
|
|
|
+
|
|
|
|
+setupClass: aClass
|
|
|
|
+ <smalltalk.init(aClass);>
|
|
|
|
+! !
|
|
|
|
+
|
|
Object subclass: #ClassCategoryReader
|
|
Object subclass: #ClassCategoryReader
|
|
instanceVariableNames: 'class category'
|
|
instanceVariableNames: 'class category'
|
|
package: 'Kernel-Classes'!
|
|
package: 'Kernel-Classes'!
|