Browse Source

Pragmas accessor is two-way adapter.

Herby Vojčík 5 years ago
parent
commit
f0ed47236e

+ 15 - 20
lang/src/Compiler-Core.js

@@ -580,45 +580,40 @@ selector: "compile:forClass:protocol:",
 protocol: "compiling",
 fn: function (aString,aClass,anotherString){
 var self=this,$self=this;
-var compilationResult,result;
+var compilationResult,result,pragmas,closure;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$3,$2;
+var $1,$2;
 compilationResult=$self._compileSource_forClass_protocol_(aString,aClass,anotherString);
-$1=compilationResult;
-$3=$recv(compilationResult)._at_("fn");
+pragmas=$recv(compilationResult)._at_("pragmas");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["at:"]=1;
 //>>excludeEnd("ctx");
-$2=$self._eval_forPackage_($3,$self._currentPackage());
-$recv($1)._at_put_("fn",$2);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["at:put:"]=1;
-//>>excludeEnd("ctx");
-$recv($1)._at_put_("pragmas",$recv($recv(compilationResult)._at_("pragmas"))._collect_((function(each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return [$recv(each)._selector(),$recv(each)._arguments()];
+closure=$self._eval_forPackage_($recv(compilationResult)._at_("fn"),$self._currentPackage());
+$1=compilationResult;
+$recv($1)._removeKey_("fn");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
+$ctx1.sendIdx["removeKey:"]=1;
 //>>excludeEnd("ctx");
-})));
+$recv($1)._removeKey_("pragmas");
 result=$recv($recv($globals.Smalltalk)._core())._method_(compilationResult);
-$recv(result)._protocol_(anotherString);
+$2=result;
+$recv($2)._protocol_(anotherString);
+$recv($2)._pragmas_(pragmas);
+$recv($2)._fn_(closure);
 return result;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"compile:forClass:protocol:",{aString:aString,aClass:aClass,anotherString:anotherString,compilationResult:compilationResult,result:result},$globals.Compiler)});
+}, function($ctx1) {$ctx1.fill(self,"compile:forClass:protocol:",{aString:aString,aClass:aClass,anotherString:anotherString,compilationResult:compilationResult,result:result,pragmas:pragmas,closure:closure},$globals.Compiler)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aString", "aClass", "anotherString"],
-source: "compile: aString forClass: aClass protocol: anotherString\x0a\x09| compilationResult result |\x0a\x09compilationResult :=\x0a\x09\x09self compileSource: aString forClass: aClass protocol: anotherString.\x0a\x09compilationResult\x0a\x09\x09at: #fn\x0a\x09\x09put: (self eval: (compilationResult at: #fn) forPackage: self currentPackage);\x0a\x09\x09at: #pragmas\x0a\x09\x09put: ((compilationResult at: #pragmas) collect: [ :each | { each selector. each arguments } ]).\x0a\x09result := Smalltalk core method: compilationResult.\x0a\x09result protocol: anotherString.\x0a\x09^ result",
+source: "compile: aString forClass: aClass protocol: anotherString\x0a\x09| compilationResult result pragmas closure |\x0a\x09compilationResult :=\x0a\x09\x09self compileSource: aString forClass: aClass protocol: anotherString.\x0a\x09pragmas := compilationResult at: #pragmas.\x0a\x09closure := self eval: (compilationResult at: #fn) forPackage: self currentPackage.\x0a\x09compilationResult removeKey: #fn; removeKey: #pragmas.\x0a\x09result := Smalltalk core method: compilationResult.\x0a\x09result protocol: anotherString; pragmas: pragmas; fn: closure.\x0a\x09^ result",
 referencedClasses: ["Smalltalk"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["compileSource:forClass:protocol:", "at:put:", "eval:forPackage:", "at:", "currentPackage", "collect:", "selector", "arguments", "method:", "core", "protocol:"]
+messageSends: ["compileSource:forClass:protocol:", "at:", "eval:forPackage:", "currentPackage", "removeKey:", "method:", "core", "protocol:", "pragmas:", "fn:"]
 }),
 $globals.Compiler);
 

+ 5 - 7
lang/src/Compiler-Core.st

@@ -168,16 +168,14 @@ ast: aString forClass: aClass protocol: anotherString
 !
 
 compile: aString forClass: aClass protocol: anotherString
-	| compilationResult result |
+	| compilationResult result pragmas closure |
 	compilationResult :=
 		self compileSource: aString forClass: aClass protocol: anotherString.
-	compilationResult
-		at: #fn
-		put: (self eval: (compilationResult at: #fn) forPackage: self currentPackage);
-		at: #pragmas
-		put: ((compilationResult at: #pragmas) collect: [ :each | { each selector. each arguments } ]).
+	pragmas := compilationResult at: #pragmas.
+	closure := self eval: (compilationResult at: #fn) forPackage: self currentPackage.
+	compilationResult removeKey: #fn; removeKey: #pragmas.
 	result := Smalltalk core method: compilationResult.
-	result protocol: anotherString.
+	result protocol: anotherString; pragmas: pragmas; fn: closure.
 	^ result
 !
 

+ 61 - 16
lang/src/Kernel-Methods.js

@@ -789,6 +789,36 @@ messageSends: ["ifNil:"]
 }),
 $globals.CompiledMethod);
 
+$core.addMethod(
+$core.method({
+selector: "basicPragmas",
+protocol: "accessing",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$receiver;
+$1=$self.pragmas;
+if(($receiver = $1) == null || $receiver.a$nil){
+return [];
+} else {
+return $1;
+}
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"basicPragmas",{},$globals.CompiledMethod)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "basicPragmas\x0a\x09^ pragmas ifNil: [ #() ]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["ifNil:"]
+}),
+$globals.CompiledMethod);
+
 $core.addMethod(
 $core.method({
 selector: "browse",
@@ -1075,24 +1105,26 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $1,$receiver;
-$1=$self.pragmas;
-if(($receiver = $1) == null || $receiver.a$nil){
-return [];
-} else {
-return $1;
-}
+return $recv($self._basicPragmas())._collect_((function(each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv($globals.Message)._selector_arguments_($recv(each)._first(),$recv(each)._second());
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"pragmas",{},$globals.CompiledMethod)});
 //>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "pragmas\x0a\x09^ pragmas ifNil: [ #() ]",
-referencedClasses: [],
+source: "pragmas\x0a\x09^ self basicPragmas collect: [ :each | Message selector: each first arguments: each second ]",
+referencedClasses: ["Message"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifNil:"]
+messageSends: ["collect:", "basicPragmas", "selector:arguments:", "first", "second"]
 }),
 $globals.CompiledMethod);
 
@@ -1100,19 +1132,32 @@ $core.addMethod(
 $core.method({
 selector: "pragmas:",
 protocol: "accessing",
-fn: function (anArray){
+fn: function (anArrayOfMessages){
 var self=this,$self=this;
-$self.pragmas=anArray;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self.pragmas=$recv(anArrayOfMessages)._collect_((function(each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return [$recv(each)._selector(),$recv(each)._arguments()];
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
 return self;
-
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"pragmas:",{anArrayOfMessages:anArrayOfMessages},$globals.CompiledMethod)});
+//>>excludeEnd("ctx");
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anArray"],
-source: "pragmas: anArray\x0a\x09pragmas := anArray",
+args: ["anArrayOfMessages"],
+source: "pragmas: anArrayOfMessages\x0a\x09pragmas := anArrayOfMessages collect: [ :each | { each selector. each arguments } ]",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: []
+messageSends: ["collect:", "selector", "arguments"]
 }),
 $globals.CompiledMethod);
 

+ 7 - 3
lang/src/Kernel-Methods.st

@@ -229,6 +229,10 @@ arguments
 	^ args ifNil: [ #() ]
 !
 
+basicPragmas
+	^ pragmas ifNil: [ #() ]
+!
+
 category
 	^ self protocol
 !
@@ -258,11 +262,11 @@ package
 !
 
 pragmas
-	^ pragmas ifNil: [ #() ]
+	^ self basicPragmas collect: [ :each | Message selector: each first arguments: each second ]
 !
 
-pragmas: anArray
-	pragmas := anArray
+pragmas: anArrayOfMessages
+	pragmas := anArrayOfMessages collect: [ :each | { each selector. each arguments } ]
 !
 
 protocol

+ 3 - 3
lang/src/Platform-ImportExport.js

@@ -1371,7 +1371,7 @@ $recv(aStream)._lf();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["lf"]=10;
 //>>excludeEnd("ctx");
-$12=$recv($recv(aMethod)._pragmas())._asJavaScriptSource();
+$12=$recv($recv(aMethod)._basicPragmas())._asJavaScriptSource();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["asJavaScriptSource"]=6;
 //>>excludeEnd("ctx");
@@ -1418,11 +1418,11 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aMethod", "aStream"],
-source: "exportMethod: aMethod on: aStream\x0a\x09aStream\x0a\x09\x09write: '$core.addMethod('; lf;\x0a\x09\x09write: '$core.method({'; lf;\x0a\x09\x09write: { 'selector: '. aMethod selector asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'protocol: '. aMethod protocol asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'fn: '. aMethod fn compiledSource. ',' }; lf;\x0a\x09\x09write: '//>>excludeStart(\x22ide\x22, pragmas.excludeIdeData);'; lf;\x0a\x09\x09write: { 'args: '. aMethod arguments asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'source: '. aMethod source asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'referencedClasses: '. aMethod referencedClasses asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: '//>>excludeEnd(\x22ide\x22);'; lf;\x0a\x09\x09write: { 'pragmas: '. aMethod pragmas asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'messageSends: '. aMethod messageSends asJavaScriptSource }; lf;\x0a\x09\x09write: '}),'; lf;\x0a\x09\x09write: { aMethod methodClass asJavaScriptSource. ');' }; lf; lf",
+source: "exportMethod: aMethod on: aStream\x0a\x09aStream\x0a\x09\x09write: '$core.addMethod('; lf;\x0a\x09\x09write: '$core.method({'; lf;\x0a\x09\x09write: { 'selector: '. aMethod selector asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'protocol: '. aMethod protocol asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'fn: '. aMethod fn compiledSource. ',' }; lf;\x0a\x09\x09write: '//>>excludeStart(\x22ide\x22, pragmas.excludeIdeData);'; lf;\x0a\x09\x09write: { 'args: '. aMethod arguments asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'source: '. aMethod source asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'referencedClasses: '. aMethod referencedClasses asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: '//>>excludeEnd(\x22ide\x22);'; lf;\x0a\x09\x09write: { 'pragmas: '. aMethod basicPragmas asJavaScriptSource. ',' }; lf;\x0a\x09\x09write: { 'messageSends: '. aMethod messageSends asJavaScriptSource }; lf;\x0a\x09\x09write: '}),'; lf;\x0a\x09\x09write: { aMethod methodClass asJavaScriptSource. ');' }; lf; lf",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["write:", "lf", "asJavaScriptSource", "selector", "protocol", "compiledSource", "fn", "arguments", "source", "referencedClasses", "pragmas", "messageSends", "methodClass"]
+messageSends: ["write:", "lf", "asJavaScriptSource", "selector", "protocol", "compiledSource", "fn", "arguments", "source", "referencedClasses", "basicPragmas", "messageSends", "methodClass"]
 }),
 $globals.Exporter);
 

+ 1 - 1
lang/src/Platform-ImportExport.st

@@ -342,7 +342,7 @@ exportMethod: aMethod on: aStream
 		write: { 'source: '. aMethod source asJavaScriptSource. ',' }; lf;
 		write: { 'referencedClasses: '. aMethod referencedClasses asJavaScriptSource. ',' }; lf;
 		write: '//>>excludeEnd("ide");'; lf;
-		write: { 'pragmas: '. aMethod pragmas asJavaScriptSource. ',' }; lf;
+		write: { 'pragmas: '. aMethod basicPragmas asJavaScriptSource. ',' }; lf;
 		write: { 'messageSends: '. aMethod messageSends asJavaScriptSource }; lf;
 		write: '}),'; lf;
 		write: { aMethod methodClass asJavaScriptSource. ');' }; lf; lf