Jelajahi Sumber

Add #provided.

To allow `require provided resolve: 'package.json'`
instead of ugly `(JSObjectProxy on: require) resolve: ...`
or even worse ``(require basicAt: #resolve) value: ...`.

This happens only when JS function is used as
a namespace for API. Such occurrences are known,
so using dedicated selector can be justified (I hope).

It is by design only present in BlockClosure and Class
(to forward to constructor fn).
Herby Vojčík 5 tahun lalu
induk
melakukan
4799544c56
5 mengubah file dengan 73 tambahan dan 0 penghapusan
  1. 8 0
      API-CHANGES.txt
  2. 23 0
      src/Kernel-Classes.js
  3. 10 0
      src/Kernel-Classes.st
  4. 23 0
      src/Kernel-Methods.js
  5. 9 0
      src/Kernel-Methods.st

+ 8 - 0
API-CHANGES.txt

@@ -1,3 +1,11 @@
+0.22.1:
+
++ Class >>
+  + provided
++ Number >>
+  + provided
+
+
 0.22.0:
 
 * Deprecate Exception >> resignal. Should have been #pass.

+ 23 - 0
src/Kernel-Classes.js

@@ -839,6 +839,29 @@ messageSends: []
 }),
 $globals.Class);
 
+$core.addMethod(
+$core.method({
+selector: "provided",
+protocol: "converting",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($self._javascriptConstructor())._provided();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"provided",{},$globals.Class)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "provided\x0a\x09\x22Returns JS proxy that allows to access 'static API', as in\x0a\x09  Number provided EPSILON\x0a\x09that forwards to (wrapped JS) constructor function.\x22\x0a\x09\x0a\x09^ self javascriptConstructor provided",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["provided", "javascriptConstructor"]
+}),
+$globals.Class);
+
 $core.addMethod(
 $core.method({
 selector: "rename:",

+ 10 - 0
src/Kernel-Classes.st

@@ -199,6 +199,16 @@ theMetaClass
 	^ self class
 ! !
 
+!Class methodsFor: 'converting'!
+
+provided
+	"Returns JS proxy that allows to access 'static API', as in
+	  Number provided EPSILON
+	that forwards to (wrapped JS) constructor function."
+	
+	^ self javascriptConstructor provided
+! !
+
 !Class methodsFor: 'testing'!
 
 isClass

+ 23 - 0
src/Kernel-Methods.js

@@ -343,6 +343,29 @@ messageSends: ["tryCatch:", "asSmalltalkException:", "ifTrue:ifFalse:", "isKindO
 }),
 $globals.BlockClosure);
 
+$core.addMethod(
+$core.method({
+selector: "provided",
+protocol: "converting",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($globals.JSObjectProxy)._on_(self);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"provided",{},$globals.BlockClosure)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "provided\x0a\x09\x22Returns JS proxy that allows to access 'static API', as in\x0a\x09  require provided resolve: ...\x0a\x09or\x0a\x09  XMLHttpRequest provided DONE\x22\x0a\x09\x0a\x09^ JSObjectProxy on: self",
+referencedClasses: ["JSObjectProxy"],
+//>>excludeEnd("ide");
+messageSends: ["on:"]
+}),
+$globals.BlockClosure);
+
 $core.addMethod(
 $core.method({
 selector: "receiver",

+ 9 - 0
src/Kernel-Methods.st

@@ -77,6 +77,15 @@ currySelf
 			return self.apply(null, args);
 		}
 	'>
+!
+
+provided
+	"Returns JS proxy that allows to access 'static API', as in
+	  require provided resolve: ...
+	or
+	  XMLHttpRequest provided DONE"
+	
+	^ JSObjectProxy on: self
 ! !
 
 !BlockClosure methodsFor: 'error handling'!