Compiler-Core.js 42 KB

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