Browse Source

.pkg => .category, ivar package

Herbert Vojčík 6 years ago
parent
commit
211a7ced94
4 changed files with 121 additions and 59 deletions
  1. 90 41
      src/Kernel-Classes.js
  2. 25 9
      src/Kernel-Classes.st
  3. 2 5
      support/kernel-fundamentals.js
  4. 4 4
      support/kernel-language.js

+ 90 - 41
src/Kernel-Classes.js

@@ -684,10 +684,29 @@ $globals.Behavior);
 
 
 
-$core.addClass("Class", $globals.Behavior, [], "Kernel-Classes");
+$core.addClass("Class", $globals.Behavior, ["package"], "Kernel-Classes");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.Class.comment="I am __the__ class object.\x0a\x0aMy instances are the classes of the system.\x0aClass creation is done throught a `ClassBuilder` instance.";
 //>>excludeEnd("ide");
+$core.addMethod(
+$core.method({
+selector: "basicPackage:",
+protocol: "accessing",
+fn: function (aPackage){
+var self=this,$self=this;
+$self["@package"]=aPackage;
+return self;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aPackage"],
+source: "basicPackage: aPackage\x0a\x09package := aPackage",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Class);
+
 $core.addMethod(
 $core.method({
 selector: "classTag",
@@ -804,6 +823,24 @@ messageSends: []
 }),
 $globals.Class);
 
+$core.addMethod(
+$core.method({
+selector: "package",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+return $self["@package"];
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "package\x0a\x09^ package",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Class);
+
 $core.addMethod(
 $core.method({
 selector: "rename:",
@@ -3371,25 +3408,23 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3,$receiver;
+var $1,$receiver;
 if(($receiver = $globals.Smalltalk) == null || $receiver.a$nil){
 $globals.Smalltalk;
 } else {
-$2=$self._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2)._isString();
-if($core.assert($1)){
-$4=$self._package();
+$1=$self._basicAt_("category");
+if(($receiver = $1) == null || $receiver.a$nil){
+$self._basicPackage_(nil);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=2;
+$ctx1.sendIdx["basicPackage:"]=1;
 //>>excludeEnd("ctx");
-$3=$recv($globals.Package)._named_($4);
-$self._basicAt_put_("pkg",$3);
-}
+} else {
+var category;
+category=$receiver;
+$self._basicPackage_($recv($globals.Package)._named_(category));
 $recv($recv($self._package())._organization())._addElement_(self);
 }
+}
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"enterOrganization",{},$globals.TMasterBehavior)});
@@ -3397,10 +3432,10 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "enterOrganization\x0a\x09Smalltalk ifNotNil: [\x0a\x09\x09self package isString ifTrue: [ self basicAt: 'pkg' put: (Package named: self package) ].\x0a\x09\x09self package organization addElement: self ]",
+source: "enterOrganization\x0a\x09Smalltalk ifNotNil: [\x0a\x09\x09(self basicAt: 'category')\x0a\x09\x09\x09ifNil: [ self basicPackage: nil ]\x0a\x09\x09\x09ifNotNil: [ :category |\x0a\x09\x09\x09\x09\x22Amber has 1-1 correspondence between cat and pkg, atm\x22\x0a\x09\x09\x09\x09self basicPackage: (Package named: category).\x0a\x09\x09\x09\x09self package organization addElement: self ] ]",
 referencedClasses: ["Smalltalk", "Package"],
 //>>excludeEnd("ide");
-messageSends: ["ifNotNil:", "ifTrue:", "isString", "package", "basicAt:put:", "named:", "addElement:", "organization"]
+messageSends: ["ifNotNil:", "ifNil:ifNotNil:", "basicAt:", "basicPackage:", "named:", "addElement:", "organization", "package"]
 }),
 $globals.TMasterBehavior);
 
@@ -3457,29 +3492,6 @@ messageSends: []
 }),
 $globals.TMasterBehavior);
 
-$core.addMethod(
-$core.method({
-selector: "package",
-protocol: "accessing",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $self._basicAt_("pkg");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"package",{},$globals.TMasterBehavior)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "package\x0a\x09^ self basicAt: 'pkg'",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["basicAt:"]
-}),
-$globals.TMasterBehavior);
-
 $core.addMethod(
 $core.method({
 selector: "package:",
@@ -3501,7 +3513,7 @@ return self;
 }
 oldPackage=$self._package();
 $self._leaveOrganization();
-$self._basicAt_put_("pkg",aPackage);
+$self._basicAt_put_("category",aPackage);
 $self._enterOrganization();
 $3=$recv($globals.SystemAnnouncer)._current();
 $5=$recv($globals.ClassMoved)._new();
@@ -3516,7 +3528,7 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aPackage"],
-source: "package: aPackage\x0a\x09| oldPackage |\x0a\x09\x0a\x09self package = aPackage ifTrue: [ ^ self ].\x0a\x09\x0a\x09oldPackage := self package.\x0a\x09\x0a\x09self\x0a\x09\x09leaveOrganization;\x0a\x09\x09basicAt: 'pkg' put: aPackage;\x0a\x09\x09enterOrganization.\x0a\x0a\x09SystemAnnouncer current announce: (ClassMoved new\x0a\x09\x09theClass: self;\x0a\x09\x09oldPackage: oldPackage;\x0a\x09\x09yourself)",
+source: "package: aPackage\x0a\x09| oldPackage |\x0a\x09\x0a\x09self package = aPackage ifTrue: [ ^ self ].\x0a\x09\x0a\x09oldPackage := self package.\x0a\x09\x0a\x09self\x0a\x09\x09leaveOrganization;\x0a\x09\x09basicAt: 'category' put: aPackage;\x0a\x09\x09enterOrganization.\x0a\x0a\x09SystemAnnouncer current announce: (ClassMoved new\x0a\x09\x09theClass: self;\x0a\x09\x09oldPackage: oldPackage;\x0a\x09\x09yourself)",
 referencedClasses: ["SystemAnnouncer", "ClassMoved"],
 //>>excludeEnd("ide");
 messageSends: ["ifTrue:", "=", "package", "leaveOrganization", "basicAt:put:", "enterOrganization", "announce:", "current", "theClass:", "new", "oldPackage:", "yourself"]
@@ -3542,7 +3554,7 @@ messageSends: []
 $globals.TMasterBehavior);
 
 
-$core.addClass("Trait", $globals.Object, ["organization"], "Kernel-Classes");
+$core.addClass("Trait", $globals.Object, ["organization", "package"], "Kernel-Classes");
 $core.addMethod(
 $core.method({
 selector: "-",
@@ -3672,6 +3684,25 @@ messageSends: []
 }),
 $globals.Trait);
 
+$core.addMethod(
+$core.method({
+selector: "basicPackage:",
+protocol: "accessing",
+fn: function (aPackage){
+var self=this,$self=this;
+$self["@package"]=aPackage;
+return self;
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aPackage"],
+source: "basicPackage: aPackage\x0a\x09package := aPackage",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Trait);
+
 $core.addMethod(
 $core.method({
 selector: "classTag",
@@ -3749,6 +3780,24 @@ messageSends: ["streamContents:", "write:", "printSymbol:", "name", "lf", "ifNot
 }),
 $globals.Trait);
 
+$core.addMethod(
+$core.method({
+selector: "package",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+return $self["@package"];
+
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "package\x0a\x09^ package",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.Trait);
+
 $core.addMethod(
 $core.method({
 selector: "theMetaClass",

+ 25 - 9
src/Kernel-Classes.st

@@ -153,7 +153,7 @@ isBehavior
 ! !
 
 Behavior subclass: #Class
-	instanceVariableNames: ''
+	instanceVariableNames: 'package'
 	package: 'Kernel-Classes'!
 !Class commentStamp!
 I am __the__ class object.
@@ -163,6 +163,10 @@ Class creation is done throught a `ClassBuilder` instance.!
 
 !Class methodsFor: 'accessing'!
 
+basicPackage: aPackage
+	package := aPackage
+!
+
 classTag
 	"Returns a tag or general category for this class.
 	Typically used to help tools do some reflection.
@@ -179,6 +183,10 @@ definition
 		tab; write: 'package: '; print: self category ]
 !
 
+package
+	^ package
+!
+
 rename: aString
 	ClassBuilder new renameClass: self to: aString
 !
@@ -852,8 +860,12 @@ definedMethods
 
 enterOrganization
 	Smalltalk ifNotNil: [
-		self package isString ifTrue: [ self basicAt: 'pkg' put: (Package named: self package) ].
-		self package organization addElement: self ]
+		(self basicAt: 'category')
+			ifNil: [ self basicPackage: nil ]
+			ifNotNil: [ :category |
+				"Amber has 1-1 correspondence between cat and pkg, atm"
+				self basicPackage: (Package named: category).
+				self package organization addElement: self ] ]
 !
 
 leaveOrganization
@@ -865,10 +877,6 @@ name
 	<inlineJS: 'return self.className'>
 !
 
-package
-	^ self basicAt: 'pkg'
-!
-
 package: aPackage
 	| oldPackage |
 	
@@ -878,7 +886,7 @@ package: aPackage
 	
 	self
 		leaveOrganization;
-		basicAt: 'pkg' put: aPackage;
+		basicAt: 'category' put: aPackage;
 		enterOrganization.
 
 	SystemAnnouncer current announce: (ClassMoved new
@@ -904,7 +912,7 @@ asJavaScriptSource
 ! !
 
 Object subclass: #Trait
-	instanceVariableNames: 'organization'
+	instanceVariableNames: 'organization package'
 	package: 'Kernel-Classes'!
 
 !Trait methodsFor: 'accessing'!
@@ -917,6 +925,10 @@ basicOrganization: aClassOrganizer
 	organization := aClassOrganizer
 !
 
+basicPackage: aPackage
+	package := aPackage
+!
+
 classTag
 	^ 'trait'
 !
@@ -928,6 +940,10 @@ definition
 		tab; write: 'package: '; print: self category ]
 !
 
+package
+	^ package
+!
+
 theMetaClass
 	^ nil
 !

+ 2 - 5
support/kernel-fundamentals.js

@@ -135,17 +135,14 @@ define(function () {
 
         var classes = [];
 
-        this.buildTraitOrClass = function (pkgName, builder) {
+        this.buildTraitOrClass = function (category, builder) {
             // TODO remove .className, have .name
             var traitOrClass = globals.hasOwnProperty(builder.className) && globals[builder.className];
             if (traitOrClass) {
-                // TODO remove .pkg, have .pkgName
-                if (!traitOrClass.pkg) throw new Error("Updated trait or class must have package: " + traitOrClass.className);
-                // if (traitOrClass.pkg.pkgName !== pkgName) throw new Error("Incompatible cross-package update of trait or class: " + traitOrClass.className);
                 builder.updateExisting(traitOrClass);
             } else {
                 traitOrClass = builder.make();
-                traitOrClass.pkg = pkgName;
+                traitOrClass.category = category;
                 addTraitOrClass(traitOrClass);
             }
 

+ 4 - 4
support/kernel-language.js

@@ -113,8 +113,8 @@ define(function () {
             };
         }
 
-        st.addTrait = function (className, pkgName) {
-            return buildTraitOrClass(pkgName, traitBuilder(className));
+        st.addTrait = function (className, category) {
+            return buildTraitOrClass(category, traitBuilder(className));
         };
     }
 
@@ -377,13 +377,13 @@ define(function () {
         /* Add a class to the system, creating a new one if needed.
          A Package is lazily created if one with given name does not exist. */
 
-        st.addClass = function (className, superclass, iVarNames, pkgName) {
+        st.addClass = function (className, superclass, iVarNames, category) {
             // While subclassing nil is allowed, it might be an error, so
             // warn about it.
             if (typeof superclass === 'undefined' || superclass && superclass.a$nil) {
                 console.warn('Compiling ' + className + ' as a subclass of `nil`. A dependency might be missing.');
             }
-            return buildTraitOrClass(pkgName, classBuilder(className, superclass, iVarNames, coreFns[className]));
+            return buildTraitOrClass(category, classBuilder(className, superclass, iVarNames, coreFns[className]));
         };
 
         st.removeClass = removeTraitOrClass;