Compiler-Semantic.js 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  1. smalltalk.addPackage('Compiler-Semantic', {});
  2. smalltalk.addClass('LexicalScope', smalltalk.Object, ['temps', 'args', 'outerScope'], 'Compiler-Semantic');
  3. smalltalk.LexicalScope.comment="I represent a lexical scope where variable names are associated with ScopeVars\x0aInstances are used for block scopes. Method scopes are instances of MethodLexicalScope.\x0a\x0aI am attached to a ScopeVar and method/block nodes.\x0aEach context (method/closure) get a fresh scope that inherits from its outer scope."
  4. smalltalk.addMethod(
  5. "_addArg_",
  6. smalltalk.method({
  7. selector: "addArg:",
  8. category: 'adding',
  9. fn: function (aString) {
  10. var self=this;
  11. smalltalk.send(smalltalk.send(self, "_args", []), "_at_put_", [aString, smalltalk.send((smalltalk.ArgVar || ArgVar), "_on_", [aString])]);
  12. smalltalk.send(smalltalk.send(smalltalk.send(self, "_args", []), "_at_", [aString]), "_scope_", [self]);
  13. return self;},
  14. args: ["aString"],
  15. source: "addArg: aString\x0a\x09self args at: aString put: (ArgVar on: aString).\x0a\x09(self args at: aString) scope: self",
  16. messageSends: ["at:put:", "args", "on:", "scope:", "at:"],
  17. referencedClasses: ["ArgVar"]
  18. }),
  19. smalltalk.LexicalScope);
  20. smalltalk.addMethod(
  21. "_addTemp_",
  22. smalltalk.method({
  23. selector: "addTemp:",
  24. category: 'adding',
  25. fn: function (aString) {
  26. var self=this;
  27. smalltalk.send(smalltalk.send(self, "_temps", []), "_at_put_", [aString, smalltalk.send((smalltalk.TempVar || TempVar), "_on_", [aString])]);
  28. smalltalk.send(smalltalk.send(smalltalk.send(self, "_temps", []), "_at_", [aString]), "_scope_", [self]);
  29. return self;},
  30. args: ["aString"],
  31. source: "addTemp: aString\x0a\x09self temps at: aString put: (TempVar on: aString).\x0a\x09(self temps at: aString) scope: self",
  32. messageSends: ["at:put:", "temps", "on:", "scope:", "at:"],
  33. referencedClasses: ["TempVar"]
  34. }),
  35. smalltalk.LexicalScope);
  36. smalltalk.addMethod(
  37. "_allVariableNames",
  38. smalltalk.method({
  39. selector: "allVariableNames",
  40. category: 'accessing',
  41. fn: function () {
  42. var self=this;
  43. return smalltalk.send(smalltalk.send(smalltalk.send(self, "_args", []), "_keys", []), "__comma", [smalltalk.send(smalltalk.send(self, "_temps", []), "_keys", [])]);
  44. return self;},
  45. args: [],
  46. source: "allVariableNames\x0a\x09^ self args keys, self temps keys",
  47. messageSends: [",", "keys", "args", "temps"],
  48. referencedClasses: []
  49. }),
  50. smalltalk.LexicalScope);
  51. smalltalk.addMethod(
  52. "_args",
  53. smalltalk.method({
  54. selector: "args",
  55. category: 'accessing',
  56. fn: function () {
  57. var self=this;
  58. return (($receiver = self['@args']) == nil || $receiver == undefined) ? (function(){return (self['@args']=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));})() : $receiver;
  59. return self;},
  60. args: [],
  61. source: "args\x0a\x09^ args ifNil: [ args := Dictionary new ]",
  62. messageSends: ["ifNil:", "new"],
  63. referencedClasses: ["Dictionary"]
  64. }),
  65. smalltalk.LexicalScope);
  66. smalltalk.addMethod(
  67. "_bindingFor_",
  68. smalltalk.method({
  69. selector: "bindingFor:",
  70. category: 'accessing',
  71. fn: function (aStringOrNode) {
  72. var self=this;
  73. return smalltalk.send(smalltalk.send(self, "_args", []), "_at_ifAbsent_", [smalltalk.send(aStringOrNode, "_value", []), (function(){return smalltalk.send(smalltalk.send(self, "_temps", []), "_at_ifAbsent_", [smalltalk.send(aStringOrNode, "_value", []), (function(){return nil;})]);})]);
  74. return self;},
  75. args: ["aStringOrNode"],
  76. source: "bindingFor: aStringOrNode\x0a\x09^ self args at: aStringOrNode value ifAbsent: [\x0a\x09\x09self temps at: aStringOrNode value ifAbsent: [ nil ]]",
  77. messageSends: ["at:ifAbsent:", "args", "value", "temps"],
  78. referencedClasses: []
  79. }),
  80. smalltalk.LexicalScope);
  81. smalltalk.addMethod(
  82. "_isMethodScope",
  83. smalltalk.method({
  84. selector: "isMethodScope",
  85. category: 'testing',
  86. fn: function () {
  87. var self=this;
  88. return false;
  89. return self;},
  90. args: [],
  91. source: "isMethodScope\x0a\x09^ false",
  92. messageSends: [],
  93. referencedClasses: []
  94. }),
  95. smalltalk.LexicalScope);
  96. smalltalk.addMethod(
  97. "_lookupVariable_",
  98. smalltalk.method({
  99. selector: "lookupVariable:",
  100. category: 'accessing',
  101. fn: function (aNode) {
  102. var self=this;
  103. var lookup=nil;
  104. (lookup=smalltalk.send(self, "_bindingFor_", [aNode]));
  105. (($receiver = lookup) == nil || $receiver == undefined) ? (function(){return (lookup=(($receiver = smalltalk.send(self, "_outerScope", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_outerScope", []), "_lookupVariable_", [aNode]);})() : nil);})() : $receiver;
  106. return lookup;
  107. return self;},
  108. args: ["aNode"],
  109. source: "lookupVariable: aNode\x0a\x09| lookup |\x0a\x09lookup := (self bindingFor: aNode).\x0a\x09lookup ifNil: [\x0a\x09\x09lookup := self outerScope ifNotNil: [ \x0a\x09\x09\x09(self outerScope lookupVariable: aNode) ]].\x0a\x09^ lookup",
  110. messageSends: ["bindingFor:", "ifNil:", "ifNotNil:", "outerScope", "lookupVariable:"],
  111. referencedClasses: []
  112. }),
  113. smalltalk.LexicalScope);
  114. smalltalk.addMethod(
  115. "_methodScope",
  116. smalltalk.method({
  117. selector: "methodScope",
  118. category: 'accessing',
  119. fn: function () {
  120. var self=this;
  121. return (($receiver = smalltalk.send(self, "_outerScope", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_outerScope", []), "_methodScope", []);})() : nil;
  122. return self;},
  123. args: [],
  124. source: "methodScope\x0a\x09^ self outerScope ifNotNil: [\x0a\x09\x09self outerScope methodScope ]",
  125. messageSends: ["ifNotNil:", "outerScope", "methodScope"],
  126. referencedClasses: []
  127. }),
  128. smalltalk.LexicalScope);
  129. smalltalk.addMethod(
  130. "_outerScope",
  131. smalltalk.method({
  132. selector: "outerScope",
  133. category: 'accessing',
  134. fn: function () {
  135. var self=this;
  136. return self['@outerScope'];
  137. return self;},
  138. args: [],
  139. source: "outerScope\x0a\x09^ outerScope",
  140. messageSends: [],
  141. referencedClasses: []
  142. }),
  143. smalltalk.LexicalScope);
  144. smalltalk.addMethod(
  145. "_outerScope_",
  146. smalltalk.method({
  147. selector: "outerScope:",
  148. category: 'accessing',
  149. fn: function (aLexicalScope) {
  150. var self=this;
  151. (self['@outerScope']=aLexicalScope);
  152. return self;},
  153. args: ["aLexicalScope"],
  154. source: "outerScope: aLexicalScope\x0a\x09outerScope := aLexicalScope",
  155. messageSends: [],
  156. referencedClasses: []
  157. }),
  158. smalltalk.LexicalScope);
  159. smalltalk.addMethod(
  160. "_temps",
  161. smalltalk.method({
  162. selector: "temps",
  163. category: 'accessing',
  164. fn: function () {
  165. var self=this;
  166. return (($receiver = self['@temps']) == nil || $receiver == undefined) ? (function(){return (self['@temps']=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));})() : $receiver;
  167. return self;},
  168. args: [],
  169. source: "temps\x0a\x09^ temps ifNil: [ temps := Dictionary new ]",
  170. messageSends: ["ifNil:", "new"],
  171. referencedClasses: ["Dictionary"]
  172. }),
  173. smalltalk.LexicalScope);
  174. smalltalk.addClass('MethodLexicalScope', smalltalk.LexicalScope, ['iVars', 'unknownVariables', 'nonLocalReturn'], 'Compiler-Semantic');
  175. smalltalk.MethodLexicalScope.comment="I represent a method scope."
  176. smalltalk.addMethod(
  177. "_addIvar_",
  178. smalltalk.method({
  179. selector: "addIvar:",
  180. category: 'adding',
  181. fn: function (aString) {
  182. var self=this;
  183. smalltalk.send(smalltalk.send(self, "_iVars", []), "_at_put_", [aString, smalltalk.send((smalltalk.InstanceVar || InstanceVar), "_on_", [aString])]);
  184. smalltalk.send(smalltalk.send(smalltalk.send(self, "_iVars", []), "_at_", [aString]), "_scope_", [self]);
  185. return self;},
  186. args: ["aString"],
  187. source: "addIvar: aString\x0a\x09self iVars at: aString put: (InstanceVar on: aString).\x0a\x09(self iVars at: aString) scope: self",
  188. messageSends: ["at:put:", "iVars", "on:", "scope:", "at:"],
  189. referencedClasses: ["InstanceVar"]
  190. }),
  191. smalltalk.MethodLexicalScope);
  192. smalltalk.addMethod(
  193. "_allVariableNames",
  194. smalltalk.method({
  195. selector: "allVariableNames",
  196. category: 'accessing',
  197. fn: function () {
  198. var self=this;
  199. return smalltalk.send(smalltalk.send(self, "_allVariableNames", [], smalltalk.MethodLexicalScope.superclass || nil), "__comma", [smalltalk.send(smalltalk.send(self, "_iVars", []), "_keys", [])]);
  200. return self;},
  201. args: [],
  202. source: "allVariableNames\x0a\x09^ super allVariableNames, self iVars keys",
  203. messageSends: [",", "allVariableNames", "keys", "iVars"],
  204. referencedClasses: []
  205. }),
  206. smalltalk.MethodLexicalScope);
  207. smalltalk.addMethod(
  208. "_bindingFor_",
  209. smalltalk.method({
  210. selector: "bindingFor:",
  211. category: 'accessing',
  212. fn: function (aNode) {
  213. var self=this;
  214. return (($receiver = smalltalk.send(self, "_bindingFor_", [aNode], smalltalk.MethodLexicalScope.superclass || nil)) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_iVars", []), "_at_ifAbsent_", [smalltalk.send(aNode, "_value", []), (function(){return nil;})]);})() : $receiver;
  215. return self;},
  216. args: ["aNode"],
  217. source: "bindingFor: aNode\x0a\x09^ (super bindingFor: aNode) ifNil: [\x0a\x09\x09self iVars at: aNode value ifAbsent: [ nil ]]",
  218. messageSends: ["ifNil:", "bindingFor:", "at:ifAbsent:", "iVars", "value"],
  219. referencedClasses: []
  220. }),
  221. smalltalk.MethodLexicalScope);
  222. smalltalk.addMethod(
  223. "_hasNonLocalReturn",
  224. smalltalk.method({
  225. selector: "hasNonLocalReturn",
  226. category: 'testing',
  227. fn: function () {
  228. var self=this;
  229. return smalltalk.send(self, "_nonLocalReturn", []);
  230. return self;},
  231. args: [],
  232. source: "hasNonLocalReturn\x0a\x09^ self nonLocalReturn",
  233. messageSends: ["nonLocalReturn"],
  234. referencedClasses: []
  235. }),
  236. smalltalk.MethodLexicalScope);
  237. smalltalk.addMethod(
  238. "_iVars",
  239. smalltalk.method({
  240. selector: "iVars",
  241. category: 'accessing',
  242. fn: function () {
  243. var self=this;
  244. return (($receiver = self['@iVars']) == nil || $receiver == undefined) ? (function(){return (self['@iVars']=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));})() : $receiver;
  245. return self;},
  246. args: [],
  247. source: "iVars\x0a\x09^ iVars ifNil: [ iVars := Dictionary new ]",
  248. messageSends: ["ifNil:", "new"],
  249. referencedClasses: ["Dictionary"]
  250. }),
  251. smalltalk.MethodLexicalScope);
  252. smalltalk.addMethod(
  253. "_isMethodScope",
  254. smalltalk.method({
  255. selector: "isMethodScope",
  256. category: 'testing',
  257. fn: function () {
  258. var self=this;
  259. return true;
  260. return self;},
  261. args: [],
  262. source: "isMethodScope\x0a\x09^ true",
  263. messageSends: [],
  264. referencedClasses: []
  265. }),
  266. smalltalk.MethodLexicalScope);
  267. smalltalk.addMethod(
  268. "_methodScope",
  269. smalltalk.method({
  270. selector: "methodScope",
  271. category: 'accessing',
  272. fn: function () {
  273. var self=this;
  274. return self;
  275. return self;},
  276. args: [],
  277. source: "methodScope\x0a\x09^ self",
  278. messageSends: [],
  279. referencedClasses: []
  280. }),
  281. smalltalk.MethodLexicalScope);
  282. smalltalk.addMethod(
  283. "_nonLocalReturn",
  284. smalltalk.method({
  285. selector: "nonLocalReturn",
  286. category: 'accessing',
  287. fn: function () {
  288. var self=this;
  289. return (($receiver = self['@nonLocalReturn']) == nil || $receiver == undefined) ? (function(){return false;})() : $receiver;
  290. return self;},
  291. args: [],
  292. source: "nonLocalReturn\x0a\x09^ nonLocalReturn ifNil: [ false ]",
  293. messageSends: ["ifNil:"],
  294. referencedClasses: []
  295. }),
  296. smalltalk.MethodLexicalScope);
  297. smalltalk.addMethod(
  298. "_nonLocalReturn_",
  299. smalltalk.method({
  300. selector: "nonLocalReturn:",
  301. category: 'accessing',
  302. fn: function (aBoolean) {
  303. var self=this;
  304. (self['@nonLocalReturn']=aBoolean);
  305. return self;},
  306. args: ["aBoolean"],
  307. source: "nonLocalReturn: aBoolean\x0a\x09nonLocalReturn := aBoolean",
  308. messageSends: [],
  309. referencedClasses: []
  310. }),
  311. smalltalk.MethodLexicalScope);
  312. smalltalk.addMethod(
  313. "_unknownVariables",
  314. smalltalk.method({
  315. selector: "unknownVariables",
  316. category: 'accessing',
  317. fn: function () {
  318. var self=this;
  319. return (($receiver = self['@unknownVariables']) == nil || $receiver == undefined) ? (function(){return (self['@unknownVariables']=smalltalk.send((smalltalk.OrderedCollection || OrderedCollection), "_new", []));})() : $receiver;
  320. return self;},
  321. args: [],
  322. source: "unknownVariables\x0a\x09^ unknownVariables ifNil: [ unknownVariables := OrderedCollection new ]",
  323. messageSends: ["ifNil:", "new"],
  324. referencedClasses: ["OrderedCollection"]
  325. }),
  326. smalltalk.MethodLexicalScope);
  327. smalltalk.addClass('ScopeVar', smalltalk.Object, ['scope', 'name'], 'Compiler-Semantic');
  328. smalltalk.ScopeVar.comment="I am an entry in a LexicalScope that gets associated with variable nodes of the same name. \x0aThere are 4 different subclasses of vars: temp vars, local vars, args, and unknown/global vars."
  329. smalltalk.addMethod(
  330. "_alias",
  331. smalltalk.method({
  332. selector: "alias",
  333. category: 'accessing',
  334. fn: function () {
  335. var self=this;
  336. return smalltalk.send(smalltalk.send(self, "_name", []), "_asVariableName", []);
  337. return self;},
  338. args: [],
  339. source: "alias\x0a\x09^ self name asVariableName",
  340. messageSends: ["asVariableName", "name"],
  341. referencedClasses: []
  342. }),
  343. smalltalk.ScopeVar);
  344. smalltalk.addMethod(
  345. "_isArgVar",
  346. smalltalk.method({
  347. selector: "isArgVar",
  348. category: 'testing',
  349. fn: function () {
  350. var self=this;
  351. return false;
  352. return self;},
  353. args: [],
  354. source: "isArgVar\x0a\x09^ false",
  355. messageSends: [],
  356. referencedClasses: []
  357. }),
  358. smalltalk.ScopeVar);
  359. smalltalk.addMethod(
  360. "_isInstanceVar",
  361. smalltalk.method({
  362. selector: "isInstanceVar",
  363. category: 'testing',
  364. fn: function () {
  365. var self=this;
  366. return false;
  367. return self;},
  368. args: [],
  369. source: "isInstanceVar\x0a\x09^ false",
  370. messageSends: [],
  371. referencedClasses: []
  372. }),
  373. smalltalk.ScopeVar);
  374. smalltalk.addMethod(
  375. "_isTempVar",
  376. smalltalk.method({
  377. selector: "isTempVar",
  378. category: 'testing',
  379. fn: function () {
  380. var self=this;
  381. return false;
  382. return self;},
  383. args: [],
  384. source: "isTempVar\x0a\x09^ false",
  385. messageSends: [],
  386. referencedClasses: []
  387. }),
  388. smalltalk.ScopeVar);
  389. smalltalk.addMethod(
  390. "_isUnknownVar",
  391. smalltalk.method({
  392. selector: "isUnknownVar",
  393. category: 'testing',
  394. fn: function () {
  395. var self=this;
  396. return false;
  397. return self;},
  398. args: [],
  399. source: "isUnknownVar\x0a\x09^ false",
  400. messageSends: [],
  401. referencedClasses: []
  402. }),
  403. smalltalk.ScopeVar);
  404. smalltalk.addMethod(
  405. "_name",
  406. smalltalk.method({
  407. selector: "name",
  408. category: 'accessing',
  409. fn: function () {
  410. var self=this;
  411. return self['@name'];
  412. return self;},
  413. args: [],
  414. source: "name\x0a\x09^ name",
  415. messageSends: [],
  416. referencedClasses: []
  417. }),
  418. smalltalk.ScopeVar);
  419. smalltalk.addMethod(
  420. "_name_",
  421. smalltalk.method({
  422. selector: "name:",
  423. category: 'accessing',
  424. fn: function (aString) {
  425. var self=this;
  426. (self['@name']=aString);
  427. return self;},
  428. args: ["aString"],
  429. source: "name: aString\x0a\x09name := aString",
  430. messageSends: [],
  431. referencedClasses: []
  432. }),
  433. smalltalk.ScopeVar);
  434. smalltalk.addMethod(
  435. "_scope",
  436. smalltalk.method({
  437. selector: "scope",
  438. category: 'accessing',
  439. fn: function () {
  440. var self=this;
  441. return self['@scope'];
  442. return self;},
  443. args: [],
  444. source: "scope\x0a\x09^ scope",
  445. messageSends: [],
  446. referencedClasses: []
  447. }),
  448. smalltalk.ScopeVar);
  449. smalltalk.addMethod(
  450. "_scope_",
  451. smalltalk.method({
  452. selector: "scope:",
  453. category: 'accessing',
  454. fn: function (aScope) {
  455. var self=this;
  456. (self['@scope']=aScope);
  457. return self;},
  458. args: ["aScope"],
  459. source: "scope: aScope\x0a\x09scope := aScope",
  460. messageSends: [],
  461. referencedClasses: []
  462. }),
  463. smalltalk.ScopeVar);
  464. smalltalk.addMethod(
  465. "_on_",
  466. smalltalk.method({
  467. selector: "on:",
  468. category: 'instance creation',
  469. fn: function (aString) {
  470. var self=this;
  471. return (function($rec){smalltalk.send($rec, "_name_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
  472. return self;},
  473. args: ["aString"],
  474. source: "on: aString\x0a\x09^ self new \x0a\x09\x09name: aString;\x0a\x09\x09yourself",
  475. messageSends: ["name:", "yourself", "new"],
  476. referencedClasses: []
  477. }),
  478. smalltalk.ScopeVar.klass);
  479. smalltalk.addClass('AliasVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  480. smalltalk.AliasVar.comment="I am an internally defined variable by the compiler"
  481. smalltalk.addClass('ArgVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  482. smalltalk.ArgVar.comment="I am an argument of a method or block."
  483. smalltalk.addMethod(
  484. "_isArgVar",
  485. smalltalk.method({
  486. selector: "isArgVar",
  487. category: 'testing',
  488. fn: function () {
  489. var self=this;
  490. return true;
  491. return self;},
  492. args: [],
  493. source: "isArgVar\x0a\x09^ true",
  494. messageSends: [],
  495. referencedClasses: []
  496. }),
  497. smalltalk.ArgVar);
  498. smalltalk.addClass('ClassRefVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  499. smalltalk.addMethod(
  500. "_alias",
  501. smalltalk.method({
  502. selector: "alias",
  503. category: 'accessing',
  504. fn: function () {
  505. var self=this;
  506. return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("(Smalltalk.", "__comma", [smalltalk.send(self, "_name", [])]), "__comma", [" || "]), "__comma", [smalltalk.send(self, "_name", [])]), "__comma", [")"]);
  507. return self;},
  508. args: [],
  509. source: "alias\x0a\x09^ '(Smalltalk.', self name, ' || ', self name, ')'",
  510. messageSends: [",", "name"],
  511. referencedClasses: []
  512. }),
  513. smalltalk.ClassRefVar);
  514. smalltalk.addClass('InstanceVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  515. smalltalk.InstanceVar.comment="I am an instance variable of a method or block."
  516. smalltalk.addMethod(
  517. "_alias",
  518. smalltalk.method({
  519. selector: "alias",
  520. category: 'testing',
  521. fn: function () {
  522. var self=this;
  523. return smalltalk.send(smalltalk.send("self[\x22@", "__comma", [smalltalk.send(self, "_name", [])]), "__comma", ["]"]);
  524. return self;},
  525. args: [],
  526. source: "alias\x0a\x09^ 'self[\x22@', self name, ']'",
  527. messageSends: [",", "name"],
  528. referencedClasses: []
  529. }),
  530. smalltalk.InstanceVar);
  531. smalltalk.addMethod(
  532. "_isInstanceVar",
  533. smalltalk.method({
  534. selector: "isInstanceVar",
  535. category: 'testing',
  536. fn: function () {
  537. var self=this;
  538. return true;
  539. return self;},
  540. args: [],
  541. source: "isInstanceVar\x0a\x09^ true",
  542. messageSends: [],
  543. referencedClasses: []
  544. }),
  545. smalltalk.InstanceVar);
  546. smalltalk.addClass('TempVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  547. smalltalk.TempVar.comment="I am an temporary variable of a method or block."
  548. smalltalk.addMethod(
  549. "_isTempVar",
  550. smalltalk.method({
  551. selector: "isTempVar",
  552. category: 'testing',
  553. fn: function () {
  554. var self=this;
  555. return true;
  556. return self;},
  557. args: [],
  558. source: "isTempVar\x0a\x09^ true",
  559. messageSends: [],
  560. referencedClasses: []
  561. }),
  562. smalltalk.TempVar);
  563. smalltalk.addClass('UnknownVar', smalltalk.ScopeVar, [], 'Compiler-Semantic');
  564. smalltalk.UnknownVar.comment="I am an unknown variable. Amber uses unknown variables as JavaScript globals"
  565. smalltalk.addMethod(
  566. "_isUnknownVar",
  567. smalltalk.method({
  568. selector: "isUnknownVar",
  569. category: 'testing',
  570. fn: function () {
  571. var self=this;
  572. return true;
  573. return self;},
  574. args: [],
  575. source: "isUnknownVar\x0a\x09^ true",
  576. messageSends: [],
  577. referencedClasses: []
  578. }),
  579. smalltalk.UnknownVar);
  580. smalltalk.addClass('SemanticAnalyzer', smalltalk.NodeVisitor, ['currentScope', 'theClass', 'classReferences', 'messageSends'], 'Compiler-Semantic');
  581. smalltalk.SemanticAnalyzer.comment="I semantically analyze the abstract syntax tree and annotate it with informations such as non local returns and variable scopes."
  582. smalltalk.addMethod(
  583. "_allowUnknownVariables",
  584. smalltalk.method({
  585. selector: "allowUnknownVariables",
  586. category: 'testing',
  587. fn: function () {
  588. var self=this;
  589. return true;
  590. return self;},
  591. args: [],
  592. source: "allowUnknownVariables\x0a\x09^ true",
  593. messageSends: [],
  594. referencedClasses: []
  595. }),
  596. smalltalk.SemanticAnalyzer);
  597. smalltalk.addMethod(
  598. "_classReferences",
  599. smalltalk.method({
  600. selector: "classReferences",
  601. category: 'accessing',
  602. fn: function () {
  603. var self=this;
  604. return (($receiver = self['@classReferences']) == nil || $receiver == undefined) ? (function(){return (self['@classReferences']=smalltalk.send((smalltalk.Set || Set), "_new", []));})() : $receiver;
  605. return self;},
  606. args: [],
  607. source: "classReferences\x0a\x09^ classReferences ifNil: [ classReferences := Set new ]",
  608. messageSends: ["ifNil:", "new"],
  609. referencedClasses: ["Set"]
  610. }),
  611. smalltalk.SemanticAnalyzer);
  612. smalltalk.addMethod(
  613. "_errorInvalidAssignment_",
  614. smalltalk.method({
  615. selector: "errorInvalidAssignment:",
  616. category: 'error handling',
  617. fn: function (aString) {
  618. var self=this;
  619. (function($rec){smalltalk.send($rec, "_variableName_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.InvalidAssignmentError || InvalidAssignmentError), "_new", []));
  620. return self;},
  621. args: ["aString"],
  622. source: "errorInvalidAssignment: aString\x0a\x09InvalidAssignmentError new\x0a\x09\x09variableName: aString;\x0a\x09\x09signal",
  623. messageSends: ["variableName:", "signal", "new"],
  624. referencedClasses: ["InvalidAssignmentError"]
  625. }),
  626. smalltalk.SemanticAnalyzer);
  627. smalltalk.addMethod(
  628. "_errorShadowingVariable_",
  629. smalltalk.method({
  630. selector: "errorShadowingVariable:",
  631. category: 'error handling',
  632. fn: function (aString) {
  633. var self=this;
  634. (function($rec){smalltalk.send($rec, "_variableName_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.ShadowingVariableError || ShadowingVariableError), "_new", []));
  635. return self;},
  636. args: ["aString"],
  637. source: "errorShadowingVariable: aString\x0a\x09ShadowingVariableError new\x0a\x09\x09variableName: aString;\x0a\x09\x09signal",
  638. messageSends: ["variableName:", "signal", "new"],
  639. referencedClasses: ["ShadowingVariableError"]
  640. }),
  641. smalltalk.SemanticAnalyzer);
  642. smalltalk.addMethod(
  643. "_errorUnknownVariable_",
  644. smalltalk.method({
  645. selector: "errorUnknownVariable:",
  646. category: 'error handling',
  647. fn: function (aNode) {
  648. var self=this;
  649. ((($receiver = smalltalk.send(self, "_allowUnknownVariables", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(smalltalk.send(self['@currentScope'], "_methodScope", []), "_unknownVariables", []), "_add_", [smalltalk.send(aNode, "_value", [])]);})() : (function(){return (function($rec){smalltalk.send($rec, "_variableName_", [smalltalk.send(aNode, "_value", [])]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.UnknownVariableError || UnknownVariableError), "_new", []));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(self['@currentScope'], "_methodScope", []), "_unknownVariables", []), "_add_", [smalltalk.send(aNode, "_value", [])]);}), (function(){return (function($rec){smalltalk.send($rec, "_variableName_", [smalltalk.send(aNode, "_value", [])]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.UnknownVariableError || UnknownVariableError), "_new", []));})]));
  650. return self;},
  651. args: ["aNode"],
  652. source: "errorUnknownVariable: aNode\x0a\x09self allowUnknownVariables \x0a\x09\x09ifTrue: [ currentScope methodScope unknownVariables add: aNode value ]\x0a\x09\x09ifFalse: [ \x0a\x09\x09\x09UnknownVariableError new\x0a\x09\x09\x09\x09variableName: aNode value;\x0a\x09\x09\x09\x09signal ]",
  653. messageSends: ["ifTrue:ifFalse:", "allowUnknownVariables", "add:", "unknownVariables", "methodScope", "value", "variableName:", "signal", "new"],
  654. referencedClasses: ["UnknownVariableError"]
  655. }),
  656. smalltalk.SemanticAnalyzer);
  657. smalltalk.addMethod(
  658. "_messageSends",
  659. smalltalk.method({
  660. selector: "messageSends",
  661. category: 'accessing',
  662. fn: function () {
  663. var self=this;
  664. return (($receiver = self['@messageSends']) == nil || $receiver == undefined) ? (function(){return (self['@messageSends']=smalltalk.send((smalltalk.Set || Set), "_new", []));})() : $receiver;
  665. return self;},
  666. args: [],
  667. source: "messageSends\x0a\x09^ messageSends ifNil: [ messageSends := Set new ]",
  668. messageSends: ["ifNil:", "new"],
  669. referencedClasses: ["Set"]
  670. }),
  671. smalltalk.SemanticAnalyzer);
  672. smalltalk.addMethod(
  673. "_newBlockScope",
  674. smalltalk.method({
  675. selector: "newBlockScope",
  676. category: 'factory',
  677. fn: function () {
  678. var self=this;
  679. return smalltalk.send(self, "_newScopeOfClass_", [(smalltalk.LexicalScope || LexicalScope)]);
  680. return self;},
  681. args: [],
  682. source: "newBlockScope\x0a\x09^ self newScopeOfClass: LexicalScope",
  683. messageSends: ["newScopeOfClass:"],
  684. referencedClasses: ["LexicalScope"]
  685. }),
  686. smalltalk.SemanticAnalyzer);
  687. smalltalk.addMethod(
  688. "_newMethodScope",
  689. smalltalk.method({
  690. selector: "newMethodScope",
  691. category: 'factory',
  692. fn: function () {
  693. var self=this;
  694. return smalltalk.send(self, "_newScopeOfClass_", [(smalltalk.MethodLexicalScope || MethodLexicalScope)]);
  695. return self;},
  696. args: [],
  697. source: "newMethodScope\x0a\x09^ self newScopeOfClass: MethodLexicalScope",
  698. messageSends: ["newScopeOfClass:"],
  699. referencedClasses: ["MethodLexicalScope"]
  700. }),
  701. smalltalk.SemanticAnalyzer);
  702. smalltalk.addMethod(
  703. "_newScopeOfClass_",
  704. smalltalk.method({
  705. selector: "newScopeOfClass:",
  706. category: 'factory',
  707. fn: function (aLexicalScopeClass) {
  708. var self=this;
  709. return (function($rec){smalltalk.send($rec, "_outerScope_", [self['@currentScope']]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(aLexicalScopeClass, "_new", []));
  710. return self;},
  711. args: ["aLexicalScopeClass"],
  712. source: "newScopeOfClass: aLexicalScopeClass\x0a\x09^ aLexicalScopeClass new \x0a\x09\x09outerScope: currentScope;\x0a\x09\x09yourself",
  713. messageSends: ["outerScope:", "yourself", "new"],
  714. referencedClasses: []
  715. }),
  716. smalltalk.SemanticAnalyzer);
  717. smalltalk.addMethod(
  718. "_popScope",
  719. smalltalk.method({
  720. selector: "popScope",
  721. category: 'scope',
  722. fn: function () {
  723. var self=this;
  724. (($receiver = self['@currentScope']) != nil && $receiver != undefined) ? (function(){return (self['@currentScope']=smalltalk.send(self['@currentScope'], "_outerScope", []));})() : nil;
  725. return self;},
  726. args: [],
  727. source: "popScope\x0a\x09currentScope ifNotNil: [\x0a\x09\x09currentScope := currentScope outerScope ]",
  728. messageSends: ["ifNotNil:", "outerScope"],
  729. referencedClasses: []
  730. }),
  731. smalltalk.SemanticAnalyzer);
  732. smalltalk.addMethod(
  733. "_pseudoVariables",
  734. smalltalk.method({
  735. selector: "pseudoVariables",
  736. category: 'accessing',
  737. fn: function () {
  738. var self=this;
  739. return ["self", "super", "true", "false", "nil", "thisContext"];
  740. return self;},
  741. args: [],
  742. source: "pseudoVariables\x0a\x09^#('self' 'super' 'true' 'false' 'nil' 'thisContext')",
  743. messageSends: [],
  744. referencedClasses: []
  745. }),
  746. smalltalk.SemanticAnalyzer);
  747. smalltalk.addMethod(
  748. "_pushScope_",
  749. smalltalk.method({
  750. selector: "pushScope:",
  751. category: 'scope',
  752. fn: function (aScope) {
  753. var self=this;
  754. smalltalk.send(aScope, "_outerScope_", [self['@currentScope']]);
  755. (self['@currentScope']=aScope);
  756. return self;},
  757. args: ["aScope"],
  758. source: "pushScope: aScope\x0a\x09aScope outerScope: currentScope.\x0a\x09currentScope := aScope",
  759. messageSends: ["outerScope:"],
  760. referencedClasses: []
  761. }),
  762. smalltalk.SemanticAnalyzer);
  763. smalltalk.addMethod(
  764. "_theClass",
  765. smalltalk.method({
  766. selector: "theClass",
  767. category: 'accessing',
  768. fn: function () {
  769. var self=this;
  770. return self['@theClass'];
  771. return self;},
  772. args: [],
  773. source: "theClass\x0a\x09^ theClass",
  774. messageSends: [],
  775. referencedClasses: []
  776. }),
  777. smalltalk.SemanticAnalyzer);
  778. smalltalk.addMethod(
  779. "_theClass_",
  780. smalltalk.method({
  781. selector: "theClass:",
  782. category: 'accessing',
  783. fn: function (aClass) {
  784. var self=this;
  785. (self['@theClass']=aClass);
  786. return self;},
  787. args: ["aClass"],
  788. source: "theClass: aClass\x0a\x09theClass := aClass",
  789. messageSends: [],
  790. referencedClasses: []
  791. }),
  792. smalltalk.SemanticAnalyzer);
  793. smalltalk.addMethod(
  794. "_validateVariableScope_",
  795. smalltalk.method({
  796. selector: "validateVariableScope:",
  797. category: 'scope',
  798. fn: function (aString) {
  799. var self=this;
  800. (($receiver = smalltalk.send(self['@currentScope'], "_lookupVariable_", [aString])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self, "_errorShadowingVariable_", [aString]);})() : nil;
  801. return self;},
  802. args: ["aString"],
  803. source: "validateVariableScope: aString\x0a\x09\x22Validate the variable scope in by doing a recursive lookup, up to the method scope\x22\x0a\x0a\x09(currentScope lookupVariable: aString) ifNotNil: [\x0a\x09\x09self errorShadowingVariable: aString ]",
  804. messageSends: ["ifNotNil:", "lookupVariable:", "errorShadowingVariable:"],
  805. referencedClasses: []
  806. }),
  807. smalltalk.SemanticAnalyzer);
  808. smalltalk.addMethod(
  809. "_visitAssignmentNode_",
  810. smalltalk.method({
  811. selector: "visitAssignmentNode:",
  812. category: 'visiting',
  813. fn: function (aNode) {
  814. var self=this;
  815. ((($receiver = smalltalk.send(smalltalk.send(self, "_pseudoVariables", []), "_includes_", [smalltalk.send(smalltalk.send(aNode, "_left", []), "_value", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self, "_errorInvalidAssignment_", [smalltalk.send(aNode, "_left", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(self, "_errorInvalidAssignment_", [smalltalk.send(aNode, "_left", [])]);})]));
  816. smalltalk.send(smalltalk.send(aNode, "_left", []), "_beAssigned", []);
  817. smalltalk.send(smalltalk.send(aNode, "_right", []), "_beUsed", []);
  818. smalltalk.send(self, "_visitAssignmentNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  819. return self;},
  820. args: ["aNode"],
  821. source: "visitAssignmentNode: aNode\x0a\x09(self pseudoVariables includes: aNode left value) ifTrue: [\x0a\x09\x09self errorInvalidAssignment: aNode left ].\x0a\x09aNode left beAssigned.\x0a\x09aNode right beUsed.\x0a\x09super visitAssignmentNode: aNode",
  822. messageSends: ["ifTrue:", "includes:", "pseudoVariables", "value", "left", "errorInvalidAssignment:", "beAssigned", "beUsed", "right", "visitAssignmentNode:"],
  823. referencedClasses: []
  824. }),
  825. smalltalk.SemanticAnalyzer);
  826. smalltalk.addMethod(
  827. "_visitBlockNode_",
  828. smalltalk.method({
  829. selector: "visitBlockNode:",
  830. category: 'visiting',
  831. fn: function (aNode) {
  832. var self=this;
  833. smalltalk.send(self, "_pushScope_", [smalltalk.send(self, "_newBlockScope", [])]);
  834. smalltalk.send(aNode, "_scope_", [self['@currentScope']]);
  835. smalltalk.send(smalltalk.send(aNode, "_parameters", []), "_do_", [(function(each){smalltalk.send(self, "_validateVariableScope_", [each]);return smalltalk.send(self['@currentScope'], "_addArg_", [each]);})]);
  836. smalltalk.send(self, "_visitBlockNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  837. smalltalk.send(self, "_popScope", []);
  838. return self;},
  839. args: ["aNode"],
  840. source: "visitBlockNode: aNode\x0a\x09self pushScope: self newBlockScope.\x0a\x09aNode scope: currentScope.\x0a\x09\x0a\x09aNode parameters do: [ :each | \x0a\x09\x09self validateVariableScope: each.\x0a\x09\x09currentScope addArg: each ].\x0a\x0a\x09super visitBlockNode: aNode.\x0a\x09self popScope",
  841. messageSends: ["pushScope:", "newBlockScope", "scope:", "do:", "parameters", "validateVariableScope:", "addArg:", "visitBlockNode:", "popScope"],
  842. referencedClasses: []
  843. }),
  844. smalltalk.SemanticAnalyzer);
  845. smalltalk.addMethod(
  846. "_visitClassReferenceNode_",
  847. smalltalk.method({
  848. selector: "visitClassReferenceNode:",
  849. category: 'visiting',
  850. fn: function (aNode) {
  851. var self=this;
  852. smalltalk.send(smalltalk.send(self, "_classReferences", []), "_add_", [smalltalk.send(aNode, "_value", [])]);
  853. smalltalk.send(aNode, "_binding_", [(function($rec){smalltalk.send($rec, "_name_", [smalltalk.send(aNode, "_value", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.ClassRefVar || ClassRefVar), "_new", []))]);
  854. return self;},
  855. args: ["aNode"],
  856. source: "visitClassReferenceNode: aNode\x0a\x09self classReferences add: aNode value.\x0a\x09aNode binding: (ClassRefVar new name: aNode value; yourself)",
  857. messageSends: ["add:", "classReferences", "value", "binding:", "name:", "yourself", "new"],
  858. referencedClasses: ["ClassRefVar"]
  859. }),
  860. smalltalk.SemanticAnalyzer);
  861. smalltalk.addMethod(
  862. "_visitMethodNode_",
  863. smalltalk.method({
  864. selector: "visitMethodNode:",
  865. category: 'visiting',
  866. fn: function (aNode) {
  867. var self=this;
  868. smalltalk.send(self, "_pushScope_", [smalltalk.send(self, "_newMethodScope", [])]);
  869. smalltalk.send(aNode, "_scope_", [self['@currentScope']]);
  870. smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_allInstanceVariableNames", []), "_do_", [(function(each){return smalltalk.send(self['@currentScope'], "_addIVar_", [each]);})]);
  871. smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_", [(function(each){smalltalk.send(self, "_validateVariableScope_", [each]);return smalltalk.send(self['@currentScope'], "_addArg_", [each]);})]);
  872. smalltalk.send(self, "_visitMethodNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  873. (function($rec){smalltalk.send($rec, "_classReferences_", [smalltalk.send(self, "_classReferences", [])]);return smalltalk.send($rec, "_messageSends_", [smalltalk.send(self, "_messageSends", [])]);})(aNode);
  874. smalltalk.send(self, "_popScope", []);
  875. return self;},
  876. args: ["aNode"],
  877. source: "visitMethodNode: aNode\x0a\x09self pushScope: self newMethodScope.\x0a\x09aNode scope: currentScope.\x0a\x0a\x09self theClass allInstanceVariableNames do: [:each | \x0a\x09\x09currentScope addIVar: each ].\x0a\x09aNode arguments do: [ :each | \x0a\x09\x09self validateVariableScope: each.\x0a\x09\x09currentScope addArg: each ].\x0a\x0a\x09super visitMethodNode: aNode.\x0a\x0a\x09aNode \x0a\x09\x09classReferences: self classReferences;\x0a\x09\x09messageSends: self messageSends.\x0a\x09self popScope",
  878. messageSends: ["pushScope:", "newMethodScope", "scope:", "do:", "allInstanceVariableNames", "theClass", "addIVar:", "arguments", "validateVariableScope:", "addArg:", "visitMethodNode:", "classReferences:", "classReferences", "messageSends:", "messageSends", "popScope"],
  879. referencedClasses: []
  880. }),
  881. smalltalk.SemanticAnalyzer);
  882. smalltalk.addMethod(
  883. "_visitReturnNode_",
  884. smalltalk.method({
  885. selector: "visitReturnNode:",
  886. category: 'visiting',
  887. fn: function (aNode) {
  888. var self=this;
  889. ((($receiver = smalltalk.send(self['@currentScope'], "_isMethodScope", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){smalltalk.send(smalltalk.send(self['@currentScope'], "_methodScope", []), "_nonLocalReturn_", [true]);return smalltalk.send(aNode, "_nonLocalReturn_", [true]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){smalltalk.send(smalltalk.send(self['@currentScope'], "_methodScope", []), "_nonLocalReturn_", [true]);return smalltalk.send(aNode, "_nonLocalReturn_", [true]);})]));
  890. smalltalk.send(smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_first", []), "_beUsed", []);
  891. smalltalk.send(self, "_visitReturnNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  892. return self;},
  893. args: ["aNode"],
  894. source: "visitReturnNode: aNode\x0a\x09currentScope isMethodScope ifFalse: [\x0a\x09\x09currentScope methodScope nonLocalReturn: true.\x0a\x09\x09aNode nonLocalReturn: true ].\x0a\x09aNode nodes first beUsed.\x0a\x09super visitReturnNode: aNode",
  895. messageSends: ["ifFalse:", "isMethodScope", "nonLocalReturn:", "methodScope", "beUsed", "first", "nodes", "visitReturnNode:"],
  896. referencedClasses: []
  897. }),
  898. smalltalk.SemanticAnalyzer);
  899. smalltalk.addMethod(
  900. "_visitSendNode_",
  901. smalltalk.method({
  902. selector: "visitSendNode:",
  903. category: 'visiting',
  904. fn: function (aNode) {
  905. var self=this;
  906. smalltalk.send(smalltalk.send(self, "_messageSends", []), "_add_", [smalltalk.send(aNode, "_selector", [])]);
  907. smalltalk.send(smalltalk.send(aNode, "_receiver", []), "_beUsed", []);
  908. smalltalk.send(smalltalk.send(aNode, "_arguments", []), "_do_", [(function(each){return smalltalk.send(each, "_beUsed", []);})]);
  909. smalltalk.send(self, "_visitSendNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  910. return self;},
  911. args: ["aNode"],
  912. source: "visitSendNode: aNode\x0a\x09self messageSends add: aNode selector.\x0a\x09aNode receiver beUsed.\x0a\x09aNode arguments do: [ :each |\x0a\x09\x09each beUsed ].\x0a\x09super visitSendNode: aNode",
  913. messageSends: ["add:", "messageSends", "selector", "beUsed", "receiver", "do:", "arguments", "visitSendNode:"],
  914. referencedClasses: []
  915. }),
  916. smalltalk.SemanticAnalyzer);
  917. smalltalk.addMethod(
  918. "_visitSequenceNode_",
  919. smalltalk.method({
  920. selector: "visitSequenceNode:",
  921. category: 'visiting',
  922. fn: function (aNode) {
  923. var self=this;
  924. smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){smalltalk.send(self, "_validateVariableScope_", [each]);return smalltalk.send(self['@currentScope'], "_addTemp_", [each]);})]);
  925. smalltalk.send(self, "_visitSequenceNode_", [aNode], smalltalk.SemanticAnalyzer.superclass || nil);
  926. return self;},
  927. args: ["aNode"],
  928. source: "visitSequenceNode: aNode\x0a\x09aNode temps do: [ :each | \x0a\x09\x09self validateVariableScope: each.\x0a\x09\x09currentScope addTemp: each ].\x0a\x0a\x09super visitSequenceNode: aNode",
  929. messageSends: ["do:", "temps", "validateVariableScope:", "addTemp:", "visitSequenceNode:"],
  930. referencedClasses: []
  931. }),
  932. smalltalk.SemanticAnalyzer);
  933. smalltalk.addMethod(
  934. "_visitVariableNode_",
  935. smalltalk.method({
  936. selector: "visitVariableNode:",
  937. category: 'visiting',
  938. fn: function (aNode) {
  939. var self=this;
  940. smalltalk.send(aNode, "_binding_", [(($receiver = smalltalk.send(self['@currentScope'], "_lookupVariable_", [aNode])) == nil || $receiver == undefined) ? (function(){smalltalk.send(self, "_errorUnknownVariable_", [aNode]);return (function($rec){smalltalk.send($rec, "_name_", [smalltalk.send(aNode, "_value", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.UnknownVar || UnknownVar), "_new", []));})() : $receiver]);
  941. return self;},
  942. args: ["aNode"],
  943. source: "visitVariableNode: aNode\x0a\x09\x22Bind a ScopeVar to aNode by doing a lookup in the current scope.\x0a\x09If no ScopeVar is found, bind a UnknowVar and throw an error\x22\x0a\x0a\x09aNode binding: ((currentScope lookupVariable: aNode) ifNil: [ \x0a\x09\x09self errorUnknownVariable: aNode.\x0a\x09\x09UnknownVar new name: aNode value; yourself ])",
  944. messageSends: ["binding:", "ifNil:", "lookupVariable:", "errorUnknownVariable:", "name:", "value", "yourself", "new"],
  945. referencedClasses: ["UnknownVar"]
  946. }),
  947. smalltalk.SemanticAnalyzer);
  948. smalltalk.addMethod(
  949. "_on_",
  950. smalltalk.method({
  951. selector: "on:",
  952. category: 'instance creation',
  953. fn: function (aClass) {
  954. var self=this;
  955. return (function($rec){smalltalk.send($rec, "_theClass_", [aClass]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
  956. return self;},
  957. args: ["aClass"],
  958. source: "on: aClass\x0a\x09^ self new\x0a\x09\x09theClass: aClass;\x0a\x09\x09yourself",
  959. messageSends: ["theClass:", "yourself", "new"],
  960. referencedClasses: []
  961. }),
  962. smalltalk.SemanticAnalyzer.klass);
  963. smalltalk.addClass('SemanticError', smalltalk.Error, [], 'Compiler-Semantic');
  964. smalltalk.SemanticError.comment="I represent an abstract semantic error thrown by the SemanticAnalyzer.\x0aSemantic errors can be unknown variable errors, etc.\x0aSee my subclasses for concrete errors.\x0a\x0aThe IDE should catch instances of Semantic error to deal with them when compiling"
  965. smalltalk.addClass('InvalidAssignmentError', smalltalk.SemanticError, ['variableName'], 'Compiler-Semantic');
  966. smalltalk.InvalidAssignmentError.comment="I get signaled when a pseudo variable gets assigned."
  967. smalltalk.addMethod(
  968. "_variableName",
  969. smalltalk.method({
  970. selector: "variableName",
  971. category: 'accessing',
  972. fn: function () {
  973. var self=this;
  974. return self['@variableName'];
  975. return self;},
  976. args: [],
  977. source: "variableName\x0a\x09^ variableName",
  978. messageSends: [],
  979. referencedClasses: []
  980. }),
  981. smalltalk.InvalidAssignmentError);
  982. smalltalk.addMethod(
  983. "_variableName_",
  984. smalltalk.method({
  985. selector: "variableName:",
  986. category: 'accessing',
  987. fn: function (aString) {
  988. var self=this;
  989. (self['@variableName']=aString);
  990. return self;},
  991. args: ["aString"],
  992. source: "variableName: aString\x0a\x09variableName := aString",
  993. messageSends: [],
  994. referencedClasses: []
  995. }),
  996. smalltalk.InvalidAssignmentError);
  997. smalltalk.addClass('ShadowingVariableError', smalltalk.SemanticError, ['variableName'], 'Compiler-Semantic');
  998. smalltalk.ShadowingVariableError.comment="I get signaled when a variable in a block or method scope shadows a variable of the same name in an outer scope."
  999. smalltalk.addMethod(
  1000. "_variableName",
  1001. smalltalk.method({
  1002. selector: "variableName",
  1003. category: 'accessing',
  1004. fn: function () {
  1005. var self=this;
  1006. return self['@variableName'];
  1007. return self;},
  1008. args: [],
  1009. source: "variableName\x0a\x09^ variableName",
  1010. messageSends: [],
  1011. referencedClasses: []
  1012. }),
  1013. smalltalk.ShadowingVariableError);
  1014. smalltalk.addMethod(
  1015. "_variableName_",
  1016. smalltalk.method({
  1017. selector: "variableName:",
  1018. category: 'accessing',
  1019. fn: function (aString) {
  1020. var self=this;
  1021. (self['@variableName']=aString);
  1022. return self;},
  1023. args: ["aString"],
  1024. source: "variableName: aString\x0a\x09variableName := aString",
  1025. messageSends: [],
  1026. referencedClasses: []
  1027. }),
  1028. smalltalk.ShadowingVariableError);
  1029. smalltalk.addClass('UnknownVariableError', smalltalk.SemanticError, ['variableName'], 'Compiler-Semantic');
  1030. smalltalk.UnknownVariableError.comment="I get signaled when a variable is not defined.\x0aThe default behavior is to allow it, as this is how Amber currently is able to seamlessly send messages to JavaScript objects."
  1031. smalltalk.addMethod(
  1032. "_variableName",
  1033. smalltalk.method({
  1034. selector: "variableName",
  1035. category: 'accessing',
  1036. fn: function () {
  1037. var self=this;
  1038. return self['@variableName'];
  1039. return self;},
  1040. args: [],
  1041. source: "variableName\x0a\x09^ variableName",
  1042. messageSends: [],
  1043. referencedClasses: []
  1044. }),
  1045. smalltalk.UnknownVariableError);
  1046. smalltalk.addMethod(
  1047. "_variableName_",
  1048. smalltalk.method({
  1049. selector: "variableName:",
  1050. category: 'accessing',
  1051. fn: function (aString) {
  1052. var self=this;
  1053. (self['@variableName']=aString);
  1054. return self;},
  1055. args: ["aString"],
  1056. source: "variableName: aString\x0a\x09variableName := aString",
  1057. messageSends: [],
  1058. referencedClasses: []
  1059. }),
  1060. smalltalk.UnknownVariableError);