Browse Source

alternateConstructorFromSelector:

Herby Vojčík 4 years ago
parent
commit
09dd6f016e

+ 1 - 0
lang/API-CHANGES.txt

@@ -3,6 +3,7 @@
 * Deprecate Behavior >> javascriptConstructor(:)
 
 + Behavior >>
+  + alternateConstructorFromSelector:
   + beJavaScriptSubclassOf:
   + javaScriptConstructor
   + javaScriptConstructor:

+ 26 - 0
lang/src/Kernel-Classes.js

@@ -185,6 +185,32 @@ return $recv($2)._yourself();
 }; }),
 $globals.Behavior);
 
+$core.addMethod(
+$core.method({
+selector: "alternateConstructorFromSelector:",
+protocol: "instance creation",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aSelector"],
+source: "alternateConstructorFromSelector: aSelector\x0a\x09^ (self >> aSelector) fn\x0a\x09\x09asJavaScriptConstructorInstantiate: self;\x0a\x09\x09yourself",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["asJavaScriptConstructorInstantiate:", "fn", ">>", "yourself"]
+}, function ($methodClass){ return function (aSelector){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1;
+$1=$recv($self.__gt_gt(aSelector))._fn();
+$recv($1)._asJavaScriptConstructorInstantiate_(self);
+return $recv($1)._yourself();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"alternateConstructorFromSelector:",{aSelector:aSelector})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.Behavior);
+
 $core.addMethod(
 $core.method({
 selector: "basicNew",

+ 6 - 0
lang/src/Kernel-Classes.st

@@ -140,6 +140,12 @@ allSubclassesDo: aBlock
 
 !Behavior methodsFor: 'instance creation'!
 
+alternateConstructorFromSelector: aSelector
+	^ (self >> aSelector) fn
+		asJavaScriptConstructorInstantiate: self;
+		yourself
+!
+
 basicNew
 	<inlineJS: 'return new self.fn()'>
 !

+ 46 - 0
lang/src/Kernel-Tests.js

@@ -2637,6 +2637,52 @@ return self;
 }; }),
 $globals.ClassTest);
 
+$core.addMethod(
+$core.method({
+selector: "testAlternateConstructorFromSelector",
+protocol: "tests",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "testAlternateConstructorFromSelector\x0a\x09| instance block |\x0a\x09block := ObjectMock alternateConstructorFromSelector: #foo:.\x0a\x0a\x09instance := block newValue: 4.\x0a\x09self assert: instance class == ObjectMock.\x0a\x09self assert: instance foo equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
+referencedClasses: ["ObjectMock", "Error"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["alternateConstructorFromSelector:", "newValue:", "assert:", "==", "class", "assert:equals:", "foo", "shouldnt:raise:", "foo:"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+var instance,block;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1;
+block=$recv($globals.ObjectMock)._alternateConstructorFromSelector_("foo:");
+instance=$recv(block)._newValue_((4));
+$self._assert_($recv($recv(instance)._class()).__eq_eq($globals.ObjectMock));
+$1=$recv(instance)._foo();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["foo"]=1;
+//>>excludeEnd("ctx");
+$self._assert_equals_($1,(4));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["assert:equals:"]=1;
+//>>excludeEnd("ctx");
+$self._shouldnt_raise_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(instance)._foo_((9));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}),$globals.Error);
+$self._assert_equals_($recv(instance)._foo(),(9));
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"testAlternateConstructorFromSelector",{instance:instance,block:block})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.ClassTest);
+
 $core.addMethod(
 $core.method({
 selector: "testBeJavaScriptSubclassOf",

+ 11 - 0
lang/src/Kernel-Tests.st

@@ -532,6 +532,17 @@ testAllSubclasses
 	self assert: Object allSubclasses equals: subclasses
 !
 
+testAlternateConstructorFromSelector
+	| instance block |
+	block := ObjectMock alternateConstructorFromSelector: #foo:.
+
+	instance := block newValue: 4.
+	self assert: instance class == ObjectMock.
+	self assert: instance foo equals: 4.
+	self shouldnt: [ instance foo: 9 ] raise: Error.
+	self assert: instance foo equals: 9
+!
+
 testBeJavaScriptSubclassOf
 	| instance constructor |
 	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.