Browse Source

#isThenable

Herby Vojčík 3 years ago
parent
commit
abd8f2eed3

+ 7 - 0
lang/API-CHANGES.txt

@@ -3,6 +3,13 @@
 * Deprecate TestCase >> debugCase.
 * Remove class DebugTestContext.
 
++ JSObjectProxy
+  + isThenable
++ TIsInGroup >>
+  + isThenable
++ TThenable >>
+  + isThenable
+
 
 0.29.2:
 

+ 18 - 0
lang/src/Kernel-Helpers.js

@@ -187,6 +187,24 @@ return false;
 }; }),
 $globals.TIsInGroup);
 
+$core.addMethod(
+$core.method({
+selector: "isThenable",
+protocol: "testing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "isThenable\x0a\x09^ false",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: []
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+return false;
+
+}; }),
+$globals.TIsInGroup);
+
 
 $core.addTrait("TSubclassable", "Kernel-Helpers");
 $core.addMethod(

+ 4 - 0
lang/src/Kernel-Helpers.st

@@ -48,6 +48,10 @@ isString
 
 isSymbol
 	^ false
+!
+
+isThenable
+	^ false
 ! !
 
 Trait named: #TSubclassable

+ 27 - 4
lang/src/Kernel-Infrastructure.js

@@ -389,6 +389,29 @@ return $recv(aValuable)._value_($self.jsObject);
 }; }),
 $globals.JSObjectProxy);
 
+$core.addMethod(
+$core.method({
+selector: "isThenable",
+protocol: "testing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "isThenable\x0a\x09^ NativeFunction isNativeFunction: (self at: #then)",
+referencedClasses: ["NativeFunction"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["isNativeFunction:", "at:"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($globals.NativeFunction)._isNativeFunction_($self._at_("then"));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"isThenable",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.JSObjectProxy);
+
 $core.addMethod(
 $core.method({
 selector: "jsObject",
@@ -579,17 +602,17 @@ selector: "then:",
 protocol: "promises",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aBlockOrArray"],
-source: "then: aBlockOrArray\x0a(NativeFunction isNativeFunction: (self at: #then))\x0a\x09ifTrue: [ ^ (TThenable >> #then:) sendTo: jsObject arguments: {aBlockOrArray} ]\x0a\x09ifFalse: [ ^ super then: aBlockOrArray ]",
-referencedClasses: ["NativeFunction", "TThenable"],
+source: "then: aBlockOrArray\x0aself isThenable\x0a\x09ifTrue: [ ^ (TThenable >> #then:) sendTo: jsObject arguments: {aBlockOrArray} ]\x0a\x09ifFalse: [ ^ super then: aBlockOrArray ]",
+referencedClasses: ["TThenable"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifTrue:ifFalse:", "isNativeFunction:", "at:", "sendTo:arguments:", ">>", "then:"]
+messageSends: ["ifTrue:ifFalse:", "isThenable", "sendTo:arguments:", ">>", "then:"]
 }, function ($methodClass){ return function (aBlockOrArray){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-if($core.assert($recv($globals.NativeFunction)._isNativeFunction_($self._at_("then")))){
+if($core.assert($self._isThenable())){
 return $recv($recv($globals.TThenable).__gt_gt("then:"))._sendTo_arguments_($self.jsObject,[aBlockOrArray]);
 } else {
 return [(

+ 7 - 1
lang/src/Kernel-Infrastructure.st

@@ -156,7 +156,7 @@ on: aClass do: aBlock
 !
 
 then: aBlockOrArray
-(NativeFunction isNativeFunction: (self at: #then))
+self isThenable
 	ifTrue: [ ^ (TThenable >> #then:) sendTo: jsObject arguments: {aBlockOrArray} ]
 	ifFalse: [ ^ super then: aBlockOrArray ]
 ! !
@@ -179,6 +179,12 @@ putOn: aStream
 	aStream nextPutJSObject: jsObject
 ! !
 
+!JSObjectProxy methodsFor: 'testing'!
+
+isThenable
+	^ NativeFunction isNativeFunction: (self at: #then)
+! !
+
 !JSObjectProxy class methodsFor: 'accessing'!
 
 null

+ 18 - 0
lang/src/Kernel-Promises.js

@@ -201,6 +201,24 @@ return self;
 }; }),
 $globals.TThenable);
 
+$core.addMethod(
+$core.method({
+selector: "isThenable",
+protocol: "testing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "isThenable\x0a\x09^ true",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: []
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+return true;
+
+}; }),
+$globals.TThenable);
+
 $core.addMethod(
 $core.method({
 selector: "on:do:",

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

@@ -110,6 +110,12 @@ then: aBlockOrArray on: aClass do: aBlock catch: anotherBlock
 	^ ((self then: aBlockOrArray) on: aClass do: aBlock) catch: anotherBlock
 ! !
 
+!TThenable methodsFor: 'testing'!
+
+isThenable
+	^ true
+! !
+
 Promise setTraitComposition: {TThenable} asTraitComposition!
 ! !