Compiler-Core.js 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357
  1. define(["amber/boot", "require", "amber/core/Kernel-Collections", "amber/core/Kernel-Objects"], function($boot,requirejs){"use strict";
  2. var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
  3. var $pkg = $core.addPackage("Compiler-Core");
  4. $pkg.innerEval = function (expr) { return eval(expr); };
  5. $pkg.transport = {"type":"amd","amdNamespace":"amber/core"};
  6. $core.addClass("AbstractCodeGenerator", $globals.Object, ["currentClass", "currentPackage", "source"], "Compiler-Core");
  7. //>>excludeStart("ide", pragmas.excludeIdeData);
  8. $globals.AbstractCodeGenerator.comment="I am the abstract super class of all code generators and provide their common API.";
  9. //>>excludeEnd("ide");
  10. $core.addMethod(
  11. $core.method({
  12. selector: "compileNode:",
  13. protocol: "compiling",
  14. //>>excludeStart("ide", pragmas.excludeIdeData);
  15. args: ["aNode"],
  16. source: "compileNode: aNode\x0a\x09^ self transformers\x0a\x09\x09inject: aNode\x0a\x09\x09into: [ :input :transformer | transformer value: input ]",
  17. referencedClasses: [],
  18. //>>excludeEnd("ide");
  19. pragmas: [],
  20. messageSends: ["inject:into:", "transformers", "value:"]
  21. }, function ($methodClass){ return function (aNode){
  22. var self=this,$self=this;
  23. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  24. return $core.withContext(function($ctx1) {
  25. //>>excludeEnd("ctx");
  26. return $recv($self._transformers())._inject_into_(aNode,(function(input,transformer){
  27. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  28. return $core.withContext(function($ctx2) {
  29. //>>excludeEnd("ctx");
  30. return $recv(transformer)._value_(input);
  31. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  32. }, function($ctx2) {$ctx2.fillBlock({input:input,transformer:transformer},$ctx1,1)});
  33. //>>excludeEnd("ctx");
  34. }));
  35. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  36. }, function($ctx1) {$ctx1.fill(self,"compileNode:",{aNode:aNode})});
  37. //>>excludeEnd("ctx");
  38. }; }),
  39. $globals.AbstractCodeGenerator);
  40. $core.addMethod(
  41. $core.method({
  42. selector: "currentClass",
  43. protocol: "accessing",
  44. //>>excludeStart("ide", pragmas.excludeIdeData);
  45. args: [],
  46. source: "currentClass\x0a\x09^ currentClass",
  47. referencedClasses: [],
  48. //>>excludeEnd("ide");
  49. pragmas: [],
  50. messageSends: []
  51. }, function ($methodClass){ return function (){
  52. var self=this,$self=this;
  53. return $self.currentClass;
  54. }; }),
  55. $globals.AbstractCodeGenerator);
  56. $core.addMethod(
  57. $core.method({
  58. selector: "currentClass:",
  59. protocol: "accessing",
  60. //>>excludeStart("ide", pragmas.excludeIdeData);
  61. args: ["aClass"],
  62. source: "currentClass: aClass\x0a\x09currentClass := aClass",
  63. referencedClasses: [],
  64. //>>excludeEnd("ide");
  65. pragmas: [],
  66. messageSends: []
  67. }, function ($methodClass){ return function (aClass){
  68. var self=this,$self=this;
  69. $self.currentClass=aClass;
  70. return self;
  71. }; }),
  72. $globals.AbstractCodeGenerator);
  73. $core.addMethod(
  74. $core.method({
  75. selector: "currentPackage",
  76. protocol: "accessing",
  77. //>>excludeStart("ide", pragmas.excludeIdeData);
  78. args: [],
  79. source: "currentPackage\x0a\x09^ currentPackage",
  80. referencedClasses: [],
  81. //>>excludeEnd("ide");
  82. pragmas: [],
  83. messageSends: []
  84. }, function ($methodClass){ return function (){
  85. var self=this,$self=this;
  86. return $self.currentPackage;
  87. }; }),
  88. $globals.AbstractCodeGenerator);
  89. $core.addMethod(
  90. $core.method({
  91. selector: "currentPackage:",
  92. protocol: "accessing",
  93. //>>excludeStart("ide", pragmas.excludeIdeData);
  94. args: ["anObject"],
  95. source: "currentPackage: anObject\x0a\x09currentPackage := anObject",
  96. referencedClasses: [],
  97. //>>excludeEnd("ide");
  98. pragmas: [],
  99. messageSends: []
  100. }, function ($methodClass){ return function (anObject){
  101. var self=this,$self=this;
  102. $self.currentPackage=anObject;
  103. return self;
  104. }; }),
  105. $globals.AbstractCodeGenerator);
  106. $core.addMethod(
  107. $core.method({
  108. selector: "pseudoVariables",
  109. protocol: "accessing",
  110. //>>excludeStart("ide", pragmas.excludeIdeData);
  111. args: [],
  112. source: "pseudoVariables\x0a\x09^ Smalltalk pseudoVariableNames",
  113. referencedClasses: ["Smalltalk"],
  114. //>>excludeEnd("ide");
  115. pragmas: [],
  116. messageSends: ["pseudoVariableNames"]
  117. }, function ($methodClass){ return function (){
  118. var self=this,$self=this;
  119. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  120. return $core.withContext(function($ctx1) {
  121. //>>excludeEnd("ctx");
  122. return $recv($globals.Smalltalk)._pseudoVariableNames();
  123. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  124. }, function($ctx1) {$ctx1.fill(self,"pseudoVariables",{})});
  125. //>>excludeEnd("ctx");
  126. }; }),
  127. $globals.AbstractCodeGenerator);
  128. $core.addMethod(
  129. $core.method({
  130. selector: "source",
  131. protocol: "accessing",
  132. //>>excludeStart("ide", pragmas.excludeIdeData);
  133. args: [],
  134. source: "source\x0a\x09^ source ifNil: [ '' ]",
  135. referencedClasses: [],
  136. //>>excludeEnd("ide");
  137. pragmas: [],
  138. messageSends: ["ifNil:"]
  139. }, function ($methodClass){ return function (){
  140. var self=this,$self=this;
  141. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  142. return $core.withContext(function($ctx1) {
  143. //>>excludeEnd("ctx");
  144. var $1,$receiver;
  145. $1=$self.source;
  146. if(($receiver = $1) == null || $receiver.a$nil){
  147. return "";
  148. } else {
  149. return $1;
  150. }
  151. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  152. }, function($ctx1) {$ctx1.fill(self,"source",{})});
  153. //>>excludeEnd("ctx");
  154. }; }),
  155. $globals.AbstractCodeGenerator);
  156. $core.addMethod(
  157. $core.method({
  158. selector: "source:",
  159. protocol: "accessing",
  160. //>>excludeStart("ide", pragmas.excludeIdeData);
  161. args: ["aString"],
  162. source: "source: aString\x0a\x09source := aString",
  163. referencedClasses: [],
  164. //>>excludeEnd("ide");
  165. pragmas: [],
  166. messageSends: []
  167. }, function ($methodClass){ return function (aString){
  168. var self=this,$self=this;
  169. $self.source=aString;
  170. return self;
  171. }; }),
  172. $globals.AbstractCodeGenerator);
  173. $core.addMethod(
  174. $core.method({
  175. selector: "transformers",
  176. protocol: "compiling",
  177. //>>excludeStart("ide", pragmas.excludeIdeData);
  178. args: [],
  179. source: "transformers\x0a\x09| dict |\x0a\x09dict := self transformersDictionary.\x0a\x09^ dict keys asArray sort collect: [ :each | dict at: each ]",
  180. referencedClasses: [],
  181. //>>excludeEnd("ide");
  182. pragmas: [],
  183. messageSends: ["transformersDictionary", "collect:", "sort", "asArray", "keys", "at:"]
  184. }, function ($methodClass){ return function (){
  185. var self=this,$self=this;
  186. var dict;
  187. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  188. return $core.withContext(function($ctx1) {
  189. //>>excludeEnd("ctx");
  190. dict=$self._transformersDictionary();
  191. return $recv($recv($recv($recv(dict)._keys())._asArray())._sort())._collect_((function(each){
  192. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  193. return $core.withContext(function($ctx2) {
  194. //>>excludeEnd("ctx");
  195. return $recv(dict)._at_(each);
  196. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  197. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  198. //>>excludeEnd("ctx");
  199. }));
  200. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  201. }, function($ctx1) {$ctx1.fill(self,"transformers",{dict:dict})});
  202. //>>excludeEnd("ctx");
  203. }; }),
  204. $globals.AbstractCodeGenerator);
  205. $core.addMethod(
  206. $core.method({
  207. selector: "transformersDictionary",
  208. protocol: "compiling",
  209. //>>excludeStart("ide", pragmas.excludeIdeData);
  210. args: [],
  211. source: "transformersDictionary\x0a\x09self subclassResponsibility",
  212. referencedClasses: [],
  213. //>>excludeEnd("ide");
  214. pragmas: [],
  215. messageSends: ["subclassResponsibility"]
  216. }, function ($methodClass){ return function (){
  217. var self=this,$self=this;
  218. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  219. return $core.withContext(function($ctx1) {
  220. //>>excludeEnd("ctx");
  221. $self._subclassResponsibility();
  222. return self;
  223. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  224. }, function($ctx1) {$ctx1.fill(self,"transformersDictionary",{})});
  225. //>>excludeEnd("ctx");
  226. }; }),
  227. $globals.AbstractCodeGenerator);
  228. $core.addClass("CodeGenerator", $globals.AbstractCodeGenerator, ["transformersDictionary"], "Compiler-Core");
  229. //>>excludeStart("ide", pragmas.excludeIdeData);
  230. $globals.CodeGenerator.comment="I am a basic code generator. I generate a valid JavaScript output, but no not perform any inlining.\x0aSee `InliningCodeGenerator` for an optimized JavaScript code generation.";
  231. //>>excludeEnd("ide");
  232. $core.addMethod(
  233. $core.method({
  234. selector: "earlyAstPragmator",
  235. protocol: "compiling",
  236. //>>excludeStart("ide", pragmas.excludeIdeData);
  237. args: [],
  238. source: "earlyAstPragmator\x0a\x09^ AstEarlyPragmator new",
  239. referencedClasses: ["AstEarlyPragmator"],
  240. //>>excludeEnd("ide");
  241. pragmas: [],
  242. messageSends: ["new"]
  243. }, function ($methodClass){ return function (){
  244. var self=this,$self=this;
  245. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  246. return $core.withContext(function($ctx1) {
  247. //>>excludeEnd("ctx");
  248. return $recv($globals.AstEarlyPragmator)._new();
  249. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  250. }, function($ctx1) {$ctx1.fill(self,"earlyAstPragmator",{})});
  251. //>>excludeEnd("ctx");
  252. }; }),
  253. $globals.CodeGenerator);
  254. $core.addMethod(
  255. $core.method({
  256. selector: "irTranslator",
  257. protocol: "compiling",
  258. //>>excludeStart("ide", pragmas.excludeIdeData);
  259. args: [],
  260. source: "irTranslator\x0a\x09^ self irTranslatorClass new\x0a\x09\x09currentClass: self currentClass;\x0a\x09\x09yourself",
  261. referencedClasses: [],
  262. //>>excludeEnd("ide");
  263. pragmas: [],
  264. messageSends: ["currentClass:", "new", "irTranslatorClass", "currentClass", "yourself"]
  265. }, function ($methodClass){ return function (){
  266. var self=this,$self=this;
  267. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  268. return $core.withContext(function($ctx1) {
  269. //>>excludeEnd("ctx");
  270. var $1;
  271. $1=$recv($self._irTranslatorClass())._new();
  272. $recv($1)._currentClass_($self._currentClass());
  273. return $recv($1)._yourself();
  274. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  275. }, function($ctx1) {$ctx1.fill(self,"irTranslator",{})});
  276. //>>excludeEnd("ctx");
  277. }; }),
  278. $globals.CodeGenerator);
  279. $core.addMethod(
  280. $core.method({
  281. selector: "irTranslatorClass",
  282. protocol: "compiling",
  283. //>>excludeStart("ide", pragmas.excludeIdeData);
  284. args: [],
  285. source: "irTranslatorClass\x0a\x09^ IRJSTranslator",
  286. referencedClasses: ["IRJSTranslator"],
  287. //>>excludeEnd("ide");
  288. pragmas: [],
  289. messageSends: []
  290. }, function ($methodClass){ return function (){
  291. var self=this,$self=this;
  292. return $globals.IRJSTranslator;
  293. }; }),
  294. $globals.CodeGenerator);
  295. $core.addMethod(
  296. $core.method({
  297. selector: "semanticAnalyzer",
  298. protocol: "compiling",
  299. //>>excludeStart("ide", pragmas.excludeIdeData);
  300. args: [],
  301. source: "semanticAnalyzer\x0a\x09^ (SemanticAnalyzer on: self currentClass)\x0a\x09\x09thePackage: self currentPackage;\x0a\x09\x09yourself",
  302. referencedClasses: ["SemanticAnalyzer"],
  303. //>>excludeEnd("ide");
  304. pragmas: [],
  305. messageSends: ["thePackage:", "on:", "currentClass", "currentPackage", "yourself"]
  306. }, function ($methodClass){ return function (){
  307. var self=this,$self=this;
  308. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  309. return $core.withContext(function($ctx1) {
  310. //>>excludeEnd("ctx");
  311. var $1;
  312. $1=$recv($globals.SemanticAnalyzer)._on_($self._currentClass());
  313. $recv($1)._thePackage_($self._currentPackage());
  314. return $recv($1)._yourself();
  315. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  316. }, function($ctx1) {$ctx1.fill(self,"semanticAnalyzer",{})});
  317. //>>excludeEnd("ctx");
  318. }; }),
  319. $globals.CodeGenerator);
  320. $core.addMethod(
  321. $core.method({
  322. selector: "transformersDictionary",
  323. protocol: "compiling",
  324. //>>excludeStart("ide", pragmas.excludeIdeData);
  325. args: [],
  326. source: "transformersDictionary\x0a\x09^ transformersDictionary ifNil: [ transformersDictionary := Dictionary new\x0a\x09\x09at: '1000-earlyPragmas' put: self earlyAstPragmator;\x0a\x09\x09at: '2000-semantic' put: self semanticAnalyzer;\x0a\x09\x09at: '5000-astToIr' put: self translator;\x0a\x09\x09at: '8000-irToJs' put: self irTranslator;\x0a\x09\x09yourself ]",
  327. referencedClasses: ["Dictionary"],
  328. //>>excludeEnd("ide");
  329. pragmas: [],
  330. messageSends: ["ifNil:", "at:put:", "new", "earlyAstPragmator", "semanticAnalyzer", "translator", "irTranslator", "yourself"]
  331. }, function ($methodClass){ return function (){
  332. var self=this,$self=this;
  333. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  334. return $core.withContext(function($ctx1) {
  335. //>>excludeEnd("ctx");
  336. var $1,$2,$receiver;
  337. $1=$self.transformersDictionary;
  338. if(($receiver = $1) == null || $receiver.a$nil){
  339. $2=$recv($globals.Dictionary)._new();
  340. $recv($2)._at_put_("1000-earlyPragmas",$self._earlyAstPragmator());
  341. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  342. $ctx1.sendIdx["at:put:"]=1;
  343. //>>excludeEnd("ctx");
  344. $recv($2)._at_put_("2000-semantic",$self._semanticAnalyzer());
  345. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  346. $ctx1.sendIdx["at:put:"]=2;
  347. //>>excludeEnd("ctx");
  348. $recv($2)._at_put_("5000-astToIr",$self._translator());
  349. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  350. $ctx1.sendIdx["at:put:"]=3;
  351. //>>excludeEnd("ctx");
  352. $recv($2)._at_put_("8000-irToJs",$self._irTranslator());
  353. $self.transformersDictionary=$recv($2)._yourself();
  354. return $self.transformersDictionary;
  355. } else {
  356. return $1;
  357. }
  358. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  359. }, function($ctx1) {$ctx1.fill(self,"transformersDictionary",{})});
  360. //>>excludeEnd("ctx");
  361. }; }),
  362. $globals.CodeGenerator);
  363. $core.addMethod(
  364. $core.method({
  365. selector: "translator",
  366. protocol: "compiling",
  367. //>>excludeStart("ide", pragmas.excludeIdeData);
  368. args: [],
  369. source: "translator\x0a\x09^ IRASTTranslator new\x0a\x09\x09source: self source;\x0a\x09\x09theClass: self currentClass;\x0a\x09\x09yourself",
  370. referencedClasses: ["IRASTTranslator"],
  371. //>>excludeEnd("ide");
  372. pragmas: [],
  373. messageSends: ["source:", "new", "source", "theClass:", "currentClass", "yourself"]
  374. }, function ($methodClass){ return function (){
  375. var self=this,$self=this;
  376. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  377. return $core.withContext(function($ctx1) {
  378. //>>excludeEnd("ctx");
  379. var $1;
  380. $1=$recv($globals.IRASTTranslator)._new();
  381. $recv($1)._source_($self._source());
  382. $recv($1)._theClass_($self._currentClass());
  383. return $recv($1)._yourself();
  384. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  385. }, function($ctx1) {$ctx1.fill(self,"translator",{})});
  386. //>>excludeEnd("ctx");
  387. }; }),
  388. $globals.CodeGenerator);
  389. $core.addClass("Compiler", $globals.Object, ["currentClass", "currentPackage", "source", "codeGeneratorClass", "codeGenerator"], "Compiler-Core");
  390. //>>excludeStart("ide", pragmas.excludeIdeData);
  391. $globals.Compiler.comment="I provide the public interface for compiling Amber source code into JavaScript.\x0a\x0aThe code generator used to produce JavaScript can be plugged with `#codeGeneratorClass`.\x0aThe default code generator is an instance of `InlinedCodeGenerator`";
  392. //>>excludeEnd("ide");
  393. $core.addMethod(
  394. $core.method({
  395. selector: "ast:forClass:protocol:",
  396. protocol: "compiling",
  397. //>>excludeStart("ide", pragmas.excludeIdeData);
  398. args: ["aString", "aClass", "anotherString"],
  399. source: "ast: aString forClass: aClass protocol: anotherString\x0a\x09self\x0a\x09\x09source: aString;\x0a\x09\x09forClass: aClass protocol: anotherString.\x0a\x0a\x09self codeGenerator transformersDictionary at: '2500-astCheckpoint' put: [ :x | ^x ].\x0a\x09\x0a\x09self compileNode: (self parse: aString).\x0a\x0a\x09CompilerError signal: 'AST transformation failed.'",
  400. referencedClasses: ["CompilerError"],
  401. //>>excludeEnd("ide");
  402. pragmas: [],
  403. messageSends: ["source:", "forClass:protocol:", "at:put:", "transformersDictionary", "codeGenerator", "compileNode:", "parse:", "signal:"]
  404. }, function ($methodClass){ return function (aString,aClass,anotherString){
  405. var self=this,$self=this;
  406. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  407. return $core.withContext(function($ctx1) {
  408. //>>excludeEnd("ctx");
  409. var $early={};
  410. try {
  411. $self._source_(aString);
  412. $self._forClass_protocol_(aClass,anotherString);
  413. $recv($recv($self._codeGenerator())._transformersDictionary())._at_put_("2500-astCheckpoint",(function(x){
  414. throw $early=[x];
  415. }));
  416. $self._compileNode_($self._parse_(aString));
  417. $recv($globals.CompilerError)._signal_("AST transformation failed.");
  418. return self;
  419. }
  420. catch(e) {if(e===$early)return e[0]; throw e}
  421. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  422. }, function($ctx1) {$ctx1.fill(self,"ast:forClass:protocol:",{aString:aString,aClass:aClass,anotherString:anotherString})});
  423. //>>excludeEnd("ctx");
  424. }; }),
  425. $globals.Compiler);
  426. $core.addMethod(
  427. $core.method({
  428. selector: "cleanCodeGenerator",
  429. protocol: "accessing",
  430. //>>excludeStart("ide", pragmas.excludeIdeData);
  431. args: [],
  432. source: "cleanCodeGenerator\x0a\x09codeGenerator := nil",
  433. referencedClasses: [],
  434. //>>excludeEnd("ide");
  435. pragmas: [],
  436. messageSends: []
  437. }, function ($methodClass){ return function (){
  438. var self=this,$self=this;
  439. $self.codeGenerator=nil;
  440. return self;
  441. }; }),
  442. $globals.Compiler);
  443. $core.addMethod(
  444. $core.method({
  445. selector: "codeGenerator",
  446. protocol: "accessing",
  447. //>>excludeStart("ide", pragmas.excludeIdeData);
  448. args: [],
  449. source: "codeGenerator\x0a\x09^ codeGenerator ifNil: [ codeGenerator := self codeGeneratorClass new\x0a\x09\x09\x09source: self source;\x0a\x09\x09\x09currentClass: self currentClass;\x0a\x09\x09\x09currentPackage: self currentPackage;\x0a\x09\x09\x09yourself ]",
  450. referencedClasses: [],
  451. //>>excludeEnd("ide");
  452. pragmas: [],
  453. messageSends: ["ifNil:", "source:", "new", "codeGeneratorClass", "source", "currentClass:", "currentClass", "currentPackage:", "currentPackage", "yourself"]
  454. }, function ($methodClass){ return function (){
  455. var self=this,$self=this;
  456. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  457. return $core.withContext(function($ctx1) {
  458. //>>excludeEnd("ctx");
  459. var $1,$2,$receiver;
  460. $1=$self.codeGenerator;
  461. if(($receiver = $1) == null || $receiver.a$nil){
  462. $2=$recv($self._codeGeneratorClass())._new();
  463. $recv($2)._source_($self._source());
  464. $recv($2)._currentClass_($self._currentClass());
  465. $recv($2)._currentPackage_($self._currentPackage());
  466. $self.codeGenerator=$recv($2)._yourself();
  467. return $self.codeGenerator;
  468. } else {
  469. return $1;
  470. }
  471. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  472. }, function($ctx1) {$ctx1.fill(self,"codeGenerator",{})});
  473. //>>excludeEnd("ctx");
  474. }; }),
  475. $globals.Compiler);
  476. $core.addMethod(
  477. $core.method({
  478. selector: "codeGeneratorClass",
  479. protocol: "accessing",
  480. //>>excludeStart("ide", pragmas.excludeIdeData);
  481. args: [],
  482. source: "codeGeneratorClass\x0a\x09^ codeGeneratorClass ifNil: [ InliningCodeGenerator ]",
  483. referencedClasses: ["InliningCodeGenerator"],
  484. //>>excludeEnd("ide");
  485. pragmas: [],
  486. messageSends: ["ifNil:"]
  487. }, function ($methodClass){ return function (){
  488. var self=this,$self=this;
  489. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  490. return $core.withContext(function($ctx1) {
  491. //>>excludeEnd("ctx");
  492. var $1,$receiver;
  493. $1=$self.codeGeneratorClass;
  494. if(($receiver = $1) == null || $receiver.a$nil){
  495. return $globals.InliningCodeGenerator;
  496. } else {
  497. return $1;
  498. }
  499. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  500. }, function($ctx1) {$ctx1.fill(self,"codeGeneratorClass",{})});
  501. //>>excludeEnd("ctx");
  502. }; }),
  503. $globals.Compiler);
  504. $core.addMethod(
  505. $core.method({
  506. selector: "codeGeneratorClass:",
  507. protocol: "accessing",
  508. //>>excludeStart("ide", pragmas.excludeIdeData);
  509. args: ["aClass"],
  510. source: "codeGeneratorClass: aClass\x0a\x09codeGeneratorClass := aClass",
  511. referencedClasses: [],
  512. //>>excludeEnd("ide");
  513. pragmas: [],
  514. messageSends: []
  515. }, function ($methodClass){ return function (aClass){
  516. var self=this,$self=this;
  517. $self.codeGeneratorClass=aClass;
  518. return self;
  519. }; }),
  520. $globals.Compiler);
  521. $core.addMethod(
  522. $core.method({
  523. selector: "compile:forClass:protocol:",
  524. protocol: "compiling",
  525. //>>excludeStart("ide", pragmas.excludeIdeData);
  526. args: ["aString", "aClass", "anotherString"],
  527. source: "compile: aString forClass: aClass protocol: anotherString\x0a\x09| compilationResult result pragmas closureFactory |\x0a\x09compilationResult :=\x0a\x09\x09self compileSource: aString forClass: aClass protocol: anotherString.\x0a\x09pragmas := compilationResult removeKey: #pragmas.\x0a\x09closureFactory := (compilationResult removeKey: #instantiateFn ifAbsent: [])\x0a\x09\x09ifNotNil: [ :js | self eval: js forPackage: self currentPackage ].\x0a\x09result := Smalltalk core method: compilationResult.\x0a\x09result protocol: anotherString; pragmas: pragmas.\x0a\x09closureFactory ifNotNil: [ result instantiateFn: closureFactory ].\x0a\x09^ result",
  528. referencedClasses: ["Smalltalk"],
  529. //>>excludeEnd("ide");
  530. pragmas: [],
  531. messageSends: ["compileSource:forClass:protocol:", "removeKey:", "ifNotNil:", "removeKey:ifAbsent:", "eval:forPackage:", "currentPackage", "method:", "core", "protocol:", "pragmas:", "instantiateFn:"]
  532. }, function ($methodClass){ return function (aString,aClass,anotherString){
  533. var self=this,$self=this;
  534. var compilationResult,result,pragmas,closureFactory;
  535. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  536. return $core.withContext(function($ctx1) {
  537. //>>excludeEnd("ctx");
  538. var $1,$2,$3,$receiver;
  539. compilationResult=$self._compileSource_forClass_protocol_(aString,aClass,anotherString);
  540. pragmas=$recv(compilationResult)._removeKey_("pragmas");
  541. $1=$recv(compilationResult)._removeKey_ifAbsent_("instantiateFn",(function(){
  542. }));
  543. if(($receiver = $1) == null || $receiver.a$nil){
  544. closureFactory=$1;
  545. } else {
  546. var js;
  547. js=$receiver;
  548. closureFactory=$self._eval_forPackage_(js,$self._currentPackage());
  549. }
  550. result=$recv($recv($globals.Smalltalk)._core())._method_(compilationResult);
  551. $2=result;
  552. $recv($2)._protocol_(anotherString);
  553. $recv($2)._pragmas_(pragmas);
  554. $3=closureFactory;
  555. if(($receiver = $3) == null || $receiver.a$nil){
  556. $3;
  557. } else {
  558. $recv(result)._instantiateFn_(closureFactory);
  559. }
  560. return result;
  561. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  562. }, function($ctx1) {$ctx1.fill(self,"compile:forClass:protocol:",{aString:aString,aClass:aClass,anotherString:anotherString,compilationResult:compilationResult,result:result,pragmas:pragmas,closureFactory:closureFactory})});
  563. //>>excludeEnd("ctx");
  564. }; }),
  565. $globals.Compiler);
  566. $core.addMethod(
  567. $core.method({
  568. selector: "compileExpression:on:",
  569. protocol: "compiling",
  570. //>>excludeStart("ide", pragmas.excludeIdeData);
  571. args: ["aString", "anObject"],
  572. source: "compileExpression: aString on: anObject\x0a\x09^ self\x0a\x09\x09compile: 'xxxDoIt ^ [ ', aString, ' ] value'\x0a\x09\x09forClass: anObject class\x0a\x09\x09protocol: '**xxxDoIt'",
  573. referencedClasses: [],
  574. //>>excludeEnd("ide");
  575. pragmas: [],
  576. messageSends: ["compile:forClass:protocol:", ",", "class"]
  577. }, function ($methodClass){ return function (aString,anObject){
  578. var self=this,$self=this;
  579. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  580. return $core.withContext(function($ctx1) {
  581. //>>excludeEnd("ctx");
  582. var $1;
  583. $1=$recv("xxxDoIt ^ [ ".__comma(aString)).__comma(" ] value");
  584. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  585. $ctx1.sendIdx[","]=1;
  586. //>>excludeEnd("ctx");
  587. return $self._compile_forClass_protocol_($1,$recv(anObject)._class(),"**xxxDoIt");
  588. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  589. }, function($ctx1) {$ctx1.fill(self,"compileExpression:on:",{aString:aString,anObject:anObject})});
  590. //>>excludeEnd("ctx");
  591. }; }),
  592. $globals.Compiler);
  593. $core.addMethod(
  594. $core.method({
  595. selector: "compileNode:",
  596. protocol: "compiling",
  597. //>>excludeStart("ide", pragmas.excludeIdeData);
  598. args: ["aNode"],
  599. source: "compileNode: aNode\x0a | result |\x0a\x09result := self codeGenerator compileNode: aNode.\x0a\x09self cleanCodeGenerator.\x0a\x09^ result",
  600. referencedClasses: [],
  601. //>>excludeEnd("ide");
  602. pragmas: [],
  603. messageSends: ["compileNode:", "codeGenerator", "cleanCodeGenerator"]
  604. }, function ($methodClass){ return function (aNode){
  605. var self=this,$self=this;
  606. var result;
  607. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  608. return $core.withContext(function($ctx1) {
  609. //>>excludeEnd("ctx");
  610. result=$recv($self._codeGenerator())._compileNode_(aNode);
  611. $self._cleanCodeGenerator();
  612. return result;
  613. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  614. }, function($ctx1) {$ctx1.fill(self,"compileNode:",{aNode:aNode,result:result})});
  615. //>>excludeEnd("ctx");
  616. }; }),
  617. $globals.Compiler);
  618. $core.addMethod(
  619. $core.method({
  620. selector: "compileSource:forClass:protocol:",
  621. protocol: "compiling",
  622. //>>excludeStart("ide", pragmas.excludeIdeData);
  623. args: ["aString", "aClass", "anotherString"],
  624. source: "compileSource: aString forClass: aClass protocol: anotherString\x0a\x09^ self\x0a\x09\x09source: aString;\x0a\x09\x09forClass: aClass protocol: anotherString;\x0a\x09\x09compileNode: (self parse: aString)",
  625. referencedClasses: [],
  626. //>>excludeEnd("ide");
  627. pragmas: [],
  628. messageSends: ["source:", "forClass:protocol:", "compileNode:", "parse:"]
  629. }, function ($methodClass){ return function (aString,aClass,anotherString){
  630. var self=this,$self=this;
  631. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  632. return $core.withContext(function($ctx1) {
  633. //>>excludeEnd("ctx");
  634. $self._source_(aString);
  635. $self._forClass_protocol_(aClass,anotherString);
  636. return $self._compileNode_($self._parse_(aString));
  637. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  638. }, function($ctx1) {$ctx1.fill(self,"compileSource:forClass:protocol:",{aString:aString,aClass:aClass,anotherString:anotherString})});
  639. //>>excludeEnd("ctx");
  640. }; }),
  641. $globals.Compiler);
  642. $core.addMethod(
  643. $core.method({
  644. selector: "currentClass",
  645. protocol: "accessing",
  646. //>>excludeStart("ide", pragmas.excludeIdeData);
  647. args: [],
  648. source: "currentClass\x0a\x09^ currentClass",
  649. referencedClasses: [],
  650. //>>excludeEnd("ide");
  651. pragmas: [],
  652. messageSends: []
  653. }, function ($methodClass){ return function (){
  654. var self=this,$self=this;
  655. return $self.currentClass;
  656. }; }),
  657. $globals.Compiler);
  658. $core.addMethod(
  659. $core.method({
  660. selector: "currentClass:",
  661. protocol: "accessing",
  662. //>>excludeStart("ide", pragmas.excludeIdeData);
  663. args: ["aClass"],
  664. source: "currentClass: aClass\x0a\x09currentClass := aClass",
  665. referencedClasses: [],
  666. //>>excludeEnd("ide");
  667. pragmas: [],
  668. messageSends: []
  669. }, function ($methodClass){ return function (aClass){
  670. var self=this,$self=this;
  671. $self.currentClass=aClass;
  672. return self;
  673. }; }),
  674. $globals.Compiler);
  675. $core.addMethod(
  676. $core.method({
  677. selector: "currentPackage",
  678. protocol: "accessing",
  679. //>>excludeStart("ide", pragmas.excludeIdeData);
  680. args: [],
  681. source: "currentPackage\x0a\x09^ currentPackage",
  682. referencedClasses: [],
  683. //>>excludeEnd("ide");
  684. pragmas: [],
  685. messageSends: []
  686. }, function ($methodClass){ return function (){
  687. var self=this,$self=this;
  688. return $self.currentPackage;
  689. }; }),
  690. $globals.Compiler);
  691. $core.addMethod(
  692. $core.method({
  693. selector: "currentPackage:",
  694. protocol: "accessing",
  695. //>>excludeStart("ide", pragmas.excludeIdeData);
  696. args: ["anObject"],
  697. source: "currentPackage: anObject\x0a\x09currentPackage := anObject",
  698. referencedClasses: [],
  699. //>>excludeEnd("ide");
  700. pragmas: [],
  701. messageSends: []
  702. }, function ($methodClass){ return function (anObject){
  703. var self=this,$self=this;
  704. $self.currentPackage=anObject;
  705. return self;
  706. }; }),
  707. $globals.Compiler);
  708. $core.addMethod(
  709. $core.method({
  710. selector: "eval:",
  711. protocol: "compiling",
  712. //>>excludeStart("ide", pragmas.excludeIdeData);
  713. args: ["aString"],
  714. source: "eval: aString\x0a\x09<inlineJS: 'return eval(aString)'>",
  715. referencedClasses: [],
  716. //>>excludeEnd("ide");
  717. pragmas: [["inlineJS:", ["return eval(aString)"]]],
  718. messageSends: []
  719. }, function ($methodClass){ return function (aString){
  720. var self=this,$self=this;
  721. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  722. return $core.withContext(function($ctx1) {
  723. //>>excludeEnd("ctx");
  724. return eval(aString);
  725. return self;
  726. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  727. }, function($ctx1) {$ctx1.fill(self,"eval:",{aString:aString})});
  728. //>>excludeEnd("ctx");
  729. }; }),
  730. $globals.Compiler);
  731. $core.addMethod(
  732. $core.method({
  733. selector: "eval:forPackage:",
  734. protocol: "compiling",
  735. //>>excludeStart("ide", pragmas.excludeIdeData);
  736. args: ["aString", "aPackage"],
  737. source: "eval: aString forPackage: aPackage\x0a\x09^ aPackage\x0a\x09\x09ifNil: [ self eval: aString ]\x0a\x09\x09ifNotNil: [ aPackage eval: aString ]",
  738. referencedClasses: [],
  739. //>>excludeEnd("ide");
  740. pragmas: [],
  741. messageSends: ["ifNil:ifNotNil:", "eval:"]
  742. }, function ($methodClass){ return function (aString,aPackage){
  743. var self=this,$self=this;
  744. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  745. return $core.withContext(function($ctx1) {
  746. //>>excludeEnd("ctx");
  747. var $receiver;
  748. if(($receiver = aPackage) == null || $receiver.a$nil){
  749. return $self._eval_(aString);
  750. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  751. $ctx1.sendIdx["eval:"]=1;
  752. //>>excludeEnd("ctx");
  753. } else {
  754. return $recv(aPackage)._eval_(aString);
  755. }
  756. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  757. }, function($ctx1) {$ctx1.fill(self,"eval:forPackage:",{aString:aString,aPackage:aPackage})});
  758. //>>excludeEnd("ctx");
  759. }; }),
  760. $globals.Compiler);
  761. $core.addMethod(
  762. $core.method({
  763. selector: "evaluateExpression:",
  764. protocol: "compiling",
  765. //>>excludeStart("ide", pragmas.excludeIdeData);
  766. args: ["aString"],
  767. source: "evaluateExpression: aString\x0a\x09\x22Unlike #eval: evaluate a Smalltalk expression and answer the returned object\x22\x0a\x09^ self evaluateExpression: aString on: DoIt new",
  768. referencedClasses: ["DoIt"],
  769. //>>excludeEnd("ide");
  770. pragmas: [],
  771. messageSends: ["evaluateExpression:on:", "new"]
  772. }, function ($methodClass){ return function (aString){
  773. var self=this,$self=this;
  774. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  775. return $core.withContext(function($ctx1) {
  776. //>>excludeEnd("ctx");
  777. return $self._evaluateExpression_on_(aString,$recv($globals.DoIt)._new());
  778. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  779. }, function($ctx1) {$ctx1.fill(self,"evaluateExpression:",{aString:aString})});
  780. //>>excludeEnd("ctx");
  781. }; }),
  782. $globals.Compiler);
  783. $core.addMethod(
  784. $core.method({
  785. selector: "evaluateExpression:on:",
  786. protocol: "compiling",
  787. //>>excludeStart("ide", pragmas.excludeIdeData);
  788. args: ["aString", "anObject"],
  789. source: "evaluateExpression: aString on: anObject\x0a\x09\x22Unlike #eval: evaluate a Smalltalk expression with anObject as the receiver and answer the returned object\x22\x0a\x09| result method |\x0a\x09method := self compileExpression: aString on: anObject.\x0a\x09anObject class addCompiledMethod: method.\x0a\x09result := anObject xxxDoIt.\x0a\x09anObject class removeCompiledMethod: method.\x0a\x09^ result",
  790. referencedClasses: [],
  791. //>>excludeEnd("ide");
  792. pragmas: [],
  793. messageSends: ["compileExpression:on:", "addCompiledMethod:", "class", "xxxDoIt", "removeCompiledMethod:"]
  794. }, function ($methodClass){ return function (aString,anObject){
  795. var self=this,$self=this;
  796. var result,method;
  797. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  798. return $core.withContext(function($ctx1) {
  799. //>>excludeEnd("ctx");
  800. var $1;
  801. method=$self._compileExpression_on_(aString,anObject);
  802. $1=$recv(anObject)._class();
  803. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  804. $ctx1.sendIdx["class"]=1;
  805. //>>excludeEnd("ctx");
  806. $recv($1)._addCompiledMethod_(method);
  807. result=$recv(anObject)._xxxDoIt();
  808. $recv($recv(anObject)._class())._removeCompiledMethod_(method);
  809. return result;
  810. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  811. }, function($ctx1) {$ctx1.fill(self,"evaluateExpression:on:",{aString:aString,anObject:anObject,result:result,method:method})});
  812. //>>excludeEnd("ctx");
  813. }; }),
  814. $globals.Compiler);
  815. $core.addMethod(
  816. $core.method({
  817. selector: "forClass:protocol:",
  818. protocol: "compiling",
  819. //>>excludeStart("ide", pragmas.excludeIdeData);
  820. args: ["aClass", "anotherString"],
  821. source: "forClass: aClass protocol: anotherString\x0a\x09self\x0a\x09\x09currentPackage: (aClass packageOfProtocol: anotherString);\x0a\x09\x09currentClass: aClass",
  822. referencedClasses: [],
  823. //>>excludeEnd("ide");
  824. pragmas: [],
  825. messageSends: ["currentPackage:", "packageOfProtocol:", "currentClass:"]
  826. }, function ($methodClass){ return function (aClass,anotherString){
  827. var self=this,$self=this;
  828. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  829. return $core.withContext(function($ctx1) {
  830. //>>excludeEnd("ctx");
  831. $self._currentPackage_($recv(aClass)._packageOfProtocol_(anotherString));
  832. $self._currentClass_(aClass);
  833. return self;
  834. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  835. }, function($ctx1) {$ctx1.fill(self,"forClass:protocol:",{aClass:aClass,anotherString:anotherString})});
  836. //>>excludeEnd("ctx");
  837. }; }),
  838. $globals.Compiler);
  839. $core.addMethod(
  840. $core.method({
  841. selector: "install:forClass:protocol:",
  842. protocol: "compiling",
  843. //>>excludeStart("ide", pragmas.excludeIdeData);
  844. args: ["aString", "aBehavior", "anotherString"],
  845. source: "install: aString forClass: aBehavior protocol: anotherString\x0a\x09| compiledMethod |\x0a\x09compiledMethod := self compile: aString forClass: aBehavior protocol: anotherString.\x0a\x09aBehavior addCompiledMethod: compiledMethod.\x0a\x09^ compiledMethod",
  846. referencedClasses: [],
  847. //>>excludeEnd("ide");
  848. pragmas: [],
  849. messageSends: ["compile:forClass:protocol:", "addCompiledMethod:"]
  850. }, function ($methodClass){ return function (aString,aBehavior,anotherString){
  851. var self=this,$self=this;
  852. var compiledMethod;
  853. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  854. return $core.withContext(function($ctx1) {
  855. //>>excludeEnd("ctx");
  856. compiledMethod=$self._compile_forClass_protocol_(aString,aBehavior,anotherString);
  857. $recv(aBehavior)._addCompiledMethod_(compiledMethod);
  858. return compiledMethod;
  859. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  860. }, function($ctx1) {$ctx1.fill(self,"install:forClass:protocol:",{aString:aString,aBehavior:aBehavior,anotherString:anotherString,compiledMethod:compiledMethod})});
  861. //>>excludeEnd("ctx");
  862. }; }),
  863. $globals.Compiler);
  864. $core.addMethod(
  865. $core.method({
  866. selector: "parse:",
  867. protocol: "compiling",
  868. //>>excludeStart("ide", pragmas.excludeIdeData);
  869. args: ["aString"],
  870. source: "parse: aString\x0a\x09^ Smalltalk parse: aString",
  871. referencedClasses: ["Smalltalk"],
  872. //>>excludeEnd("ide");
  873. pragmas: [],
  874. messageSends: ["parse:"]
  875. }, function ($methodClass){ return function (aString){
  876. var self=this,$self=this;
  877. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  878. return $core.withContext(function($ctx1) {
  879. //>>excludeEnd("ctx");
  880. return $recv($globals.Smalltalk)._parse_(aString);
  881. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  882. }, function($ctx1) {$ctx1.fill(self,"parse:",{aString:aString})});
  883. //>>excludeEnd("ctx");
  884. }; }),
  885. $globals.Compiler);
  886. $core.addMethod(
  887. $core.method({
  888. selector: "parseExpression:",
  889. protocol: "compiling",
  890. //>>excludeStart("ide", pragmas.excludeIdeData);
  891. args: ["aString"],
  892. source: "parseExpression: aString\x0a\x09^ self parse: 'doIt ^ [ ', aString, ' ] value'",
  893. referencedClasses: [],
  894. //>>excludeEnd("ide");
  895. pragmas: [],
  896. messageSends: ["parse:", ","]
  897. }, function ($methodClass){ return function (aString){
  898. var self=this,$self=this;
  899. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  900. return $core.withContext(function($ctx1) {
  901. //>>excludeEnd("ctx");
  902. var $1;
  903. $1=$recv("doIt ^ [ ".__comma(aString)).__comma(" ] value");
  904. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  905. $ctx1.sendIdx[","]=1;
  906. //>>excludeEnd("ctx");
  907. return $self._parse_($1);
  908. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  909. }, function($ctx1) {$ctx1.fill(self,"parseExpression:",{aString:aString})});
  910. //>>excludeEnd("ctx");
  911. }; }),
  912. $globals.Compiler);
  913. $core.addMethod(
  914. $core.method({
  915. selector: "recompile:",
  916. protocol: "compiling",
  917. //>>excludeStart("ide", pragmas.excludeIdeData);
  918. args: ["aClass"],
  919. source: "recompile: aClass\x0a\x09aClass includingPossibleMetaDo: [ :eachSide |\x0a\x09\x09eachSide methodDictionary values\x0a\x09\x09\x09do: [ :each | each origin = eachSide ifTrue: [ \x0a\x09\x09\x09\x09self \x0a\x09\x09\x09\x09\x09install: each source \x0a\x09\x09\x09\x09\x09forClass: eachSide \x0a\x09\x09\x09\x09\x09protocol: each protocol ] ]\x0a\x09\x09\x09displayingProgress: 'Recompiling ', eachSide name ]",
  920. referencedClasses: [],
  921. //>>excludeEnd("ide");
  922. pragmas: [],
  923. messageSends: ["includingPossibleMetaDo:", "do:displayingProgress:", "values", "methodDictionary", "ifTrue:", "=", "origin", "install:forClass:protocol:", "source", "protocol", ",", "name"]
  924. }, function ($methodClass){ return function (aClass){
  925. var self=this,$self=this;
  926. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  927. return $core.withContext(function($ctx1) {
  928. //>>excludeEnd("ctx");
  929. var $1;
  930. $recv(aClass)._includingPossibleMetaDo_((function(eachSide){
  931. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  932. return $core.withContext(function($ctx2) {
  933. //>>excludeEnd("ctx");
  934. return $recv($recv($recv(eachSide)._methodDictionary())._values())._do_displayingProgress_((function(each){
  935. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  936. return $core.withContext(function($ctx3) {
  937. //>>excludeEnd("ctx");
  938. $1=$recv($recv(each)._origin()).__eq(eachSide);
  939. if($core.assert($1)){
  940. return $self._install_forClass_protocol_($recv(each)._source(),eachSide,$recv(each)._protocol());
  941. }
  942. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  943. }, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,2)});
  944. //>>excludeEnd("ctx");
  945. }),"Recompiling ".__comma($recv(eachSide)._name()));
  946. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  947. }, function($ctx2) {$ctx2.fillBlock({eachSide:eachSide},$ctx1,1)});
  948. //>>excludeEnd("ctx");
  949. }));
  950. return self;
  951. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  952. }, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass})});
  953. //>>excludeEnd("ctx");
  954. }; }),
  955. $globals.Compiler);
  956. $core.addMethod(
  957. $core.method({
  958. selector: "recompileAll",
  959. protocol: "compiling",
  960. //>>excludeStart("ide", pragmas.excludeIdeData);
  961. args: [],
  962. source: "recompileAll\x0a\x09Smalltalk classes \x0a\x09\x09do: [ :each | self recompile: each ]\x0a\x09\x09displayingProgress: 'Compiling all classes...'",
  963. referencedClasses: ["Smalltalk"],
  964. //>>excludeEnd("ide");
  965. pragmas: [],
  966. messageSends: ["do:displayingProgress:", "classes", "recompile:"]
  967. }, function ($methodClass){ return function (){
  968. var self=this,$self=this;
  969. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  970. return $core.withContext(function($ctx1) {
  971. //>>excludeEnd("ctx");
  972. $recv($recv($globals.Smalltalk)._classes())._do_displayingProgress_((function(each){
  973. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  974. return $core.withContext(function($ctx2) {
  975. //>>excludeEnd("ctx");
  976. return $self._recompile_(each);
  977. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  978. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  979. //>>excludeEnd("ctx");
  980. }),"Compiling all classes...");
  981. return self;
  982. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  983. }, function($ctx1) {$ctx1.fill(self,"recompileAll",{})});
  984. //>>excludeEnd("ctx");
  985. }; }),
  986. $globals.Compiler);
  987. $core.addMethod(
  988. $core.method({
  989. selector: "source",
  990. protocol: "accessing",
  991. //>>excludeStart("ide", pragmas.excludeIdeData);
  992. args: [],
  993. source: "source\x0a\x09^ source ifNil: [ '' ]",
  994. referencedClasses: [],
  995. //>>excludeEnd("ide");
  996. pragmas: [],
  997. messageSends: ["ifNil:"]
  998. }, function ($methodClass){ return function (){
  999. var self=this,$self=this;
  1000. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1001. return $core.withContext(function($ctx1) {
  1002. //>>excludeEnd("ctx");
  1003. var $1,$receiver;
  1004. $1=$self.source;
  1005. if(($receiver = $1) == null || $receiver.a$nil){
  1006. return "";
  1007. } else {
  1008. return $1;
  1009. }
  1010. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1011. }, function($ctx1) {$ctx1.fill(self,"source",{})});
  1012. //>>excludeEnd("ctx");
  1013. }; }),
  1014. $globals.Compiler);
  1015. $core.addMethod(
  1016. $core.method({
  1017. selector: "source:",
  1018. protocol: "accessing",
  1019. //>>excludeStart("ide", pragmas.excludeIdeData);
  1020. args: ["aString"],
  1021. source: "source: aString\x0a\x09source := aString",
  1022. referencedClasses: [],
  1023. //>>excludeEnd("ide");
  1024. pragmas: [],
  1025. messageSends: []
  1026. }, function ($methodClass){ return function (aString){
  1027. var self=this,$self=this;
  1028. $self.source=aString;
  1029. return self;
  1030. }; }),
  1031. $globals.Compiler);
  1032. $core.addMethod(
  1033. $core.method({
  1034. selector: "eval:",
  1035. protocol: "evaluating",
  1036. //>>excludeStart("ide", pragmas.excludeIdeData);
  1037. args: ["aString"],
  1038. source: "eval: aString\x0a\x09^ self new eval: aString",
  1039. referencedClasses: [],
  1040. //>>excludeEnd("ide");
  1041. pragmas: [],
  1042. messageSends: ["eval:", "new"]
  1043. }, function ($methodClass){ return function (aString){
  1044. var self=this,$self=this;
  1045. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1046. return $core.withContext(function($ctx1) {
  1047. //>>excludeEnd("ctx");
  1048. return $recv($self._new())._eval_(aString);
  1049. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1050. }, function($ctx1) {$ctx1.fill(self,"eval:",{aString:aString})});
  1051. //>>excludeEnd("ctx");
  1052. }; }),
  1053. $globals.Compiler.a$cls);
  1054. $core.addMethod(
  1055. $core.method({
  1056. selector: "recompile:",
  1057. protocol: "compiling",
  1058. //>>excludeStart("ide", pragmas.excludeIdeData);
  1059. args: ["aClass"],
  1060. source: "recompile: aClass\x0a\x09self new recompile: aClass",
  1061. referencedClasses: [],
  1062. //>>excludeEnd("ide");
  1063. pragmas: [],
  1064. messageSends: ["recompile:", "new"]
  1065. }, function ($methodClass){ return function (aClass){
  1066. var self=this,$self=this;
  1067. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1068. return $core.withContext(function($ctx1) {
  1069. //>>excludeEnd("ctx");
  1070. $recv($self._new())._recompile_(aClass);
  1071. return self;
  1072. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1073. }, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass})});
  1074. //>>excludeEnd("ctx");
  1075. }; }),
  1076. $globals.Compiler.a$cls);
  1077. $core.addMethod(
  1078. $core.method({
  1079. selector: "recompileAll",
  1080. protocol: "compiling",
  1081. //>>excludeStart("ide", pragmas.excludeIdeData);
  1082. args: [],
  1083. source: "recompileAll\x0a\x09Smalltalk classes do: [ :each |\x0a\x09\x09self recompile: each ]",
  1084. referencedClasses: ["Smalltalk"],
  1085. //>>excludeEnd("ide");
  1086. pragmas: [],
  1087. messageSends: ["do:", "classes", "recompile:"]
  1088. }, function ($methodClass){ return function (){
  1089. var self=this,$self=this;
  1090. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1091. return $core.withContext(function($ctx1) {
  1092. //>>excludeEnd("ctx");
  1093. $recv($recv($globals.Smalltalk)._classes())._do_((function(each){
  1094. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1095. return $core.withContext(function($ctx2) {
  1096. //>>excludeEnd("ctx");
  1097. return $self._recompile_(each);
  1098. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1099. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  1100. //>>excludeEnd("ctx");
  1101. }));
  1102. return self;
  1103. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1104. }, function($ctx1) {$ctx1.fill(self,"recompileAll",{})});
  1105. //>>excludeEnd("ctx");
  1106. }; }),
  1107. $globals.Compiler.a$cls);
  1108. $core.addClass("DoIt", $globals.Object, [], "Compiler-Core");
  1109. //>>excludeStart("ide", pragmas.excludeIdeData);
  1110. $globals.DoIt.comment="`DoIt` is the class used to compile and evaluate expressions. See `Compiler >> evaluateExpression:`.";
  1111. //>>excludeEnd("ide");
  1112. $core.addClass("Evaluator", $globals.Object, [], "Compiler-Core");
  1113. //>>excludeStart("ide", pragmas.excludeIdeData);
  1114. $globals.Evaluator.comment="I evaluate code against a receiver, dispatching #evaluate:on: to the receiver.";
  1115. //>>excludeEnd("ide");
  1116. $core.addMethod(
  1117. $core.method({
  1118. selector: "evaluate:context:",
  1119. protocol: "evaluating",
  1120. //>>excludeStart("ide", pragmas.excludeIdeData);
  1121. args: ["aString", "aContext"],
  1122. source: "evaluate: aString context: aContext\x0a\x09\x22Similar to #evaluate:for:, with the following differences:\x0a\x09- instead of compiling and running `aString`, `aString` is interpreted using an `ASTInterpreter`\x0a\x09- instead of evaluating against a receiver, evaluate in the context of `aContext`\x22\x0a\x0a\x09| compiler ast |\x0a\x09\x0a\x09compiler := Compiler new.\x0a\x09[ ast := compiler parseExpression: aString ] \x0a\x09\x09on: Error \x0a\x09\x09do: [ :ex | ^ Terminal alert: ex messageText ].\x0a\x09\x09\x0a\x09(AISemanticAnalyzer on: aContext receiver class)\x0a\x09\x09context: aContext;\x0a\x09\x09visit: ast.\x0a\x0a\x09^ aContext evaluateNode: ast",
  1123. referencedClasses: ["Compiler", "Error", "Terminal", "AISemanticAnalyzer"],
  1124. //>>excludeEnd("ide");
  1125. pragmas: [],
  1126. messageSends: ["new", "on:do:", "parseExpression:", "alert:", "messageText", "context:", "on:", "class", "receiver", "visit:", "evaluateNode:"]
  1127. }, function ($methodClass){ return function (aString,aContext){
  1128. var self=this,$self=this;
  1129. var compiler,ast;
  1130. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1131. return $core.withContext(function($ctx1) {
  1132. //>>excludeEnd("ctx");
  1133. var $1;
  1134. var $early={};
  1135. try {
  1136. compiler=$recv($globals.Compiler)._new();
  1137. $recv((function(){
  1138. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1139. return $core.withContext(function($ctx2) {
  1140. //>>excludeEnd("ctx");
  1141. ast=$recv(compiler)._parseExpression_(aString);
  1142. return ast;
  1143. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1144. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  1145. //>>excludeEnd("ctx");
  1146. }))._on_do_($globals.Error,(function(ex){
  1147. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1148. return $core.withContext(function($ctx2) {
  1149. //>>excludeEnd("ctx");
  1150. throw $early=[$recv($globals.Terminal)._alert_($recv(ex)._messageText())];
  1151. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1152. }, function($ctx2) {$ctx2.fillBlock({ex:ex},$ctx1,2)});
  1153. //>>excludeEnd("ctx");
  1154. }));
  1155. $1=$recv($globals.AISemanticAnalyzer)._on_($recv($recv(aContext)._receiver())._class());
  1156. $recv($1)._context_(aContext);
  1157. $recv($1)._visit_(ast);
  1158. return $recv(aContext)._evaluateNode_(ast);
  1159. }
  1160. catch(e) {if(e===$early)return e[0]; throw e}
  1161. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1162. }, function($ctx1) {$ctx1.fill(self,"evaluate:context:",{aString:aString,aContext:aContext,compiler:compiler,ast:ast})});
  1163. //>>excludeEnd("ctx");
  1164. }; }),
  1165. $globals.Evaluator);
  1166. $core.addMethod(
  1167. $core.method({
  1168. selector: "evaluate:for:",
  1169. protocol: "evaluating",
  1170. //>>excludeStart("ide", pragmas.excludeIdeData);
  1171. args: ["aString", "anObject"],
  1172. source: "evaluate: aString for: anObject\x0a\x09^ anObject evaluate: aString on: self",
  1173. referencedClasses: [],
  1174. //>>excludeEnd("ide");
  1175. pragmas: [],
  1176. messageSends: ["evaluate:on:"]
  1177. }, function ($methodClass){ return function (aString,anObject){
  1178. var self=this,$self=this;
  1179. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1180. return $core.withContext(function($ctx1) {
  1181. //>>excludeEnd("ctx");
  1182. return $recv(anObject)._evaluate_on_(aString,self);
  1183. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1184. }, function($ctx1) {$ctx1.fill(self,"evaluate:for:",{aString:aString,anObject:anObject})});
  1185. //>>excludeEnd("ctx");
  1186. }; }),
  1187. $globals.Evaluator);
  1188. $core.addMethod(
  1189. $core.method({
  1190. selector: "evaluate:receiver:",
  1191. protocol: "evaluating",
  1192. //>>excludeStart("ide", pragmas.excludeIdeData);
  1193. args: ["aString", "anObject"],
  1194. source: "evaluate: aString receiver: anObject\x0a\x09| compiler |\x0a\x09\x0a\x09compiler := Compiler new.\x0a\x09[ compiler parseExpression: aString ] \x0a\x09\x09on: Error \x0a\x09\x09do: [ :ex | ^ Terminal alert: ex messageText ].\x0a\x0a\x09^ compiler evaluateExpression: aString on: anObject",
  1195. referencedClasses: ["Compiler", "Error", "Terminal"],
  1196. //>>excludeEnd("ide");
  1197. pragmas: [],
  1198. messageSends: ["new", "on:do:", "parseExpression:", "alert:", "messageText", "evaluateExpression:on:"]
  1199. }, function ($methodClass){ return function (aString,anObject){
  1200. var self=this,$self=this;
  1201. var compiler;
  1202. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1203. return $core.withContext(function($ctx1) {
  1204. //>>excludeEnd("ctx");
  1205. var $early={};
  1206. try {
  1207. compiler=$recv($globals.Compiler)._new();
  1208. $recv((function(){
  1209. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1210. return $core.withContext(function($ctx2) {
  1211. //>>excludeEnd("ctx");
  1212. return $recv(compiler)._parseExpression_(aString);
  1213. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1214. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  1215. //>>excludeEnd("ctx");
  1216. }))._on_do_($globals.Error,(function(ex){
  1217. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1218. return $core.withContext(function($ctx2) {
  1219. //>>excludeEnd("ctx");
  1220. throw $early=[$recv($globals.Terminal)._alert_($recv(ex)._messageText())];
  1221. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1222. }, function($ctx2) {$ctx2.fillBlock({ex:ex},$ctx1,2)});
  1223. //>>excludeEnd("ctx");
  1224. }));
  1225. return $recv(compiler)._evaluateExpression_on_(aString,anObject);
  1226. }
  1227. catch(e) {if(e===$early)return e[0]; throw e}
  1228. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1229. }, function($ctx1) {$ctx1.fill(self,"evaluate:receiver:",{aString:aString,anObject:anObject,compiler:compiler})});
  1230. //>>excludeEnd("ctx");
  1231. }; }),
  1232. $globals.Evaluator);
  1233. $core.addMethod(
  1234. $core.method({
  1235. selector: "evaluate:for:",
  1236. protocol: "instance creation",
  1237. //>>excludeStart("ide", pragmas.excludeIdeData);
  1238. args: ["aString", "anObject"],
  1239. source: "evaluate: aString for: anObject\x0a\x09^ self new evaluate: aString for: anObject",
  1240. referencedClasses: [],
  1241. //>>excludeEnd("ide");
  1242. pragmas: [],
  1243. messageSends: ["evaluate:for:", "new"]
  1244. }, function ($methodClass){ return function (aString,anObject){
  1245. var self=this,$self=this;
  1246. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1247. return $core.withContext(function($ctx1) {
  1248. //>>excludeEnd("ctx");
  1249. return $recv($self._new())._evaluate_for_(aString,anObject);
  1250. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1251. }, function($ctx1) {$ctx1.fill(self,"evaluate:for:",{aString:aString,anObject:anObject})});
  1252. //>>excludeEnd("ctx");
  1253. }; }),
  1254. $globals.Evaluator.a$cls);
  1255. $core.addMethod(
  1256. $core.method({
  1257. selector: "asVariableName",
  1258. protocol: "*Compiler-Core",
  1259. //>>excludeStart("ide", pragmas.excludeIdeData);
  1260. args: [],
  1261. source: "asVariableName\x0a\x09^ (Smalltalk reservedWords includes: self)\x0a\x09\x09ifTrue: [ self, '_' ]\x0a\x09\x09ifFalse: [ self ]",
  1262. referencedClasses: ["Smalltalk"],
  1263. //>>excludeEnd("ide");
  1264. pragmas: [],
  1265. messageSends: ["ifTrue:ifFalse:", "includes:", "reservedWords", ","]
  1266. }, function ($methodClass){ return function (){
  1267. var self=this,$self=this;
  1268. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1269. return $core.withContext(function($ctx1) {
  1270. //>>excludeEnd("ctx");
  1271. var $1;
  1272. $1=$recv($recv($globals.Smalltalk)._reservedWords())._includes_(self);
  1273. if($core.assert($1)){
  1274. return $self.__comma("_");
  1275. } else {
  1276. return self;
  1277. }
  1278. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1279. }, function($ctx1) {$ctx1.fill(self,"asVariableName",{})});
  1280. //>>excludeEnd("ctx");
  1281. }; }),
  1282. $globals.String);
  1283. });