Преглед изворни кода

Helios: ClassMoved handling

Nicolas Petton пре 11 година
родитељ
комит
9d66bf39c5

+ 32 - 2
js/Helios-Browser.deploy.js

@@ -603,6 +603,7 @@ fn: function (){
 var self=this;
 function $ClassAdded(){return smalltalk.ClassAdded||(typeof ClassAdded=="undefined"?nil:ClassAdded)}
 function $ClassRemoved(){return smalltalk.ClassRemoved||(typeof ClassRemoved=="undefined"?nil:ClassRemoved)}
+function $ClassMoved(){return smalltalk.ClassMoved||(typeof ClassMoved=="undefined"?nil:ClassMoved)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
 $1=_st(_st(self)._model())._systemAnnouncer();
@@ -610,12 +611,16 @@ _st($1)._on_do_($ClassAdded(),(function(ann){
 return smalltalk.withContext(function($ctx2) {
 return _st(self)._onClassAdded_(_st(ann)._theClass());
 }, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
-$2=_st($1)._on_do_($ClassRemoved(),(function(ann){
+_st($1)._on_do_($ClassRemoved(),(function(ann){
 return smalltalk.withContext(function($ctx2) {
 return _st(self)._onClassRemoved_(_st(ann)._theClass());
 }, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
+$2=_st($1)._on_do_($ClassMoved(),(function(ann){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._onClassMoved_from_(_st(ann)._theClass(),_st(ann)._oldPackage());
+}, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"observeSystem",{},smalltalk.HLClassesListWidget)})},
-messageSends: ["on:do:", "onClassAdded:", "theClass", "systemAnnouncer", "model", "onClassRemoved:"]}),
+messageSends: ["on:do:", "onClassAdded:", "theClass", "systemAnnouncer", "model", "onClassRemoved:", "onClassMoved:from:", "oldPackage"]}),
 smalltalk.HLClassesListWidget);
 
 smalltalk.addMethod(
@@ -636,6 +641,31 @@ return self}, function($ctx1) {$ctx1.fill(self,"onClassAdded:",{aClass:aClass},s
 messageSends: ["ifFalse:", "=", "selectedPackage", "model", "package", "setItemsForSelectedPackage", "refresh"]}),
 smalltalk.HLClassesListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onClassMoved:from:",
+fn: function (aClass,aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=_st(_st(aPackage).__eq(_st(_st(self)._model())._selectedPackage()))._or_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(aClass)._package()).__eq(_st(_st(self)._model())._selectedPackage());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+if(! smalltalk.assert($1)){
+$2=self;
+return $2;
+};
+$3=_st(_st(aClass)._oldPackage()).__eq(_st(_st(self)._model())._selectedPackage());
+if(smalltalk.assert($3)){
+_st(self)._selectItem_(nil);
+};
+_st(self)._setItemsForSelectedPackage();
+_st(self)._refresh();
+return self}, function($ctx1) {$ctx1.fill(self,"onClassMoved:from:",{aClass:aClass,aPackage:aPackage},smalltalk.HLClassesListWidget)})},
+messageSends: ["ifFalse:", "or:", "=", "selectedPackage", "model", "package", "ifTrue:", "selectItem:", "oldPackage", "setItemsForSelectedPackage", "refresh"]}),
+smalltalk.HLClassesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "onClassRemoved:",

+ 39 - 4
js/Helios-Browser.js

@@ -784,6 +784,7 @@ fn: function (){
 var self=this;
 function $ClassAdded(){return smalltalk.ClassAdded||(typeof ClassAdded=="undefined"?nil:ClassAdded)}
 function $ClassRemoved(){return smalltalk.ClassRemoved||(typeof ClassRemoved=="undefined"?nil:ClassRemoved)}
+function $ClassMoved(){return smalltalk.ClassMoved||(typeof ClassMoved=="undefined"?nil:ClassMoved)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
 $1=_st(_st(self)._model())._systemAnnouncer();
@@ -791,15 +792,19 @@ _st($1)._on_do_($ClassAdded(),(function(ann){
 return smalltalk.withContext(function($ctx2) {
 return _st(self)._onClassAdded_(_st(ann)._theClass());
 }, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
-$2=_st($1)._on_do_($ClassRemoved(),(function(ann){
+_st($1)._on_do_($ClassRemoved(),(function(ann){
 return smalltalk.withContext(function($ctx2) {
 return _st(self)._onClassRemoved_(_st(ann)._theClass());
 }, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
+$2=_st($1)._on_do_($ClassMoved(),(function(ann){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._onClassMoved_from_(_st(ann)._theClass(),_st(ann)._oldPackage());
+}, function($ctx2) {$ctx2.fillBlock({ann:ann},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"observeSystem",{},smalltalk.HLClassesListWidget)})},
 args: [],
-source: "observeSystem\x0a\x09self model systemAnnouncer\x0a    \x09on: ClassAdded\x0a        do: [ :ann | self onClassAdded: ann theClass ];\x0a        on: ClassRemoved\x0a        do: [ :ann | self onClassRemoved: ann theClass ]",
-messageSends: ["on:do:", "onClassAdded:", "theClass", "systemAnnouncer", "model", "onClassRemoved:"],
-referencedClasses: ["ClassAdded", "ClassRemoved"]
+source: "observeSystem\x0a\x09self model systemAnnouncer\x0a    \x09on: ClassAdded\x0a        do: [ :ann | self onClassAdded: ann theClass ];\x0a        on: ClassRemoved\x0a        do: [ :ann | self onClassRemoved: ann theClass ];\x0a\x09\x09on: ClassMoved\x0a        do: [ :ann | self onClassMoved: ann theClass from: ann oldPackage ]",
+messageSends: ["on:do:", "onClassAdded:", "theClass", "systemAnnouncer", "model", "onClassRemoved:", "onClassMoved:from:", "oldPackage"],
+referencedClasses: ["ClassAdded", "ClassRemoved", "ClassMoved"]
 }),
 smalltalk.HLClassesListWidget);
 
@@ -826,6 +831,36 @@ referencedClasses: []
 }),
 smalltalk.HLClassesListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onClassMoved:from:",
+category: 'reactions',
+fn: function (aClass,aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=_st(_st(aPackage).__eq(_st(_st(self)._model())._selectedPackage()))._or_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(aClass)._package()).__eq(_st(_st(self)._model())._selectedPackage());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+if(! smalltalk.assert($1)){
+$2=self;
+return $2;
+};
+$3=_st(_st(aClass)._oldPackage()).__eq(_st(_st(self)._model())._selectedPackage());
+if(smalltalk.assert($3)){
+_st(self)._selectItem_(nil);
+};
+_st(self)._setItemsForSelectedPackage();
+_st(self)._refresh();
+return self}, function($ctx1) {$ctx1.fill(self,"onClassMoved:from:",{aClass:aClass,aPackage:aPackage},smalltalk.HLClassesListWidget)})},
+args: ["aClass", "aPackage"],
+source: "onClassMoved: aClass from: aPackage\x0a\x09(aPackage = self model selectedPackage or: [\x0a\x09\x09aClass package = self model selectedPackage ])\x0a\x09\x09\x09ifFalse: [ ^ self ].\x0a\x09\x09\x09\x0a\x09aClass oldPackage = self model selectedPackage ifTrue: [ \x0a\x09\x09self selectItem: nil ].\x0a    \x0a    self setItemsForSelectedPackage.\x0a    self refresh",
+messageSends: ["ifFalse:", "or:", "=", "selectedPackage", "model", "package", "ifTrue:", "selectItem:", "oldPackage", "setItemsForSelectedPackage", "refresh"],
+referencedClasses: []
+}),
+smalltalk.HLClassesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "onClassRemoved:",

+ 2 - 2
js/Helios-Environments.deploy.js

@@ -363,9 +363,9 @@ if(smalltalk.assert($2)){
 $3=self;
 return $3;
 };
-_st(package_)._addClass_(aClass);
+_st(aClass)._package_(package_);
 return self}, function($ctx1) {$ctx1.fill(self,"moveClass:toPackage:",{aClass:aClass,aPackageName:aPackageName,package_:package_},smalltalk.HLLocalEnvironment)})},
-messageSends: ["named:", "ifNil:", "error:", "ifTrue:", "==", "package", "addClass:"]}),
+messageSends: ["named:", "ifNil:", "error:", "ifTrue:", "==", "package", "package:"]}),
 smalltalk.HLLocalEnvironment);
 
 smalltalk.addMethod(

+ 3 - 3
js/Helios-Environments.js

@@ -490,11 +490,11 @@ if(smalltalk.assert($2)){
 $3=self;
 return $3;
 };
-_st(package_)._addClass_(aClass);
+_st(aClass)._package_(package_);
 return self}, function($ctx1) {$ctx1.fill(self,"moveClass:toPackage:",{aClass:aClass,aPackageName:aPackageName,package_:package_},smalltalk.HLLocalEnvironment)})},
 args: ["aClass", "aPackageName"],
-source: "moveClass: aClass toPackage: aPackageName\x0a\x09| package |\x0a\x09\x0a\x09package := Package named: aPackageName.\x0a\x09package ifNil: [ self error: 'Invalid package name' ].\x0a\x09package == aClass package ifTrue: [ ^ self ].\x0a\x09\x0a\x09package addClass: aClass",
-messageSends: ["named:", "ifNil:", "error:", "ifTrue:", "==", "package", "addClass:"],
+source: "moveClass: aClass toPackage: aPackageName\x0a\x09| package |\x0a\x09\x0a\x09package := Package named: aPackageName.\x0a\x09package ifNil: [ self error: 'Invalid package name' ].\x0a\x09package == aClass package ifTrue: [ ^ self ].\x0a\x09\x0a\x09aClass package: package",
+messageSends: ["named:", "ifNil:", "error:", "ifTrue:", "==", "package", "package:"],
 referencedClasses: ["Package"]
 }),
 smalltalk.HLLocalEnvironment);

+ 25 - 1
js/Kernel-Announcements.deploy.js

@@ -222,7 +222,31 @@ smalltalk.addClass('ClassCommentChanged', smalltalk.ClassAnnouncement, [], 'Kern
 smalltalk.addClass('ClassDefinitionChanged', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 
 
-smalltalk.addClass('ClassMoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassMoved', smalltalk.ClassAnnouncement, ['oldPackage'], 'Kernel-Announcements');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "oldPackage",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@oldPackage"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"oldPackage",{},smalltalk.ClassMoved)})},
+messageSends: []}),
+smalltalk.ClassMoved);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "oldPackage:",
+fn: function (aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@oldPackage"]=aPackage;
+return self}, function($ctx1) {$ctx1.fill(self,"oldPackage:",{aPackage:aPackage},smalltalk.ClassMoved)})},
+messageSends: []}),
+smalltalk.ClassMoved);
+
 
 
 smalltalk.addClass('ClassRemoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');

+ 35 - 1
js/Kernel-Announcements.js

@@ -304,7 +304,41 @@ smalltalk.addClass('ClassDefinitionChanged', smalltalk.ClassAnnouncement, [], 'K
 smalltalk.ClassDefinitionChanged.comment="I am emitted when the defintion of a class changes.\x0aSee ClassBuilder >> #class:instanceVariableNames:"
 
 
-smalltalk.addClass('ClassMoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassMoved', smalltalk.ClassAnnouncement, ['oldPackage'], 'Kernel-Announcements');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "oldPackage",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@oldPackage"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"oldPackage",{},smalltalk.ClassMoved)})},
+args: [],
+source: "oldPackage\x0a\x09^ oldPackage",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassMoved);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "oldPackage:",
+category: 'accessing',
+fn: function (aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@oldPackage"]=aPackage;
+return self}, function($ctx1) {$ctx1.fill(self,"oldPackage:",{aPackage:aPackage},smalltalk.ClassMoved)})},
+args: ["aPackage"],
+source: "oldPackage: aPackage\x0a\x09oldPackage := aPackage",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassMoved);
+
 
 
 smalltalk.addClass('ClassRemoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');

+ 7 - 2
js/Kernel-Classes.deploy.js

@@ -748,17 +748,22 @@ smalltalk.method({
 selector: "package:",
 fn: function (aPackage){
 var self=this;
+var oldPackage;
 function $ClassMoved(){return smalltalk.ClassMoved||(typeof ClassMoved=="undefined"?nil:ClassMoved)}
 function $SystemAnnouncer(){return smalltalk.SystemAnnouncer||(typeof SystemAnnouncer=="undefined"?nil:SystemAnnouncer)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
+oldPackage=_st(self)._package();
 _st(self)._basicAt_put_("pkg",aPackage);
+_st(_st(oldPackage)._organization())._removeElement_(self);
+_st(_st(aPackage)._organization())._addElement_(self);
 $1=_st($ClassMoved())._new();
 _st($1)._theClass_(self);
+_st($1)._oldPackage_(oldPackage);
 $2=_st($1)._yourself();
 _st(_st($SystemAnnouncer())._current())._announce_($2);
-return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage},smalltalk.Class)})},
-messageSends: ["basicAt:put:", "announce:", "theClass:", "new", "yourself", "current"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage,oldPackage:oldPackage},smalltalk.Class)})},
+messageSends: ["package", "basicAt:put:", "removeElement:", "organization", "addElement:", "announce:", "theClass:", "new", "oldPackage:", "yourself", "current"]}),
 smalltalk.Class);
 
 smalltalk.addMethod(

+ 8 - 3
js/Kernel-Classes.js

@@ -981,19 +981,24 @@ selector: "package:",
 category: 'accessing',
 fn: function (aPackage){
 var self=this;
+var oldPackage;
 function $ClassMoved(){return smalltalk.ClassMoved||(typeof ClassMoved=="undefined"?nil:ClassMoved)}
 function $SystemAnnouncer(){return smalltalk.SystemAnnouncer||(typeof SystemAnnouncer=="undefined"?nil:SystemAnnouncer)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
+oldPackage=_st(self)._package();
 _st(self)._basicAt_put_("pkg",aPackage);
+_st(_st(oldPackage)._organization())._removeElement_(self);
+_st(_st(aPackage)._organization())._addElement_(self);
 $1=_st($ClassMoved())._new();
 _st($1)._theClass_(self);
+_st($1)._oldPackage_(oldPackage);
 $2=_st($1)._yourself();
 _st(_st($SystemAnnouncer())._current())._announce_($2);
-return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage},smalltalk.Class)})},
+return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage,oldPackage:oldPackage},smalltalk.Class)})},
 args: ["aPackage"],
-source: "package: aPackage\x0a\x09self basicAt: 'pkg' put: aPackage.\x0a\x09\x0a\x09SystemAnnouncer current announce: (ClassMoved new\x0a\x09\x09theClass: self;\x0a\x09\x09yourself)",
-messageSends: ["basicAt:put:", "announce:", "theClass:", "new", "yourself", "current"],
+source: "package: aPackage\x0a\x09| oldPackage |\x0a\x09oldPackage := self package.\x0a\x09\x0a\x09self basicAt: 'pkg' put: aPackage.\x0a\x09oldPackage organization removeElement: self.\x0a\x09aPackage organization addElement: self.\x0a\x0a\x09SystemAnnouncer current announce: (ClassMoved new\x0a\x09\x09theClass: self;\x0a\x09\x09oldPackage: oldPackage;\x0a\x09\x09yourself)",
+messageSends: ["package", "basicAt:put:", "removeElement:", "organization", "addElement:", "announce:", "theClass:", "new", "oldPackage:", "yourself", "current"],
 referencedClasses: ["ClassMoved", "SystemAnnouncer"]
 }),
 smalltalk.Class);

+ 15 - 1
st/Helios-Browser.st

@@ -274,7 +274,9 @@ observeSystem
     	on: ClassAdded
         do: [ :ann | self onClassAdded: ann theClass ];
         on: ClassRemoved
-        do: [ :ann | self onClassRemoved: ann theClass ]
+        do: [ :ann | self onClassRemoved: ann theClass ];
+		on: ClassMoved
+        do: [ :ann | self onClassMoved: ann theClass from: ann oldPackage ]
 !
 
 selectItem: aClass
@@ -312,6 +314,18 @@ onClassAdded: aClass
     self refresh
 !
 
+onClassMoved: aClass from: aPackage
+	(aPackage = self model selectedPackage or: [
+		aClass package = self model selectedPackage ])
+			ifFalse: [ ^ self ].
+			
+	aClass oldPackage = self model selectedPackage ifTrue: [ 
+		self selectItem: nil ].
+    
+    self setItemsForSelectedPackage.
+    self refresh
+!
+
 onClassRemoved: aClass
 	aClass package = self model selectedPackage ifFalse: [ ^ self ].
     aClass = self model selectedClass ifTrue: [ self selectItem: nil ].

+ 1 - 1
st/Helios-Environments.st

@@ -152,7 +152,7 @@ moveClass: aClass toPackage: aPackageName
 	package ifNil: [ self error: 'Invalid package name' ].
 	package == aClass package ifTrue: [ ^ self ].
 	
-	package addClass: aClass
+	aClass package: package
 !
 
 moveMethod: aMethod toClass: aClassName

+ 11 - 1
st/Kernel-Announcements.st

@@ -138,9 +138,19 @@ I am emitted when the defintion of a class changes.
 See ClassBuilder >> #class:instanceVariableNames:!
 
 ClassAnnouncement subclass: #ClassMoved
-	instanceVariableNames: ''
+	instanceVariableNames: 'oldPackage'
 	package: 'Kernel-Announcements'!
 
+!ClassMoved methodsFor: 'accessing'!
+
+oldPackage
+	^ oldPackage
+!
+
+oldPackage: aPackage
+	oldPackage := aPackage
+! !
+
 ClassAnnouncement subclass: #ClassRemoved
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!

+ 7 - 1
st/Kernel-Classes.st

@@ -321,10 +321,16 @@ package
 !
 
 package: aPackage
-	self basicAt: 'pkg' put: aPackage.
+	| oldPackage |
+	oldPackage := self package.
 	
+	self basicAt: 'pkg' put: aPackage.
+	oldPackage organization removeElement: self.
+	aPackage organization addElement: self.
+
 	SystemAnnouncer current announce: (ClassMoved new
 		theClass: self;
+		oldPackage: oldPackage;
 		yourself)
 !