|
@@ -1145,34 +1145,44 @@ smalltalk.Metaclass);
|
|
|
smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel-Classes');
|
|
|
smalltalk.ClassBuilder.comment="ClassBuilder is responsible for compiling new classes or modifying existing classes in the system.\x0a\x0aRather than using ClassBuilder directly to compile a class, use `Class >> subclass:instanceVariableNames:package:`."
|
|
|
smalltalk.addMethod(
|
|
|
-"_addSubclassOf_named_instanceVariableNames_",
|
|
|
+"_addSubclassOf_named_instanceVariableNames_package_",
|
|
|
smalltalk.method({
|
|
|
-selector: "addSubclassOf:named:instanceVariableNames:",
|
|
|
+selector: "addSubclassOf:named:instanceVariableNames:package:",
|
|
|
category: 'private',
|
|
|
-fn: function (aClass,aString,aCollection){
|
|
|
+fn: function (aClass,aString,aCollection,packageName){
|
|
|
var self=this;
|
|
|
-return smalltalk.withContext(function($ctx1) {
smalltalk.addClass(aString, aClass, aCollection);
|
|
|
- return smalltalk[aString];
|
|
|
-return self}, function($ctx1) {$ctx1.fill(self,"addSubclassOf:named:instanceVariableNames:",{aClass:aClass,aString:aString,aCollection:aCollection}, smalltalk.ClassBuilder)})},
|
|
|
-args: ["aClass", "aString", "aCollection"],
|
|
|
-source: "addSubclassOf: aClass named: aString instanceVariableNames: aCollection\x0a\x09<smalltalk.addClass(aString, aClass, aCollection);\x0a\x09 return smalltalk[aString]>",
|
|
|
-messageSends: [],
|
|
|
-referencedClasses: []
|
|
|
+return smalltalk.withContext(function($ctx1) {
var $1,$2,$3;
|
|
|
+$1=_st(_st((smalltalk.Smalltalk || Smalltalk))._current())._at_(aString);
|
|
|
+if(($receiver = $1) == nil || $receiver == undefined){
|
|
|
+$1;
|
|
|
+} else {
|
|
|
+$2=_st(self)._migrateClassNamed_superclass_instanceVariableNames_package_(aString,aClass,aCollection,packageName);
|
|
|
+return $2;
|
|
|
+};
|
|
|
+$3=_st(self)._basicAddSubclassOf_named_instanceVariableNames_package_(aClass,aString,aCollection,packageName);
|
|
|
+return $3;
|
|
|
+}, function($ctx1) {$ctx1.fill(self,"addSubclassOf:named:instanceVariableNames:package:",{aClass:aClass,aString:aString,aCollection:aCollection,packageName:packageName}, smalltalk.ClassBuilder)})},
|
|
|
+args: ["aClass", "aString", "aCollection", "packageName"],
|
|
|
+source: "addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName\x0a\x09\x0a (Smalltalk current at: aString) ifNotNil: [ \x0a \x09^ self \x0a \x09migrateClassNamed: aString \x0a superclass: aClass \x0a instanceVariableNames: aCollection \x0a package: packageName ].\x0a\x0a\x09^ self \x0a \x09basicAddSubclassOf: aClass \x0a named: aString \x0a instanceVariableNames: aCollection \x0a package: packageName",
|
|
|
+messageSends: ["ifNotNil:", "migrateClassNamed:superclass:instanceVariableNames:package:", "at:", "current", "basicAddSubclassOf:named:instanceVariableNames:package:"],
|
|
|
+referencedClasses: ["Smalltalk"]
|
|
|
}),
|
|
|
smalltalk.ClassBuilder);
|
|
|
|
|
|
smalltalk.addMethod(
|
|
|
-"_addSubclassOf_named_instanceVariableNames_package_",
|
|
|
+"_basicAddSubclassOf_named_instanceVariableNames_package_",
|
|
|
smalltalk.method({
|
|
|
-selector: "addSubclassOf:named:instanceVariableNames:package:",
|
|
|
+selector: "basicAddSubclassOf:named:instanceVariableNames:package:",
|
|
|
category: 'private',
|
|
|
fn: function (aClass,aString,aCollection,packageName){
|
|
|
var self=this;
|
|
|
-return smalltalk.withContext(function($ctx1) {
smalltalk.addClass(aString, aClass, aCollection, packageName);
|
|
|
- return smalltalk[aString];
|
|
|
-return self}, function($ctx1) {$ctx1.fill(self,"addSubclassOf:named:instanceVariableNames:package:",{aClass:aClass,aString:aString,aCollection:aCollection,packageName:packageName}, smalltalk.ClassBuilder)})},
|
|
|
+return smalltalk.withContext(function($ctx1) {
|
|
|
+ smalltalk.addClass(aString, aClass, aCollection, packageName);
|
|
|
+ return smalltalk[aString]
|
|
|
+ ;
|
|
|
+return self}, function($ctx1) {$ctx1.fill(self,"basicAddSubclassOf:named:instanceVariableNames:package:",{aClass:aClass,aString:aString,aCollection:aCollection,packageName:packageName}, smalltalk.ClassBuilder)})},
|
|
|
args: ["aClass", "aString", "aCollection", "packageName"],
|
|
|
-source: "addSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName\x0a\x09<smalltalk.addClass(aString, aClass, aCollection, packageName);\x0a\x09 return smalltalk[aString]>",
|
|
|
+source: "basicAddSubclassOf: aClass named: aString instanceVariableNames: aCollection package: packageName\x0a\x09<\x0a\x09\x09smalltalk.addClass(aString, aClass, aCollection, packageName);\x0a\x09\x09return smalltalk[aString]\x0a\x09>",
|
|
|
messageSends: [],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
@@ -1194,12 +1204,28 @@ _st(aClass)._basicAt_put_("iVarNames",_st(self)._instanceVariableNamesFor_(aStri
|
|
|
_st(self)._setupClass_(aClass);
|
|
|
return self}, function($ctx1) {$ctx1.fill(self,"basicClass:instanceVariableNames:",{aClass:aClass,aString:aString}, smalltalk.ClassBuilder)})},
|
|
|
args: ["aClass", "aString"],
|
|
|
-source: "basicClass: aClass instanceVariableNames: aString\x0a\x09aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].\x0a\x09aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).\x0a \x0a\x09self setupClass: aClass",
|
|
|
+source: "basicClass: aClass instanceVariableNames: aString\x0a\x0a\x09aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].\x0a\x09aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).\x0a \x0a\x09self setupClass: aClass",
|
|
|
messageSends: ["ifFalse:", "error:", ",", "name", "isMetaclass", "basicAt:put:", "instanceVariableNamesFor:", "setupClass:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.ClassBuilder);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_basicRemoveClass_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "basicRemoveClass:",
|
|
|
+category: 'private',
|
|
|
+fn: function (aClass){
|
|
|
+var self=this;
|
|
|
+return smalltalk.withContext(function($ctx1) {
smalltalk.removeClass(aClass);
|
|
|
+return self}, function($ctx1) {$ctx1.fill(self,"basicRemoveClass:",{aClass:aClass}, smalltalk.ClassBuilder)})},
|
|
|
+args: ["aClass"],
|
|
|
+source: "basicRemoveClass: aClass\x0a\x09<smalltalk.removeClass(aClass)>",
|
|
|
+messageSends: [],
|
|
|
+referencedClasses: []
|
|
|
+}),
|
|
|
+smalltalk.ClassBuilder);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_basicRenameClass_to_",
|
|
|
smalltalk.method({
|
|
@@ -1283,12 +1309,45 @@ return smalltalk.withContext(function($ctx2) {
return _st(each)._isEmpty();
|
|
|
return $1;
|
|
|
}, function($ctx1) {$ctx1.fill(self,"instanceVariableNamesFor:",{aString:aString}, smalltalk.ClassBuilder)})},
|
|
|
args: ["aString"],
|
|
|
-source: "instanceVariableNamesFor: aString\x0a\x09^(aString tokenize: ' ') reject: [:each | each isEmpty]",
|
|
|
+source: "instanceVariableNamesFor: aString\x0a\x09^(aString tokenize: ' ') reject: [ :each | each isEmpty ]",
|
|
|
messageSends: ["reject:", "isEmpty", "tokenize:"],
|
|
|
referencedClasses: []
|
|
|
}),
|
|
|
smalltalk.ClassBuilder);
|
|
|
|
|
|
+smalltalk.addMethod(
|
|
|
+"_migrateClassNamed_superclass_instanceVariableNames_package_",
|
|
|
+smalltalk.method({
|
|
|
+selector: "migrateClassNamed:superclass:instanceVariableNames:package:",
|
|
|
+category: 'private',
|
|
|
+fn: function (aString,aClass,aCollection,packageName){
|
|
|
+var self=this;
|
|
|
+var oldClass,newClass;
|
|
|
+return smalltalk.withContext(function($ctx1) {
var $1,$2,$3;
|
|
|
+oldClass=_st(_st((smalltalk.Smalltalk || Smalltalk))._current())._at_(aString);
|
|
|
+$1=self;
|
|
|
+_st($1)._basicRenameClass_to_(oldClass,_st("Old").__comma(aString));
|
|
|
+$2=_st($1)._basicRemoveClass_(oldClass);
|
|
|
+newClass=_st(self)._addSubclassOf_named_instanceVariableNames_package_(aClass,aString,aCollection,packageName);
|
|
|
+_st(self)._setupClass_(newClass);
|
|
|
+_st(newClass)._comment_(_st(oldClass)._comment());
|
|
|
+_st(_st(_st(oldClass)._methodDictionary())._values())._do_((function(each){
|
|
|
+return smalltalk.withContext(function($ctx2) {
return _st(_st((smalltalk.Compiler || Compiler))._new())._install_forClass_category_(_st(each)._source(),newClass,_st(each)._category());
|
|
|
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
|
|
|
+_st(_st(_st(_st(oldClass)._class())._methodDictionary())._values())._do_((function(each){
|
|
|
+return smalltalk.withContext(function($ctx2) {
return _st(_st((smalltalk.Compiler || Compiler))._new())._install_forClass_category_(_st(each)._source(),_st(newClass)._class(),_st(each)._category());
|
|
|
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
|
|
|
+_st(self)._setupClass_(newClass);
|
|
|
+$3=newClass;
|
|
|
+return $3;
|
|
|
+}, function($ctx1) {$ctx1.fill(self,"migrateClassNamed:superclass:instanceVariableNames:package:",{aString:aString,aClass:aClass,aCollection:aCollection,packageName:packageName,oldClass:oldClass,newClass:newClass}, smalltalk.ClassBuilder)})},
|
|
|
+args: ["aString", "aClass", "aCollection", "packageName"],
|
|
|
+source: "migrateClassNamed: aString superclass: aClass instanceVariableNames: aCollection package: packageName\x0a\x09| oldClass newClass |\x0a \x0a oldClass := Smalltalk current at: aString.\x0a \x0a \x22Rename the class for existing instances\x22\x0a\x09self \x0a \x09basicRenameClass: oldClass to: 'Old', aString;\x0a basicRemoveClass: oldClass.\x0a \x0a newClass := self \x0a\x09\x09addSubclassOf: aClass\x0a\x09\x09named: aString \x0a\x09\x09instanceVariableNames: aCollection\x0a\x09\x09package: packageName.\x0a\x0a\x09self setupClass: newClass.\x0a\x0a\x09newClass comment: oldClass comment.\x0a\x0a\x09oldClass methodDictionary values do: [:each |\x0a\x09\x09Compiler new install: each source forClass: newClass category: each category].\x0a\x0a\x09oldClass class methodDictionary values do: [:each |\x0a\x09\x09Compiler new install: each source forClass: newClass class category: each category].\x0a\x0a\x09self setupClass: newClass.\x0a \x0a\x09^newClass",
|
|
|
+messageSends: ["at:", "current", "basicRenameClass:to:", ",", "basicRemoveClass:", "addSubclassOf:named:instanceVariableNames:package:", "setupClass:", "comment:", "comment", "do:", "install:forClass:category:", "source", "category", "new", "values", "methodDictionary", "class"],
|
|
|
+referencedClasses: ["Smalltalk", "Compiler"]
|
|
|
+}),
|
|
|
+smalltalk.ClassBuilder);
|
|
|
+
|
|
|
smalltalk.addMethod(
|
|
|
"_renameClass_to_",
|
|
|
smalltalk.method({
|