resin 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/amber/css/amber-normalize.css +73 -73
  2. data/amber/css/amber-normalize.less +1 -1
  3. data/amber/css/amber.css +106 -106
  4. data/amber/css/helios.css +242 -0
  5. data/amber/images/hsplitter.png +0 -0
  6. data/amber/images/vsplitter.png +0 -0
  7. data/amber/js/Benchfib.deploy.js +116 -38
  8. data/amber/js/Benchfib.js +120 -42
  9. data/amber/js/Canvas.deploy.js +674 -403
  10. data/amber/js/Canvas.js +682 -411
  11. data/amber/js/Compiler-AST.deploy.js +1150 -0
  12. data/amber/js/Compiler-AST.js +1591 -0
  13. data/amber/js/Compiler-Core.deploy.js +1562 -0
  14. data/amber/js/Compiler-Core.js +1972 -0
  15. data/amber/js/Compiler-Exceptions.deploy.js +114 -0
  16. data/amber/js/Compiler-Exceptions.js +161 -0
  17. data/amber/js/Compiler-IR.deploy.js +2326 -0
  18. data/amber/js/Compiler-IR.js +3146 -0
  19. data/amber/js/Compiler-Inlining.deploy.js +1147 -0
  20. data/amber/js/Compiler-Inlining.js +1514 -0
  21. data/amber/js/Compiler-Semantic.deploy.js +1207 -0
  22. data/amber/js/Compiler-Semantic.js +1628 -0
  23. data/amber/js/Compiler-Tests.deploy.js +646 -60
  24. data/amber/js/Compiler-Tests.js +843 -82
  25. data/amber/js/Compiler.deploy.js +1097 -159
  26. data/amber/js/Compiler.js +1414 -161
  27. data/amber/js/Examples.deploy.js +31 -15
  28. data/amber/js/Examples.js +33 -17
  29. data/amber/js/Helios-Announcements.deploy.js +127 -0
  30. data/amber/js/Helios-Announcements.js +157 -0
  31. data/amber/js/Helios-Browser.deploy.js +1473 -0
  32. data/amber/js/Helios-Browser.js +1953 -0
  33. data/amber/js/Helios-Commands.deploy.js +403 -0
  34. data/amber/js/Helios-Commands.js +563 -0
  35. data/amber/js/Helios-Core.deploy.js +1070 -0
  36. data/amber/js/Helios-Core.js +1445 -0
  37. data/amber/js/Helios-Environments.deploy.js +132 -0
  38. data/amber/js/Helios-Environments.js +179 -0
  39. data/amber/js/Helios-Inspector.deploy.js +855 -0
  40. data/amber/js/Helios-Inspector.js +1155 -0
  41. data/amber/js/Helios-KeyBindings.deploy.js +753 -0
  42. data/amber/js/Helios-KeyBindings.js +1023 -0
  43. data/amber/js/Helios-Layout.deploy.js +383 -0
  44. data/amber/js/Helios-Layout.js +523 -0
  45. data/amber/js/Helios-Workspace.deploy.js +799 -0
  46. data/amber/js/Helios-Workspace.js +1074 -0
  47. data/amber/js/IDE.deploy.js +2541 -1490
  48. data/amber/js/IDE.js +2721 -1660
  49. data/amber/js/Importer-Exporter.deploy.js +671 -0
  50. data/amber/js/Importer-Exporter.js +816 -0
  51. data/amber/js/Kernel-Announcements.deploy.js +137 -20
  52. data/amber/js/Kernel-Announcements.js +176 -22
  53. data/amber/js/Kernel-Classes.deploy.js +555 -168
  54. data/amber/js/Kernel-Classes.js +662 -205
  55. data/amber/js/Kernel-Collections.deploy.js +1403 -618
  56. data/amber/js/Kernel-Collections.js +1545 -690
  57. data/amber/js/Kernel-Exceptions.deploy.js +109 -45
  58. data/amber/js/Kernel-Exceptions.js +123 -49
  59. data/amber/js/Kernel-Methods.deploy.js +196 -81
  60. data/amber/js/Kernel-Methods.js +214 -89
  61. data/amber/js/Kernel-Objects.deploy.js +1542 -1117
  62. data/amber/js/Kernel-Objects.js +1593 -1148
  63. data/amber/js/Kernel-Tests.deploy.js +1725 -772
  64. data/amber/js/Kernel-Tests.js +2301 -1123
  65. data/amber/js/Kernel-Transcript.deploy.js +23 -25
  66. data/amber/js/Kernel-Transcript.js +24 -26
  67. data/amber/js/SUnit.deploy.js +204 -131
  68. data/amber/js/SUnit.js +222 -139
  69. data/amber/js/Spaces.deploy.js +240 -0
  70. data/amber/js/Spaces.js +326 -0
  71. data/amber/js/amber.js +26 -7
  72. data/amber/js/boot.js +65 -47
  73. data/amber/js/init.js +1 -1
  74. data/amber/js/lib/CodeMirror/amber.css +21 -21
  75. data/amber/js/lib/CodeMirror/codemirror.css +119 -13
  76. data/amber/js/lib/CodeMirror/codemirror.js +2219 -1220
  77. data/amber/js/lib/CodeMirror/smalltalk.js +134 -129
  78. data/amber/js/lib/bootstrap/css/bootstrap.css +5837 -0
  79. data/amber/js/lib/bootstrap/css/bootstrap.min.css +841 -0
  80. data/amber/js/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  81. data/amber/js/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  82. data/amber/js/lib/bootstrap/js/bootstrap.js +2038 -0
  83. data/amber/js/lib/bootstrap/js/bootstrap.min.js +7 -0
  84. data/amber/js/lib/jQuery/jquery-1.8.2.min.js +2 -0
  85. data/amber/js/lib/jQuery/jquery-ui-1.8.24.custom.min.js +125 -0
  86. data/amber/st/Compiler-AST.st +505 -0
  87. data/amber/st/Compiler-Core.st +835 -0
  88. data/amber/st/Compiler-Exceptions.st +87 -0
  89. data/amber/st/Compiler-IR.st +1097 -0
  90. data/amber/st/Compiler-Inlining.st +650 -0
  91. data/amber/st/Compiler-Semantic.st +558 -0
  92. data/amber/st/Compiler-Tests.st +285 -381
  93. data/amber/st/Compiler.st +725 -2
  94. data/amber/st/Helios-Announcements.st +104 -0
  95. data/amber/st/Helios-Browser.st +708 -0
  96. data/amber/st/Helios-Commands.st +223 -0
  97. data/amber/st/Helios-Core.st +532 -0
  98. data/amber/st/Helios-Environments.st +98 -0
  99. data/amber/st/Helios-Inspector.st +367 -0
  100. data/amber/st/Helios-KeyBindings.st +337 -0
  101. data/amber/st/Helios-Layout.st +199 -0
  102. data/amber/st/Helios-Workspace.st +367 -0
  103. data/amber/st/IDE.st +75 -53
  104. data/amber/st/Importer-Exporter.st +386 -0
  105. data/amber/st/Kernel-Announcements.st +92 -0
  106. data/amber/st/Kernel-Classes.st +137 -15
  107. data/amber/st/Kernel-Collections.st +137 -47
  108. data/amber/st/Kernel-Exceptions.st +14 -0
  109. data/amber/st/Kernel-Methods.st +9 -1
  110. data/amber/st/Kernel-Objects.st +29 -5
  111. data/amber/st/Kernel-Tests.st +545 -199
  112. data/amber/st/SUnit.st +10 -0
  113. data/amber/st/Spaces.st +142 -0
  114. data/lib/resin/app.rb +1 -1
  115. metadata +86 -31
  116. data/amber/js/lib/jQuery/jquery-1.4.4.min.js +0 -167
  117. data/amber/js/lib/jQuery/jquery-1.6.4.min.js +0 -4
@@ -0,0 +1,558 @@
1
+ Smalltalk current createPackage: 'Compiler-Semantic' properties: #{}!
2
+ Object subclass: #LexicalScope
3
+ instanceVariableNames: 'node instruction temps args outerScope'
4
+ package: 'Compiler-Semantic'!
5
+ !LexicalScope commentStamp!
6
+ I represent a lexical scope where variable names are associated with ScopeVars
7
+ Instances are used for block scopes. Method scopes are instances of MethodLexicalScope.
8
+
9
+ I am attached to a ScopeVar and method/block nodes.
10
+ Each context (method/closure) get a fresh scope that inherits from its outer scope.!
11
+
12
+ !LexicalScope methodsFor: 'accessing'!
13
+
14
+ allVariableNames
15
+ ^ self args keys, self temps keys
16
+ !
17
+
18
+ args
19
+ ^ args ifNil: [ args := Dictionary new ]
20
+ !
21
+
22
+ bindingFor: aStringOrNode
23
+ ^ self pseudoVars at: aStringOrNode value ifAbsent: [
24
+ self args at: aStringOrNode value ifAbsent: [
25
+ self temps at: aStringOrNode value ifAbsent: [ nil ]]]
26
+ !
27
+
28
+ instruction
29
+ ^ instruction
30
+ !
31
+
32
+ instruction: anIRInstruction
33
+ instruction := anIRInstruction
34
+ !
35
+
36
+ lookupVariable: aNode
37
+ | lookup |
38
+ lookup := (self bindingFor: aNode).
39
+ lookup ifNil: [
40
+ lookup := self outerScope ifNotNil: [
41
+ (self outerScope lookupVariable: aNode) ]].
42
+ ^ lookup
43
+ !
44
+
45
+ methodScope
46
+ ^ self outerScope ifNotNil: [
47
+ self outerScope methodScope ]
48
+ !
49
+
50
+ node
51
+ "Answer the node in which I am defined"
52
+
53
+ ^ node
54
+ !
55
+
56
+ node: aNode
57
+ node := aNode
58
+ !
59
+
60
+ outerScope
61
+ ^ outerScope
62
+ !
63
+
64
+ outerScope: aLexicalScope
65
+ outerScope := aLexicalScope
66
+ !
67
+
68
+ pseudoVars
69
+ ^ self methodScope pseudoVars
70
+ !
71
+
72
+ scopeLevel
73
+ ^ (self outerScope
74
+ ifNil: [ 0 ]
75
+ ifNotNil: [ self outerScope scopeLevel ]) + 1
76
+ !
77
+
78
+ temps
79
+ ^ temps ifNil: [ temps := Dictionary new ]
80
+ ! !
81
+
82
+ !LexicalScope methodsFor: 'adding'!
83
+
84
+ addArg: aString
85
+ self args at: aString put: (ArgVar on: aString).
86
+ (self args at: aString) scope: self
87
+ !
88
+
89
+ addTemp: aString
90
+ self temps at: aString put: (TempVar on: aString).
91
+ (self temps at: aString) scope: self
92
+ ! !
93
+
94
+ !LexicalScope methodsFor: 'testing'!
95
+
96
+ canInlineNonLocalReturns
97
+ ^ self isInlined and: [ self outerScope canInlineNonLocalReturns ]
98
+ !
99
+
100
+ isBlockScope
101
+ ^ self isMethodScope not
102
+ !
103
+
104
+ isInlined
105
+ ^ self instruction isInlined
106
+ !
107
+
108
+ isMethodScope
109
+ ^ false
110
+ ! !
111
+
112
+ LexicalScope subclass: #MethodLexicalScope
113
+ instanceVariableNames: 'iVars pseudoVars unknownVariables localReturn nonLocalReturns'
114
+ package: 'Compiler-Semantic'!
115
+ !MethodLexicalScope commentStamp!
116
+ I represent a method scope.!
117
+
118
+ !MethodLexicalScope methodsFor: 'accessing'!
119
+
120
+ allVariableNames
121
+ ^ super allVariableNames, self iVars keys
122
+ !
123
+
124
+ bindingFor: aNode
125
+ ^ (super bindingFor: aNode) ifNil: [
126
+ self iVars at: aNode value ifAbsent: [ nil ]]
127
+ !
128
+
129
+ iVars
130
+ ^ iVars ifNil: [ iVars := Dictionary new ]
131
+ !
132
+
133
+ localReturn
134
+ ^ localReturn ifNil: [ false ]
135
+ !
136
+
137
+ localReturn: aBoolean
138
+ localReturn := aBoolean
139
+ !
140
+
141
+ methodScope
142
+ ^ self
143
+ !
144
+
145
+ nonLocalReturns
146
+ ^ nonLocalReturns ifNil: [ nonLocalReturns := OrderedCollection new ]
147
+ !
148
+
149
+ pseudoVars
150
+ pseudoVars ifNil: [
151
+ pseudoVars := Dictionary new.
152
+ Smalltalk current pseudoVariableNames do: [ :each |
153
+ pseudoVars at: each put: ((PseudoVar on: each)
154
+ scope: self methodScope;
155
+ yourself) ]].
156
+ ^ pseudoVars
157
+ !
158
+
159
+ unknownVariables
160
+ ^ unknownVariables ifNil: [ unknownVariables := OrderedCollection new ]
161
+ ! !
162
+
163
+ !MethodLexicalScope methodsFor: 'adding'!
164
+
165
+ addIVar: aString
166
+ self iVars at: aString put: (InstanceVar on: aString).
167
+ (self iVars at: aString) scope: self
168
+ !
169
+
170
+ addNonLocalReturn: aScope
171
+ self nonLocalReturns add: aScope
172
+ !
173
+
174
+ removeNonLocalReturn: aScope
175
+ self nonLocalReturns remove: aScope ifAbsent: []
176
+ ! !
177
+
178
+ !MethodLexicalScope methodsFor: 'testing'!
179
+
180
+ canInlineNonLocalReturns
181
+ ^ true
182
+ !
183
+
184
+ hasLocalReturn
185
+ ^ self localReturn
186
+ !
187
+
188
+ hasNonLocalReturn
189
+ ^ self nonLocalReturns notEmpty
190
+ !
191
+
192
+ isMethodScope
193
+ ^ true
194
+ ! !
195
+
196
+ Object subclass: #ScopeVar
197
+ instanceVariableNames: 'scope name'
198
+ package: 'Compiler-Semantic'!
199
+ !ScopeVar commentStamp!
200
+ I am an entry in a LexicalScope that gets associated with variable nodes of the same name.
201
+ There are 4 different subclasses of vars: temp vars, local vars, args, and unknown/global vars.!
202
+
203
+ !ScopeVar methodsFor: 'accessing'!
204
+
205
+ alias
206
+ ^ self name asVariableName
207
+ !
208
+
209
+ name
210
+ ^ name
211
+ !
212
+
213
+ name: aString
214
+ name := aString
215
+ !
216
+
217
+ scope
218
+ ^ scope
219
+ !
220
+
221
+ scope: aScope
222
+ scope := aScope
223
+ ! !
224
+
225
+ !ScopeVar methodsFor: 'testing'!
226
+
227
+ isArgVar
228
+ ^ false
229
+ !
230
+
231
+ isClassRefVar
232
+ ^ false
233
+ !
234
+
235
+ isInstanceVar
236
+ ^ false
237
+ !
238
+
239
+ isPseudoVar
240
+ ^ false
241
+ !
242
+
243
+ isTempVar
244
+ ^ false
245
+ !
246
+
247
+ isUnknownVar
248
+ ^ false
249
+ !
250
+
251
+ validateAssignment
252
+ (self isArgVar or: [ self isPseudoVar ]) ifTrue: [
253
+ InvalidAssignmentError new
254
+ variableName: self name;
255
+ signal]
256
+ ! !
257
+
258
+ !ScopeVar class methodsFor: 'instance creation'!
259
+
260
+ on: aString
261
+ ^ self new
262
+ name: aString;
263
+ yourself
264
+ ! !
265
+
266
+ ScopeVar subclass: #AliasVar
267
+ instanceVariableNames: 'node'
268
+ package: 'Compiler-Semantic'!
269
+ !AliasVar commentStamp!
270
+ I am an internally defined variable by the compiler!
271
+
272
+ !AliasVar methodsFor: 'accessing'!
273
+
274
+ node
275
+ ^ node
276
+ !
277
+
278
+ node: aNode
279
+ node := aNode
280
+ ! !
281
+
282
+ ScopeVar subclass: #ArgVar
283
+ instanceVariableNames: ''
284
+ package: 'Compiler-Semantic'!
285
+ !ArgVar commentStamp!
286
+ I am an argument of a method or block.!
287
+
288
+ !ArgVar methodsFor: 'testing'!
289
+
290
+ isArgVar
291
+ ^ true
292
+ ! !
293
+
294
+ ScopeVar subclass: #ClassRefVar
295
+ instanceVariableNames: ''
296
+ package: 'Compiler-Semantic'!
297
+ !ClassRefVar commentStamp!
298
+ I am an class reference variable!
299
+
300
+ !ClassRefVar methodsFor: 'accessing'!
301
+
302
+ alias
303
+ ^ '(smalltalk.', self name, ' || ', self name, ')'
304
+ ! !
305
+
306
+ !ClassRefVar methodsFor: 'testing'!
307
+
308
+ isClassRefVar
309
+ ^ true
310
+ ! !
311
+
312
+ ScopeVar subclass: #InstanceVar
313
+ instanceVariableNames: ''
314
+ package: 'Compiler-Semantic'!
315
+ !InstanceVar commentStamp!
316
+ I am an instance variable of a method or block.!
317
+
318
+ !InstanceVar methodsFor: 'testing'!
319
+
320
+ alias
321
+ ^ 'self["@', self name, '"]'
322
+ !
323
+
324
+ isInstanceVar
325
+ ^ true
326
+ ! !
327
+
328
+ ScopeVar subclass: #PseudoVar
329
+ instanceVariableNames: ''
330
+ package: 'Compiler-Semantic'!
331
+ !PseudoVar commentStamp!
332
+ I am an pseudo variable.
333
+
334
+ The five Smalltalk pseudo variables are: 'self', 'super', 'nil', 'true' and 'false'!
335
+
336
+ !PseudoVar methodsFor: 'accessing'!
337
+
338
+ alias
339
+ ^ self name
340
+ ! !
341
+
342
+ !PseudoVar methodsFor: 'testing'!
343
+
344
+ isPseudoVar
345
+ ^ true
346
+ ! !
347
+
348
+ ScopeVar subclass: #TempVar
349
+ instanceVariableNames: ''
350
+ package: 'Compiler-Semantic'!
351
+ !TempVar commentStamp!
352
+ I am an temporary variable of a method or block.!
353
+
354
+ !TempVar methodsFor: 'testing'!
355
+
356
+ isTempVar
357
+ ^ true
358
+ ! !
359
+
360
+ ScopeVar subclass: #UnknownVar
361
+ instanceVariableNames: ''
362
+ package: 'Compiler-Semantic'!
363
+ !UnknownVar commentStamp!
364
+ I am an unknown variable. Amber uses unknown variables as JavaScript globals!
365
+
366
+ !UnknownVar methodsFor: 'testing'!
367
+
368
+ isUnknownVar
369
+ ^ true
370
+ ! !
371
+
372
+ NodeVisitor subclass: #SemanticAnalyzer
373
+ instanceVariableNames: 'currentScope theClass classReferences messageSends'
374
+ package: 'Compiler-Semantic'!
375
+ !SemanticAnalyzer commentStamp!
376
+ I semantically analyze the abstract syntax tree and annotate it with informations such as non local returns and variable scopes.!
377
+
378
+ !SemanticAnalyzer methodsFor: 'accessing'!
379
+
380
+ classReferences
381
+ ^ classReferences ifNil: [ classReferences := Set new ]
382
+ !
383
+
384
+ messageSends
385
+ ^ messageSends ifNil: [ messageSends := Dictionary new ]
386
+ !
387
+
388
+ theClass
389
+ ^ theClass
390
+ !
391
+
392
+ theClass: aClass
393
+ theClass := aClass
394
+ ! !
395
+
396
+ !SemanticAnalyzer methodsFor: 'error handling'!
397
+
398
+ errorShadowingVariable: aString
399
+ ShadowingVariableError new
400
+ variableName: aString;
401
+ signal
402
+ !
403
+
404
+ errorUnknownVariable: aNode
405
+ "Throw an error if the variable is undeclared in the global JS scope (i.e. window)"
406
+
407
+ | notDefined |
408
+
409
+ notDefined := <eval('typeof ' + aNode._value() + ' == "undefined"')>.
410
+
411
+ notDefined
412
+ ifTrue: [
413
+ UnknownVariableError new
414
+ variableName: aNode value;
415
+ signal ]
416
+ ifFalse: [
417
+ currentScope methodScope unknownVariables add: aNode value. ]
418
+ ! !
419
+
420
+ !SemanticAnalyzer methodsFor: 'factory'!
421
+
422
+ newBlockScope
423
+ ^ self newScopeOfClass: LexicalScope
424
+ !
425
+
426
+ newMethodScope
427
+ ^ self newScopeOfClass: MethodLexicalScope
428
+ !
429
+
430
+ newScopeOfClass: aLexicalScopeClass
431
+ ^ aLexicalScopeClass new
432
+ outerScope: currentScope;
433
+ yourself
434
+ ! !
435
+
436
+ !SemanticAnalyzer methodsFor: 'scope'!
437
+
438
+ popScope
439
+ currentScope ifNotNil: [
440
+ currentScope := currentScope outerScope ]
441
+ !
442
+
443
+ pushScope: aScope
444
+ aScope outerScope: currentScope.
445
+ currentScope := aScope
446
+ !
447
+
448
+ validateVariableScope: aString
449
+ "Validate the variable scope in by doing a recursive lookup, up to the method scope"
450
+
451
+ (currentScope lookupVariable: aString) ifNotNil: [
452
+ self errorShadowingVariable: aString ]
453
+ ! !
454
+
455
+ !SemanticAnalyzer methodsFor: 'visiting'!
456
+
457
+ visitAssignmentNode: aNode
458
+ super visitAssignmentNode: aNode.
459
+ aNode left beAssigned
460
+ !
461
+
462
+ visitBlockNode: aNode
463
+ self pushScope: self newBlockScope.
464
+ aNode scope: currentScope.
465
+ currentScope node: aNode.
466
+
467
+ aNode parameters do: [ :each |
468
+ self validateVariableScope: each.
469
+ currentScope addArg: each ].
470
+
471
+ super visitBlockNode: aNode.
472
+ self popScope
473
+ !
474
+
475
+ visitCascadeNode: aNode
476
+ "Populate the receiver into all children"
477
+ aNode nodes do: [ :each |
478
+ each receiver: aNode receiver ].
479
+ super visitCascadeNode: aNode.
480
+ aNode nodes first superSend ifTrue: [
481
+ aNode nodes do: [ :each | each superSend: true ]]
482
+ !
483
+
484
+ visitClassReferenceNode: aNode
485
+ self classReferences add: aNode value.
486
+ aNode binding: (ClassRefVar new name: aNode value; yourself)
487
+ !
488
+
489
+ visitMethodNode: aNode
490
+ self pushScope: self newMethodScope.
491
+ aNode scope: currentScope.
492
+ currentScope node: aNode.
493
+
494
+ self theClass allInstanceVariableNames do: [:each |
495
+ currentScope addIVar: each ].
496
+ aNode arguments do: [ :each |
497
+ self validateVariableScope: each.
498
+ currentScope addArg: each ].
499
+
500
+ super visitMethodNode: aNode.
501
+
502
+ aNode
503
+ classReferences: self classReferences;
504
+ messageSends: self messageSends keys.
505
+ self popScope
506
+ !
507
+
508
+ visitReturnNode: aNode
509
+ aNode scope: currentScope.
510
+ currentScope isMethodScope
511
+ ifTrue: [ currentScope localReturn: true ]
512
+ ifFalse: [ currentScope methodScope addNonLocalReturn: currentScope ].
513
+ super visitReturnNode: aNode
514
+ !
515
+
516
+ visitSendNode: aNode
517
+
518
+ aNode receiver value = 'super'
519
+ ifTrue: [
520
+ aNode superSend: true.
521
+ aNode receiver value: 'self' ]
522
+ ifFalse: [ (IRSendInliner inlinedSelectors includes: aNode selector) ifTrue: [
523
+ aNode shouldBeInlined: true.
524
+ aNode receiver isValueNode ifFalse: [ aNode receiver shouldBeAliased: true ] ] ].
525
+
526
+ self messageSends at: aNode selector ifAbsentPut: [ Set new ].
527
+ (self messageSends at: aNode selector) add: aNode.
528
+
529
+ aNode index: (self messageSends at: aNode selector) size.
530
+
531
+ super visitSendNode: aNode
532
+ !
533
+
534
+ visitSequenceNode: aNode
535
+ aNode temps do: [ :each |
536
+ self validateVariableScope: each.
537
+ currentScope addTemp: each ].
538
+
539
+ super visitSequenceNode: aNode
540
+ !
541
+
542
+ visitVariableNode: aNode
543
+ "Bind a ScopeVar to aNode by doing a lookup in the current scope.
544
+ If no ScopeVar is found, bind a UnknowVar and throw an error"
545
+
546
+ aNode binding: ((currentScope lookupVariable: aNode) ifNil: [
547
+ self errorUnknownVariable: aNode.
548
+ UnknownVar new name: aNode value; yourself ])
549
+ ! !
550
+
551
+ !SemanticAnalyzer class methodsFor: 'instance creation'!
552
+
553
+ on: aClass
554
+ ^ self new
555
+ theClass: aClass;
556
+ yourself
557
+ ! !
558
+