Compiler-Core.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. define("amber_core/Compiler-Core", ["amber_vm/smalltalk", "amber_vm/nil", "amber_vm/_st", "amber_core/Kernel-Objects"], function(smalltalk,nil,_st){
  2. smalltalk.addPackage('Compiler-Core');
  3. smalltalk.packages["Compiler-Core"].transport = {"type":"amd","amdNamespace":"amber_core"};
  4. smalltalk.addClass('AbstractCodeGenerator', smalltalk.Object, ['currentClass', 'source'], 'Compiler-Core');
  5. smalltalk.AbstractCodeGenerator.comment="I am the abstract super class of all code generators and provide their common API.";
  6. smalltalk.addMethod(
  7. smalltalk.method({
  8. selector: "classNameFor:",
  9. category: 'accessing',
  10. fn: function (aClass){
  11. var self=this;
  12. return smalltalk.withContext(function($ctx1) {
  13. var $2,$1;
  14. if(smalltalk.assert(_st(aClass)._isMetaclass())){
  15. $2=_st(_st(aClass)._instanceClass())._name();
  16. $ctx1.sendIdx["name"]=1;
  17. $1=_st($2).__comma(".klass");
  18. } else {
  19. if(smalltalk.assert(_st(aClass)._isNil())){
  20. $1="nil";
  21. } else {
  22. $1=_st(aClass)._name();
  23. };
  24. };
  25. return $1;
  26. }, function($ctx1) {$ctx1.fill(self,"classNameFor:",{aClass:aClass},smalltalk.AbstractCodeGenerator)})},
  27. args: ["aClass"],
  28. source: "classNameFor: aClass\x0a\x09^aClass isMetaclass\x0a\x09\x09ifTrue: [aClass instanceClass name, '.klass']\x0a\x09\x09ifFalse: [\x0a\x09\x09aClass isNil\x0a\x09\x09\x09ifTrue: ['nil']\x0a\x09\x09\x09ifFalse: [aClass name]]",
  29. messageSends: ["ifTrue:ifFalse:", "isMetaclass", ",", "name", "instanceClass", "isNil"],
  30. referencedClasses: []
  31. }),
  32. smalltalk.AbstractCodeGenerator);
  33. smalltalk.addMethod(
  34. smalltalk.method({
  35. selector: "compileNode:",
  36. category: 'compiling',
  37. fn: function (aNode){
  38. var self=this;
  39. return smalltalk.withContext(function($ctx1) {
  40. self._subclassResponsibility();
  41. return self}, function($ctx1) {$ctx1.fill(self,"compileNode:",{aNode:aNode},smalltalk.AbstractCodeGenerator)})},
  42. args: ["aNode"],
  43. source: "compileNode: aNode\x0a\x09self subclassResponsibility",
  44. messageSends: ["subclassResponsibility"],
  45. referencedClasses: []
  46. }),
  47. smalltalk.AbstractCodeGenerator);
  48. smalltalk.addMethod(
  49. smalltalk.method({
  50. selector: "currentClass",
  51. category: 'accessing',
  52. fn: function (){
  53. var self=this;
  54. return smalltalk.withContext(function($ctx1) {
  55. var $1;
  56. $1=self["@currentClass"];
  57. return $1;
  58. }, function($ctx1) {$ctx1.fill(self,"currentClass",{},smalltalk.AbstractCodeGenerator)})},
  59. args: [],
  60. source: "currentClass\x0a\x09^currentClass",
  61. messageSends: [],
  62. referencedClasses: []
  63. }),
  64. smalltalk.AbstractCodeGenerator);
  65. smalltalk.addMethod(
  66. smalltalk.method({
  67. selector: "currentClass:",
  68. category: 'accessing',
  69. fn: function (aClass){
  70. var self=this;
  71. return smalltalk.withContext(function($ctx1) {
  72. self["@currentClass"]=aClass;
  73. return self}, function($ctx1) {$ctx1.fill(self,"currentClass:",{aClass:aClass},smalltalk.AbstractCodeGenerator)})},
  74. args: ["aClass"],
  75. source: "currentClass: aClass\x0a\x09currentClass := aClass",
  76. messageSends: [],
  77. referencedClasses: []
  78. }),
  79. smalltalk.AbstractCodeGenerator);
  80. smalltalk.addMethod(
  81. smalltalk.method({
  82. selector: "pseudoVariables",
  83. category: 'accessing',
  84. fn: function (){
  85. var self=this;
  86. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  87. return smalltalk.withContext(function($ctx1) {
  88. var $1;
  89. $1=_st(_st($Smalltalk())._current())._pseudoVariableNames();
  90. return $1;
  91. }, function($ctx1) {$ctx1.fill(self,"pseudoVariables",{},smalltalk.AbstractCodeGenerator)})},
  92. args: [],
  93. source: "pseudoVariables\x0a\x09^ Smalltalk current pseudoVariableNames",
  94. messageSends: ["pseudoVariableNames", "current"],
  95. referencedClasses: ["Smalltalk"]
  96. }),
  97. smalltalk.AbstractCodeGenerator);
  98. smalltalk.addMethod(
  99. smalltalk.method({
  100. selector: "safeVariableNameFor:",
  101. category: 'accessing',
  102. fn: function (aString){
  103. var self=this;
  104. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  105. return smalltalk.withContext(function($ctx1) {
  106. var $1;
  107. if(smalltalk.assert(_st(_st(_st($Smalltalk())._current())._reservedWords())._includes_(aString))){
  108. $1=_st(aString).__comma("_");
  109. } else {
  110. $1=aString;
  111. };
  112. return $1;
  113. }, function($ctx1) {$ctx1.fill(self,"safeVariableNameFor:",{aString:aString},smalltalk.AbstractCodeGenerator)})},
  114. args: ["aString"],
  115. source: "safeVariableNameFor: aString\x0a\x09^(Smalltalk current reservedWords includes: aString)\x0a\x09\x09ifTrue: [aString, '_']\x0a\x09\x09ifFalse: [aString]",
  116. messageSends: ["ifTrue:ifFalse:", "includes:", "reservedWords", "current", ","],
  117. referencedClasses: ["Smalltalk"]
  118. }),
  119. smalltalk.AbstractCodeGenerator);
  120. smalltalk.addMethod(
  121. smalltalk.method({
  122. selector: "source",
  123. category: 'accessing',
  124. fn: function (){
  125. var self=this;
  126. return smalltalk.withContext(function($ctx1) {
  127. var $1;
  128. if(($receiver = self["@source"]) == nil || $receiver == null){
  129. $1="";
  130. } else {
  131. $1=self["@source"];
  132. };
  133. return $1;
  134. }, function($ctx1) {$ctx1.fill(self,"source",{},smalltalk.AbstractCodeGenerator)})},
  135. args: [],
  136. source: "source\x0a\x09^source ifNil: ['']",
  137. messageSends: ["ifNil:"],
  138. referencedClasses: []
  139. }),
  140. smalltalk.AbstractCodeGenerator);
  141. smalltalk.addMethod(
  142. smalltalk.method({
  143. selector: "source:",
  144. category: 'accessing',
  145. fn: function (aString){
  146. var self=this;
  147. return smalltalk.withContext(function($ctx1) {
  148. self["@source"]=aString;
  149. return self}, function($ctx1) {$ctx1.fill(self,"source:",{aString:aString},smalltalk.AbstractCodeGenerator)})},
  150. args: ["aString"],
  151. source: "source: aString\x0a\x09source := aString",
  152. messageSends: [],
  153. referencedClasses: []
  154. }),
  155. smalltalk.AbstractCodeGenerator);
  156. smalltalk.addClass('CodeGenerator', smalltalk.AbstractCodeGenerator, [], 'Compiler-Core');
  157. smalltalk.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.";
  158. smalltalk.addMethod(
  159. smalltalk.method({
  160. selector: "compileNode:",
  161. category: 'compiling',
  162. fn: function (aNode){
  163. var self=this;
  164. var ir,stream;
  165. return smalltalk.withContext(function($ctx1) {
  166. var $2,$3,$1;
  167. _st(self._semanticAnalyzer())._visit_(aNode);
  168. $ctx1.sendIdx["visit:"]=1;
  169. ir=_st(self._translator())._visit_(aNode);
  170. $ctx1.sendIdx["visit:"]=2;
  171. $2=self._irTranslator();
  172. _st($2)._currentClass_(self._currentClass());
  173. _st($2)._visit_(ir);
  174. $3=_st($2)._contents();
  175. $1=$3;
  176. return $1;
  177. }, function($ctx1) {$ctx1.fill(self,"compileNode:",{aNode:aNode,ir:ir,stream:stream},smalltalk.CodeGenerator)})},
  178. args: ["aNode"],
  179. source: "compileNode: aNode\x0a\x09| ir stream |\x0a\x09self semanticAnalyzer visit: aNode.\x0a\x09ir := self translator visit: aNode.\x0a\x09^ self irTranslator\x0a\x09\x09currentClass: self currentClass;\x0a\x09\x09visit: ir;\x0a\x09\x09contents",
  180. messageSends: ["visit:", "semanticAnalyzer", "translator", "currentClass:", "irTranslator", "currentClass", "contents"],
  181. referencedClasses: []
  182. }),
  183. smalltalk.CodeGenerator);
  184. smalltalk.addMethod(
  185. smalltalk.method({
  186. selector: "irTranslator",
  187. category: 'compiling',
  188. fn: function (){
  189. var self=this;
  190. function $IRJSTranslator(){return smalltalk.IRJSTranslator||(typeof IRJSTranslator=="undefined"?nil:IRJSTranslator)}
  191. return smalltalk.withContext(function($ctx1) {
  192. var $1;
  193. $1=_st($IRJSTranslator())._new();
  194. return $1;
  195. }, function($ctx1) {$ctx1.fill(self,"irTranslator",{},smalltalk.CodeGenerator)})},
  196. args: [],
  197. source: "irTranslator\x0a\x09^ IRJSTranslator new",
  198. messageSends: ["new"],
  199. referencedClasses: ["IRJSTranslator"]
  200. }),
  201. smalltalk.CodeGenerator);
  202. smalltalk.addMethod(
  203. smalltalk.method({
  204. selector: "semanticAnalyzer",
  205. category: 'compiling',
  206. fn: function (){
  207. var self=this;
  208. function $SemanticAnalyzer(){return smalltalk.SemanticAnalyzer||(typeof SemanticAnalyzer=="undefined"?nil:SemanticAnalyzer)}
  209. return smalltalk.withContext(function($ctx1) {
  210. var $1;
  211. $1=_st($SemanticAnalyzer())._on_(self._currentClass());
  212. return $1;
  213. }, function($ctx1) {$ctx1.fill(self,"semanticAnalyzer",{},smalltalk.CodeGenerator)})},
  214. args: [],
  215. source: "semanticAnalyzer\x0a\x09^ SemanticAnalyzer on: self currentClass",
  216. messageSends: ["on:", "currentClass"],
  217. referencedClasses: ["SemanticAnalyzer"]
  218. }),
  219. smalltalk.CodeGenerator);
  220. smalltalk.addMethod(
  221. smalltalk.method({
  222. selector: "translator",
  223. category: 'compiling',
  224. fn: function (){
  225. var self=this;
  226. function $IRASTTranslator(){return smalltalk.IRASTTranslator||(typeof IRASTTranslator=="undefined"?nil:IRASTTranslator)}
  227. return smalltalk.withContext(function($ctx1) {
  228. var $2,$3,$1;
  229. $2=_st($IRASTTranslator())._new();
  230. _st($2)._source_(self._source());
  231. _st($2)._theClass_(self._currentClass());
  232. $3=_st($2)._yourself();
  233. $1=$3;
  234. return $1;
  235. }, function($ctx1) {$ctx1.fill(self,"translator",{},smalltalk.CodeGenerator)})},
  236. args: [],
  237. source: "translator\x0a\x09^ IRASTTranslator new\x0a\x09\x09source: self source;\x0a\x09\x09theClass: self currentClass;\x0a\x09\x09yourself",
  238. messageSends: ["source:", "new", "source", "theClass:", "currentClass", "yourself"],
  239. referencedClasses: ["IRASTTranslator"]
  240. }),
  241. smalltalk.CodeGenerator);
  242. smalltalk.addClass('Compiler', smalltalk.Object, ['currentClass', 'source', 'unknownVariables', 'codeGeneratorClass'], 'Compiler-Core');
  243. smalltalk.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`";
  244. smalltalk.addMethod(
  245. smalltalk.method({
  246. selector: "codeGeneratorClass",
  247. category: 'accessing',
  248. fn: function (){
  249. var self=this;
  250. function $InliningCodeGenerator(){return smalltalk.InliningCodeGenerator||(typeof InliningCodeGenerator=="undefined"?nil:InliningCodeGenerator)}
  251. return smalltalk.withContext(function($ctx1) {
  252. var $1;
  253. if(($receiver = self["@codeGeneratorClass"]) == nil || $receiver == null){
  254. $1=$InliningCodeGenerator();
  255. } else {
  256. $1=self["@codeGeneratorClass"];
  257. };
  258. return $1;
  259. }, function($ctx1) {$ctx1.fill(self,"codeGeneratorClass",{},smalltalk.Compiler)})},
  260. args: [],
  261. source: "codeGeneratorClass\x0a\x09^codeGeneratorClass ifNil: [InliningCodeGenerator]",
  262. messageSends: ["ifNil:"],
  263. referencedClasses: ["InliningCodeGenerator"]
  264. }),
  265. smalltalk.Compiler);
  266. smalltalk.addMethod(
  267. smalltalk.method({
  268. selector: "codeGeneratorClass:",
  269. category: 'accessing',
  270. fn: function (aClass){
  271. var self=this;
  272. return smalltalk.withContext(function($ctx1) {
  273. self["@codeGeneratorClass"]=aClass;
  274. return self}, function($ctx1) {$ctx1.fill(self,"codeGeneratorClass:",{aClass:aClass},smalltalk.Compiler)})},
  275. args: ["aClass"],
  276. source: "codeGeneratorClass: aClass\x0a\x09codeGeneratorClass := aClass",
  277. messageSends: [],
  278. referencedClasses: []
  279. }),
  280. smalltalk.Compiler);
  281. smalltalk.addMethod(
  282. smalltalk.method({
  283. selector: "compile:",
  284. category: 'compiling',
  285. fn: function (aString){
  286. var self=this;
  287. return smalltalk.withContext(function($ctx1) {
  288. var $1;
  289. $1=self._compileNode_(self._parse_(aString));
  290. return $1;
  291. }, function($ctx1) {$ctx1.fill(self,"compile:",{aString:aString},smalltalk.Compiler)})},
  292. args: ["aString"],
  293. source: "compile: aString\x0a\x09^self compileNode: (self parse: aString)",
  294. messageSends: ["compileNode:", "parse:"],
  295. referencedClasses: []
  296. }),
  297. smalltalk.Compiler);
  298. smalltalk.addMethod(
  299. smalltalk.method({
  300. selector: "compile:forClass:",
  301. category: 'compiling',
  302. fn: function (aString,aClass){
  303. var self=this;
  304. return smalltalk.withContext(function($ctx1) {
  305. var $1;
  306. self._currentClass_(aClass);
  307. self._source_(aString);
  308. $1=self._compile_(aString);
  309. return $1;
  310. }, function($ctx1) {$ctx1.fill(self,"compile:forClass:",{aString:aString,aClass:aClass},smalltalk.Compiler)})},
  311. args: ["aString", "aClass"],
  312. source: "compile: aString forClass: aClass\x0a\x09self currentClass: aClass.\x0a\x09self source: aString.\x0a\x09^self compile: aString",
  313. messageSends: ["currentClass:", "source:", "compile:"],
  314. referencedClasses: []
  315. }),
  316. smalltalk.Compiler);
  317. smalltalk.addMethod(
  318. smalltalk.method({
  319. selector: "compileExpression:",
  320. category: 'compiling',
  321. fn: function (aString){
  322. var self=this;
  323. function $DoIt(){return smalltalk.DoIt||(typeof DoIt=="undefined"?nil:DoIt)}
  324. return smalltalk.withContext(function($ctx1) {
  325. var $2,$1,$3;
  326. self._currentClass_($DoIt());
  327. $2="doIt ^[".__comma(aString);
  328. $1=_st($2).__comma("] value");
  329. $ctx1.sendIdx[","]=1;
  330. self._source_($1);
  331. $3=self._compileNode_(self._parse_(self._source()));
  332. return $3;
  333. }, function($ctx1) {$ctx1.fill(self,"compileExpression:",{aString:aString},smalltalk.Compiler)})},
  334. args: ["aString"],
  335. source: "compileExpression: aString\x0a\x09self currentClass: DoIt.\x0a\x09self source: 'doIt ^[', aString, '] value'.\x0a\x09^self compileNode: (self parse: self source)",
  336. messageSends: ["currentClass:", "source:", ",", "compileNode:", "parse:", "source"],
  337. referencedClasses: ["DoIt"]
  338. }),
  339. smalltalk.Compiler);
  340. smalltalk.addMethod(
  341. smalltalk.method({
  342. selector: "compileExpression:on:",
  343. category: 'compiling',
  344. fn: function (aString,anObject){
  345. var self=this;
  346. return smalltalk.withContext(function($ctx1) {
  347. var $2,$1,$3;
  348. self._currentClass_(_st(anObject)._class());
  349. $2="xxxDoIt ^[".__comma(aString);
  350. $1=_st($2).__comma("] value");
  351. $ctx1.sendIdx[","]=1;
  352. self._source_($1);
  353. $3=self._compileNode_(self._parse_(self._source()));
  354. return $3;
  355. }, function($ctx1) {$ctx1.fill(self,"compileExpression:on:",{aString:aString,anObject:anObject},smalltalk.Compiler)})},
  356. args: ["aString", "anObject"],
  357. source: "compileExpression: aString on: anObject\x0a\x09self currentClass: anObject class.\x0a\x09self source: 'xxxDoIt ^[', aString, '] value'.\x0a\x09^self compileNode: (self parse: self source)",
  358. messageSends: ["currentClass:", "class", "source:", ",", "compileNode:", "parse:", "source"],
  359. referencedClasses: []
  360. }),
  361. smalltalk.Compiler);
  362. smalltalk.addMethod(
  363. smalltalk.method({
  364. selector: "compileNode:",
  365. category: 'compiling',
  366. fn: function (aNode){
  367. var self=this;
  368. var generator,result;
  369. return smalltalk.withContext(function($ctx1) {
  370. var $1,$2,$3;
  371. generator=_st(self._codeGeneratorClass())._new();
  372. $1=generator;
  373. _st($1)._source_(self._source());
  374. $2=_st($1)._currentClass_(self._currentClass());
  375. result=_st(generator)._compileNode_(aNode);
  376. self._unknownVariables_([]);
  377. $3=result;
  378. return $3;
  379. }, function($ctx1) {$ctx1.fill(self,"compileNode:",{aNode:aNode,generator:generator,result:result},smalltalk.Compiler)})},
  380. args: ["aNode"],
  381. 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\x09result := generator compileNode: aNode.\x0a\x09self unknownVariables: #().\x0a\x09^result",
  382. messageSends: ["new", "codeGeneratorClass", "source:", "source", "currentClass:", "currentClass", "compileNode:", "unknownVariables:"],
  383. referencedClasses: []
  384. }),
  385. smalltalk.Compiler);
  386. smalltalk.addMethod(
  387. smalltalk.method({
  388. selector: "currentClass",
  389. category: 'accessing',
  390. fn: function (){
  391. var self=this;
  392. return smalltalk.withContext(function($ctx1) {
  393. var $1;
  394. $1=self["@currentClass"];
  395. return $1;
  396. }, function($ctx1) {$ctx1.fill(self,"currentClass",{},smalltalk.Compiler)})},
  397. args: [],
  398. source: "currentClass\x0a\x09^currentClass",
  399. messageSends: [],
  400. referencedClasses: []
  401. }),
  402. smalltalk.Compiler);
  403. smalltalk.addMethod(
  404. smalltalk.method({
  405. selector: "currentClass:",
  406. category: 'accessing',
  407. fn: function (aClass){
  408. var self=this;
  409. return smalltalk.withContext(function($ctx1) {
  410. self["@currentClass"]=aClass;
  411. return self}, function($ctx1) {$ctx1.fill(self,"currentClass:",{aClass:aClass},smalltalk.Compiler)})},
  412. args: ["aClass"],
  413. source: "currentClass: aClass\x0a\x09currentClass := aClass",
  414. messageSends: [],
  415. referencedClasses: []
  416. }),
  417. smalltalk.Compiler);
  418. smalltalk.addMethod(
  419. smalltalk.method({
  420. selector: "eval:",
  421. category: 'compiling',
  422. fn: function (aString){
  423. var self=this;
  424. return smalltalk.withContext(function($ctx1) {
  425. return eval(aString);
  426. return self}, function($ctx1) {$ctx1.fill(self,"eval:",{aString:aString},smalltalk.Compiler)})},
  427. args: ["aString"],
  428. source: "eval: aString\x0a\x09<return eval(aString)>",
  429. messageSends: [],
  430. referencedClasses: []
  431. }),
  432. smalltalk.Compiler);
  433. smalltalk.addMethod(
  434. smalltalk.method({
  435. selector: "evaluateExpression:",
  436. category: 'compiling',
  437. fn: function (aString){
  438. var self=this;
  439. function $DoIt(){return smalltalk.DoIt||(typeof DoIt=="undefined"?nil:DoIt)}
  440. return smalltalk.withContext(function($ctx1) {
  441. var $1;
  442. $1=self._evaluateExpression_on_(aString,_st($DoIt())._new());
  443. return $1;
  444. }, function($ctx1) {$ctx1.fill(self,"evaluateExpression:",{aString:aString},smalltalk.Compiler)})},
  445. args: ["aString"],
  446. 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",
  447. messageSends: ["evaluateExpression:on:", "new"],
  448. referencedClasses: ["DoIt"]
  449. }),
  450. smalltalk.Compiler);
  451. smalltalk.addMethod(
  452. smalltalk.method({
  453. selector: "evaluateExpression:on:",
  454. category: 'compiling',
  455. fn: function (aString,anObject){
  456. var self=this;
  457. var result,method;
  458. return smalltalk.withContext(function($ctx1) {
  459. var $1,$2,$3;
  460. method=self._eval_(self._compileExpression_on_(aString,anObject));
  461. _st(method)._category_("xxxDoIt");
  462. $1=_st(anObject)._class();
  463. $ctx1.sendIdx["class"]=1;
  464. _st($1)._addCompiledMethod_(method);
  465. result=_st(anObject)._xxxDoIt();
  466. $2=_st(anObject)._class();
  467. _st($2)._removeCompiledMethod_(method);
  468. $3=result;
  469. return $3;
  470. }, function($ctx1) {$ctx1.fill(self,"evaluateExpression:on:",{aString:aString,anObject:anObject,result:result,method:method},smalltalk.Compiler)})},
  471. args: ["aString", "anObject"],
  472. 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 category: 'xxxDoIt'.\x0a\x09anObject class addCompiledMethod: method.\x0a\x09result := anObject xxxDoIt.\x0a\x09anObject class removeCompiledMethod: method.\x0a\x09^result",
  473. messageSends: ["eval:", "compileExpression:on:", "category:", "addCompiledMethod:", "class", "xxxDoIt", "removeCompiledMethod:"],
  474. referencedClasses: []
  475. }),
  476. smalltalk.Compiler);
  477. smalltalk.addMethod(
  478. smalltalk.method({
  479. selector: "install:forClass:category:",
  480. category: 'compiling',
  481. fn: function (aString,aBehavior,anotherString){
  482. var self=this;
  483. function $ClassBuilder(){return smalltalk.ClassBuilder||(typeof ClassBuilder=="undefined"?nil:ClassBuilder)}
  484. return smalltalk.withContext(function($ctx1) {
  485. var $1;
  486. $1=_st(_st($ClassBuilder())._new())._installMethod_forClass_category_(self._eval_(self._compile_forClass_(aString,aBehavior)),aBehavior,anotherString);
  487. return $1;
  488. }, function($ctx1) {$ctx1.fill(self,"install:forClass:category:",{aString:aString,aBehavior:aBehavior,anotherString:anotherString},smalltalk.Compiler)})},
  489. args: ["aString", "aBehavior", "anotherString"],
  490. source: "install: aString forClass: aBehavior category: anotherString\x0a\x09^ ClassBuilder new\x0a\x09\x09installMethod: (self eval: (self compile: aString forClass: aBehavior))\x0a\x09\x09forClass: aBehavior\x0a\x09\x09category: anotherString",
  491. messageSends: ["installMethod:forClass:category:", "new", "eval:", "compile:forClass:"],
  492. referencedClasses: ["ClassBuilder"]
  493. }),
  494. smalltalk.Compiler);
  495. smalltalk.addMethod(
  496. smalltalk.method({
  497. selector: "parse:",
  498. category: 'compiling',
  499. fn: function (aString){
  500. var self=this;
  501. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  502. return smalltalk.withContext(function($ctx1) {
  503. var $1;
  504. $1=_st(_st($Smalltalk())._current())._parse_(aString);
  505. return $1;
  506. }, function($ctx1) {$ctx1.fill(self,"parse:",{aString:aString},smalltalk.Compiler)})},
  507. args: ["aString"],
  508. source: "parse: aString\x0a\x09^Smalltalk current parse: aString",
  509. messageSends: ["parse:", "current"],
  510. referencedClasses: ["Smalltalk"]
  511. }),
  512. smalltalk.Compiler);
  513. smalltalk.addMethod(
  514. smalltalk.method({
  515. selector: "parseExpression:",
  516. category: 'compiling',
  517. fn: function (aString){
  518. var self=this;
  519. return smalltalk.withContext(function($ctx1) {
  520. var $3,$2,$1;
  521. $3="doIt ^[".__comma(aString);
  522. $2=_st($3).__comma("] value");
  523. $ctx1.sendIdx[","]=1;
  524. $1=self._parse_($2);
  525. return $1;
  526. }, function($ctx1) {$ctx1.fill(self,"parseExpression:",{aString:aString},smalltalk.Compiler)})},
  527. args: ["aString"],
  528. source: "parseExpression: aString\x0a\x09^self parse: 'doIt ^[', aString, '] value'",
  529. messageSends: ["parse:", ","],
  530. referencedClasses: []
  531. }),
  532. smalltalk.Compiler);
  533. smalltalk.addMethod(
  534. smalltalk.method({
  535. selector: "recompile:",
  536. category: 'compiling',
  537. fn: function (aClass){
  538. var self=this;
  539. return smalltalk.withContext(function($ctx1) {
  540. _st(_st(_st(aClass)._methodDictionary())._values())._do_displayingProgress_((function(each){
  541. return smalltalk.withContext(function($ctx2) {
  542. return self._install_forClass_category_(_st(each)._source(),aClass,_st(each)._category());
  543. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}),"Recompiling ".__comma(_st(aClass)._name()));
  544. if(! smalltalk.assert(_st(aClass)._isMetaclass())){
  545. self._recompile_(_st(aClass)._class());
  546. };
  547. return self}, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass},smalltalk.Compiler)})},
  548. args: ["aClass"],
  549. source: "recompile: aClass\x0a\x09aClass methodDictionary values\x0a\x09\x09do: [ :each | self install: each source forClass: aClass category: each category ]\x0a\x09\x09displayingProgress: 'Recompiling ', aClass name.\x0a\x09\x22self setupClass: aClass.\x22\x0a\x09aClass isMetaclass ifFalse: [ self recompile: aClass class ]",
  550. messageSends: ["do:displayingProgress:", "values", "methodDictionary", "install:forClass:category:", "source", "category", ",", "name", "ifFalse:", "isMetaclass", "recompile:", "class"],
  551. referencedClasses: []
  552. }),
  553. smalltalk.Compiler);
  554. smalltalk.addMethod(
  555. smalltalk.method({
  556. selector: "recompileAll",
  557. category: 'compiling',
  558. fn: function (){
  559. var self=this;
  560. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  561. return smalltalk.withContext(function($ctx1) {
  562. _st(_st(_st($Smalltalk())._current())._classes())._do_displayingProgress_((function(each){
  563. return smalltalk.withContext(function($ctx2) {
  564. return self._recompile_(each);
  565. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}),"Compiling all classes...");
  566. return self}, function($ctx1) {$ctx1.fill(self,"recompileAll",{},smalltalk.Compiler)})},
  567. args: [],
  568. source: "recompileAll\x0a\x09Smalltalk current classes \x0a\x09\x09do: [:each | self recompile: each ]\x0a\x09\x09displayingProgress: 'Compiling all classes...'",
  569. messageSends: ["do:displayingProgress:", "classes", "current", "recompile:"],
  570. referencedClasses: ["Smalltalk"]
  571. }),
  572. smalltalk.Compiler);
  573. smalltalk.addMethod(
  574. smalltalk.method({
  575. selector: "source",
  576. category: 'accessing',
  577. fn: function (){
  578. var self=this;
  579. return smalltalk.withContext(function($ctx1) {
  580. var $1;
  581. if(($receiver = self["@source"]) == nil || $receiver == null){
  582. $1="";
  583. } else {
  584. $1=self["@source"];
  585. };
  586. return $1;
  587. }, function($ctx1) {$ctx1.fill(self,"source",{},smalltalk.Compiler)})},
  588. args: [],
  589. source: "source\x0a\x09^source ifNil: ['']",
  590. messageSends: ["ifNil:"],
  591. referencedClasses: []
  592. }),
  593. smalltalk.Compiler);
  594. smalltalk.addMethod(
  595. smalltalk.method({
  596. selector: "source:",
  597. category: 'accessing',
  598. fn: function (aString){
  599. var self=this;
  600. return smalltalk.withContext(function($ctx1) {
  601. self["@source"]=aString;
  602. return self}, function($ctx1) {$ctx1.fill(self,"source:",{aString:aString},smalltalk.Compiler)})},
  603. args: ["aString"],
  604. source: "source: aString\x0a\x09source := aString",
  605. messageSends: [],
  606. referencedClasses: []
  607. }),
  608. smalltalk.Compiler);
  609. smalltalk.addMethod(
  610. smalltalk.method({
  611. selector: "unknownVariables",
  612. category: 'accessing',
  613. fn: function (){
  614. var self=this;
  615. return smalltalk.withContext(function($ctx1) {
  616. var $1;
  617. $1=self["@unknownVariables"];
  618. return $1;
  619. }, function($ctx1) {$ctx1.fill(self,"unknownVariables",{},smalltalk.Compiler)})},
  620. args: [],
  621. source: "unknownVariables\x0a\x09^unknownVariables",
  622. messageSends: [],
  623. referencedClasses: []
  624. }),
  625. smalltalk.Compiler);
  626. smalltalk.addMethod(
  627. smalltalk.method({
  628. selector: "unknownVariables:",
  629. category: 'accessing',
  630. fn: function (aCollection){
  631. var self=this;
  632. return smalltalk.withContext(function($ctx1) {
  633. self["@unknownVariables"]=aCollection;
  634. return self}, function($ctx1) {$ctx1.fill(self,"unknownVariables:",{aCollection:aCollection},smalltalk.Compiler)})},
  635. args: ["aCollection"],
  636. source: "unknownVariables: aCollection\x0a\x09unknownVariables := aCollection",
  637. messageSends: [],
  638. referencedClasses: []
  639. }),
  640. smalltalk.Compiler);
  641. smalltalk.addMethod(
  642. smalltalk.method({
  643. selector: "recompile:",
  644. category: 'compiling',
  645. fn: function (aClass){
  646. var self=this;
  647. return smalltalk.withContext(function($ctx1) {
  648. _st(self._new())._recompile_(aClass);
  649. return self}, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass},smalltalk.Compiler.klass)})},
  650. args: ["aClass"],
  651. source: "recompile: aClass\x0a\x09self new recompile: aClass",
  652. messageSends: ["recompile:", "new"],
  653. referencedClasses: []
  654. }),
  655. smalltalk.Compiler.klass);
  656. smalltalk.addMethod(
  657. smalltalk.method({
  658. selector: "recompileAll",
  659. category: 'compiling',
  660. fn: function (){
  661. var self=this;
  662. function $Smalltalk(){return smalltalk.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
  663. return smalltalk.withContext(function($ctx1) {
  664. _st(_st(_st($Smalltalk())._current())._classes())._do_((function(each){
  665. return smalltalk.withContext(function($ctx2) {
  666. return self._recompile_(each);
  667. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}));
  668. return self}, function($ctx1) {$ctx1.fill(self,"recompileAll",{},smalltalk.Compiler.klass)})},
  669. args: [],
  670. source: "recompileAll\x0a\x09Smalltalk current classes do: [:each |\x0a\x09\x09self recompile: each]",
  671. messageSends: ["do:", "classes", "current", "recompile:"],
  672. referencedClasses: ["Smalltalk"]
  673. }),
  674. smalltalk.Compiler.klass);
  675. smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler-Core');
  676. smalltalk.DoIt.comment="`DoIt` is the class used to compile and evaluate expressions. See `Compiler >> evaluateExpression:`.";
  677. smalltalk.addClass('NodeVisitor', smalltalk.Object, [], 'Compiler-Core');
  678. smalltalk.NodeVisitor.comment="I am the abstract super class of all AST node visitors.";
  679. smalltalk.addMethod(
  680. smalltalk.method({
  681. selector: "visit:",
  682. category: 'visiting',
  683. fn: function (aNode){
  684. var self=this;
  685. return smalltalk.withContext(function($ctx1) {
  686. var $1;
  687. $1=_st(aNode)._accept_(self);
  688. return $1;
  689. }, function($ctx1) {$ctx1.fill(self,"visit:",{aNode:aNode},smalltalk.NodeVisitor)})},
  690. args: ["aNode"],
  691. source: "visit: aNode\x0a\x09^ aNode accept: self",
  692. messageSends: ["accept:"],
  693. referencedClasses: []
  694. }),
  695. smalltalk.NodeVisitor);
  696. smalltalk.addMethod(
  697. smalltalk.method({
  698. selector: "visitAll:",
  699. category: 'visiting',
  700. fn: function (aCollection){
  701. var self=this;
  702. return smalltalk.withContext(function($ctx1) {
  703. var $1;
  704. $1=_st(aCollection)._collect_((function(each){
  705. return smalltalk.withContext(function($ctx2) {
  706. return self._visit_(each);
  707. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}));
  708. return $1;
  709. }, function($ctx1) {$ctx1.fill(self,"visitAll:",{aCollection:aCollection},smalltalk.NodeVisitor)})},
  710. args: ["aCollection"],
  711. source: "visitAll: aCollection\x0a\x09^ aCollection collect: [ :each | self visit: each ]",
  712. messageSends: ["collect:", "visit:"],
  713. referencedClasses: []
  714. }),
  715. smalltalk.NodeVisitor);
  716. smalltalk.addMethod(
  717. smalltalk.method({
  718. selector: "visitAssignmentNode:",
  719. category: 'visiting',
  720. fn: function (aNode){
  721. var self=this;
  722. return smalltalk.withContext(function($ctx1) {
  723. var $1;
  724. $1=self._visitNode_(aNode);
  725. return $1;
  726. }, function($ctx1) {$ctx1.fill(self,"visitAssignmentNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  727. args: ["aNode"],
  728. source: "visitAssignmentNode: aNode\x0a\x09^ self visitNode: aNode",
  729. messageSends: ["visitNode:"],
  730. referencedClasses: []
  731. }),
  732. smalltalk.NodeVisitor);
  733. smalltalk.addMethod(
  734. smalltalk.method({
  735. selector: "visitBlockNode:",
  736. category: 'visiting',
  737. fn: function (aNode){
  738. var self=this;
  739. return smalltalk.withContext(function($ctx1) {
  740. var $1;
  741. $1=self._visitNode_(aNode);
  742. return $1;
  743. }, function($ctx1) {$ctx1.fill(self,"visitBlockNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  744. args: ["aNode"],
  745. source: "visitBlockNode: aNode\x0a\x09^ self visitNode: aNode",
  746. messageSends: ["visitNode:"],
  747. referencedClasses: []
  748. }),
  749. smalltalk.NodeVisitor);
  750. smalltalk.addMethod(
  751. smalltalk.method({
  752. selector: "visitBlockSequenceNode:",
  753. category: 'visiting',
  754. fn: function (aNode){
  755. var self=this;
  756. return smalltalk.withContext(function($ctx1) {
  757. var $1;
  758. $1=self._visitSequenceNode_(aNode);
  759. return $1;
  760. }, function($ctx1) {$ctx1.fill(self,"visitBlockSequenceNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  761. args: ["aNode"],
  762. source: "visitBlockSequenceNode: aNode\x0a\x09^ self visitSequenceNode: aNode",
  763. messageSends: ["visitSequenceNode:"],
  764. referencedClasses: []
  765. }),
  766. smalltalk.NodeVisitor);
  767. smalltalk.addMethod(
  768. smalltalk.method({
  769. selector: "visitCascadeNode:",
  770. category: 'visiting',
  771. fn: function (aNode){
  772. var self=this;
  773. return smalltalk.withContext(function($ctx1) {
  774. var $1;
  775. $1=self._visitNode_(aNode);
  776. return $1;
  777. }, function($ctx1) {$ctx1.fill(self,"visitCascadeNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  778. args: ["aNode"],
  779. source: "visitCascadeNode: aNode\x0a\x09^ self visitNode: aNode",
  780. messageSends: ["visitNode:"],
  781. referencedClasses: []
  782. }),
  783. smalltalk.NodeVisitor);
  784. smalltalk.addMethod(
  785. smalltalk.method({
  786. selector: "visitDynamicArrayNode:",
  787. category: 'visiting',
  788. fn: function (aNode){
  789. var self=this;
  790. return smalltalk.withContext(function($ctx1) {
  791. var $1;
  792. $1=self._visitNode_(aNode);
  793. return $1;
  794. }, function($ctx1) {$ctx1.fill(self,"visitDynamicArrayNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  795. args: ["aNode"],
  796. source: "visitDynamicArrayNode: aNode\x0a\x09^ self visitNode: aNode",
  797. messageSends: ["visitNode:"],
  798. referencedClasses: []
  799. }),
  800. smalltalk.NodeVisitor);
  801. smalltalk.addMethod(
  802. smalltalk.method({
  803. selector: "visitDynamicDictionaryNode:",
  804. category: 'visiting',
  805. fn: function (aNode){
  806. var self=this;
  807. return smalltalk.withContext(function($ctx1) {
  808. var $1;
  809. $1=self._visitNode_(aNode);
  810. return $1;
  811. }, function($ctx1) {$ctx1.fill(self,"visitDynamicDictionaryNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  812. args: ["aNode"],
  813. source: "visitDynamicDictionaryNode: aNode\x0a\x09^ self visitNode: aNode",
  814. messageSends: ["visitNode:"],
  815. referencedClasses: []
  816. }),
  817. smalltalk.NodeVisitor);
  818. smalltalk.addMethod(
  819. smalltalk.method({
  820. selector: "visitJSStatementNode:",
  821. category: 'visiting',
  822. fn: function (aNode){
  823. var self=this;
  824. return smalltalk.withContext(function($ctx1) {
  825. var $1;
  826. $1=self._visitNode_(aNode);
  827. return $1;
  828. }, function($ctx1) {$ctx1.fill(self,"visitJSStatementNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  829. args: ["aNode"],
  830. source: "visitJSStatementNode: aNode\x0a\x09^ self visitNode: aNode",
  831. messageSends: ["visitNode:"],
  832. referencedClasses: []
  833. }),
  834. smalltalk.NodeVisitor);
  835. smalltalk.addMethod(
  836. smalltalk.method({
  837. selector: "visitMethodNode:",
  838. category: 'visiting',
  839. fn: function (aNode){
  840. var self=this;
  841. return smalltalk.withContext(function($ctx1) {
  842. var $1;
  843. $1=self._visitNode_(aNode);
  844. return $1;
  845. }, function($ctx1) {$ctx1.fill(self,"visitMethodNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  846. args: ["aNode"],
  847. source: "visitMethodNode: aNode\x0a\x09^ self visitNode: aNode",
  848. messageSends: ["visitNode:"],
  849. referencedClasses: []
  850. }),
  851. smalltalk.NodeVisitor);
  852. smalltalk.addMethod(
  853. smalltalk.method({
  854. selector: "visitNode:",
  855. category: 'visiting',
  856. fn: function (aNode){
  857. var self=this;
  858. return smalltalk.withContext(function($ctx1) {
  859. var $1;
  860. $1=self._visitAll_(_st(aNode)._nodes());
  861. return $1;
  862. }, function($ctx1) {$ctx1.fill(self,"visitNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  863. args: ["aNode"],
  864. source: "visitNode: aNode\x0a\x09^ self visitAll: aNode nodes",
  865. messageSends: ["visitAll:", "nodes"],
  866. referencedClasses: []
  867. }),
  868. smalltalk.NodeVisitor);
  869. smalltalk.addMethod(
  870. smalltalk.method({
  871. selector: "visitReturnNode:",
  872. category: 'visiting',
  873. fn: function (aNode){
  874. var self=this;
  875. return smalltalk.withContext(function($ctx1) {
  876. var $1;
  877. $1=self._visitNode_(aNode);
  878. return $1;
  879. }, function($ctx1) {$ctx1.fill(self,"visitReturnNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  880. args: ["aNode"],
  881. source: "visitReturnNode: aNode\x0a\x09^ self visitNode: aNode",
  882. messageSends: ["visitNode:"],
  883. referencedClasses: []
  884. }),
  885. smalltalk.NodeVisitor);
  886. smalltalk.addMethod(
  887. smalltalk.method({
  888. selector: "visitSendNode:",
  889. category: 'visiting',
  890. fn: function (aNode){
  891. var self=this;
  892. return smalltalk.withContext(function($ctx1) {
  893. var $1;
  894. $1=self._visitNode_(aNode);
  895. return $1;
  896. }, function($ctx1) {$ctx1.fill(self,"visitSendNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  897. args: ["aNode"],
  898. source: "visitSendNode: aNode\x0a\x09^ self visitNode: aNode",
  899. messageSends: ["visitNode:"],
  900. referencedClasses: []
  901. }),
  902. smalltalk.NodeVisitor);
  903. smalltalk.addMethod(
  904. smalltalk.method({
  905. selector: "visitSequenceNode:",
  906. category: 'visiting',
  907. fn: function (aNode){
  908. var self=this;
  909. return smalltalk.withContext(function($ctx1) {
  910. var $1;
  911. $1=self._visitNode_(aNode);
  912. return $1;
  913. }, function($ctx1) {$ctx1.fill(self,"visitSequenceNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  914. args: ["aNode"],
  915. source: "visitSequenceNode: aNode\x0a\x09^ self visitNode: aNode",
  916. messageSends: ["visitNode:"],
  917. referencedClasses: []
  918. }),
  919. smalltalk.NodeVisitor);
  920. smalltalk.addMethod(
  921. smalltalk.method({
  922. selector: "visitValueNode:",
  923. category: 'visiting',
  924. fn: function (aNode){
  925. var self=this;
  926. return smalltalk.withContext(function($ctx1) {
  927. var $1;
  928. $1=self._visitNode_(aNode);
  929. return $1;
  930. }, function($ctx1) {$ctx1.fill(self,"visitValueNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  931. args: ["aNode"],
  932. source: "visitValueNode: aNode\x0a\x09^ self visitNode: aNode",
  933. messageSends: ["visitNode:"],
  934. referencedClasses: []
  935. }),
  936. smalltalk.NodeVisitor);
  937. smalltalk.addMethod(
  938. smalltalk.method({
  939. selector: "visitVariableNode:",
  940. category: 'visiting',
  941. fn: function (aNode){
  942. var self=this;
  943. return smalltalk.withContext(function($ctx1) {
  944. var $1;
  945. $1=self._visitNode_(aNode);
  946. return $1;
  947. }, function($ctx1) {$ctx1.fill(self,"visitVariableNode:",{aNode:aNode},smalltalk.NodeVisitor)})},
  948. args: ["aNode"],
  949. source: "visitVariableNode: aNode\x0a\x09^ self visitNode: aNode",
  950. messageSends: ["visitNode:"],
  951. referencedClasses: []
  952. }),
  953. smalltalk.NodeVisitor);
  954. });