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
@@ -1,137 +1,898 @@
1
1
  smalltalk.addPackage('Compiler-Tests', {});
2
- smalltalk.addClass('ImporterTest', smalltalk.TestCase, [], 'Compiler-Tests');
2
+ smalltalk.addClass('CodeGeneratorTest', smalltalk.TestCase, ['receiver'], 'Compiler-Tests');
3
3
  smalltalk.addMethod(
4
- "_bigChunkString",
4
+ "_codeGeneratorClass",
5
5
  smalltalk.method({
6
- selector: "bigChunkString",
7
- category: 'private',
8
- fn: function (){
9
- var self=this;
10
- return "Smalltalk current createPackage: 'Cypress-Definitions' properties: #{}!\x0aObject subclass: #CypressSnapshot\x0a\x09instanceVariableNames: 'definitions'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressSnapshot methodsFor: 'not yet classified'!\x0a\x0adefinitions: aDefinitions\x0a\x0a\x09definitions := aDefinitions\x0a!\x0a\x0adefinitions\x0a\x0a\x09^definitions\x0a! !\x0a\x0a!CypressSnapshot class methodsFor: 'not yet classified'!\x0a\x0adefinitions: aDefinitions\x0a\x0a\x09^(self new) definitions: aDefinitions\x0a! !\x0a\x0aObject subclass: #CypressPackage\x0a\x09instanceVariableNames: 'name'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressPackage methodsFor: 'not yet classified'!\x0a\x0a= other\x0a\x09^ other species = self species and: [other name sameAs: name]\x0a!\x0a\x0aname\x0a\x09^ name\x0a!\x0a\x0aname: aString\x0a\x09name := aString\x0a!\x0a\x0asnapshot\x0a\x09| package definitions name |\x0a\x09package := Package named: self name.\x0a\x09definitions := OrderedCollection new.\x0a\x09package sortedClasses do: [:cls |\x0a \x09definitions add: cls asCypressClassDefinition.\x0a cls methodDictionary values do: [:method |\x0a\x09\x09\x09(method category match: '^\x5c*') ifFalse: [ \x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]].\x0a cls class methodDictionary values do: [:method |\x0a\x09\x09\x09(method category match: '^\x5c*') ifFalse: [ \x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]]].\x0a\x09name := package name.\x0a\x09Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |\x0a\x09\x09each methodDictionary values do: [:method |\x0a\x09\x09\x09method category = ('*', name) ifTrue: [\x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]]].\x0a\x09^ CypressSnapshot definitions: definitions\x0a!\x0a\x0aprintString\x0a\x09^super printString, '(', name, ')'\x0a! !\x0a\x0aObject subclass: #CypressDefinition\x0a\x09instanceVariableNames: ''\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressDefinition methodsFor: 'not yet classified'!\x0a\x0a= aDefinition\x0a\x09^(aDefinition isKindOf: CypressDefinition) and: [self isRevisionOf: aDefinition]\x0a!\x0a\x0aisRevisionOf: aDefinition\x0a\x09^ (aDefinition isKindOf: CypressDefinition) and: [aDefinition description = self description]\x0a!\x0a\x0adescription\x0a\x09self subclassResponsibility\x0a!\x0a\x0aisSameRevisionAs: aDefinition\x0a\x09^ self = aDefinition\x0a! !\x0a\x0aObject subclass: #CypressPatch\x0a\x09instanceVariableNames: 'operations'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressPatch methodsFor: 'not yet classified'!\x0a\x0afromBase: baseSnapshot toTarget: targetSnapshot\x0a\x09| base target |\x09\x0a\x09operations := OrderedCollection new.\x0a\x09base := CypressDefinitionIndex definitions: baseSnapshot definitions.\x0a\x09target := CypressDefinitionIndex definitions: targetSnapshot definitions.\x0a\x09\x0a\x09target definitions do:\x0a\x09\x09[:t |\x0a\x09\x09base\x0a\x09\x09\x09definitionLike: t\x0a\x09\x09\x09ifPresent: [:b | (b isSameRevisionAs: t) ifFalse: [operations add: (CypressModification of: b to: t)]]\x0a\x09\x09\x09ifAbsent: [operations add: (CypressAddition of: t)]].\x0a\x09\x09\x0a\x09base definitions do:\x0a\x09\x09[:b |\x0a\x09\x09target\x0a\x09\x09\x09definitionLike: b\x0a\x09\x09\x09ifPresent: [:t | ]\x0a\x09\x09\x09ifAbsent: [operations add: (CypressRemoval of: b)]]\x0a!\x0a\x0aoperations\x0a\x0a\x09^operations\x0a! !\x0a\x0a!CypressPatch class methodsFor: 'not yet classified'!\x0a\x0afromBase: baseSnapshot toTarget: targetSnapshot\x0a\x09^ (self new)\x0a\x09\x09fromBase: baseSnapshot\x0a\x09\x09toTarget: targetSnapshot\x0a! !\x0a\x0aObject subclass: #CypressDefinitionIndex\x0a\x09instanceVariableNames: 'definitionMap'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressDefinitionIndex methodsFor: 'not yet classified'!\x0a\x0aadd: aDefinition\x0a\x09^ self definitionMap at: aDefinition description put: aDefinition\x0a!\x0a\x0aaddAll: aCollection\x0a\x09aCollection do: [:ea | self add: ea]\x0a!\x0a\x0adefinitionLike: aDefinition ifPresent: foundBlock ifAbsent: errorBlock\x0a\x09| definition |\x0a\x09definition := self definitionMap at: aDefinition description ifAbsent: [].\x0a\x09^ definition\x0a\x09\x09ifNil: errorBlock\x0a\x09\x09ifNotNil: [foundBlock value: definition]\x0a!\x0a\x0adefinitions\x0a\x09^self definitionMap values\x0a!\x0a\x0adefinitionMap\x0a\x09definitionMap ifNil: [ definitionMap := Dictionary new ].\x0a\x09^ definitionMap\x0a!\x0a\x0aremove: aDefinition\x0a\x09self definitionMap removeKey: aDefinition description ifAbsent: []\x0a! !\x0a\x0a!CypressDefinitionIndex class methodsFor: 'not yet classified'!\x0a\x0adefinitions: aCollection\x0a\x09^ self new addAll: aCollection\x0a! !\x0a\x0aObject subclass: #CypressPatchOperation\x0a\x09instanceVariableNames: ''\x0a\x09package: 'Cypress-Definitions'!\x0a\x0aCypressDefinition subclass: #CypressClassDefinition\x0a\x09instanceVariableNames: 'name superclassName category comment instVarNames classInstVarNames'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressClassDefinition methodsFor: 'not yet classified'!\x0a\x0aname: aClassName superclassName: aSuperclassName category: aCategory instVarNames: anInstanceVariableNames classInstVarNames: aClassInstanceVariableNames comment: aComment\x0a\x0a\x09name := aClassName.\x0a\x09superclassName := aSuperclassName.\x0a\x09category := aCategory.\x0a\x09instVarNames := anInstanceVariableNames.\x0a\x09classInstVarNames := aClassInstanceVariableNames.\x0a\x09comment := aComment\x0a!\x0a\x0a= aDefinition\x0a\x09^(super = aDefinition)\x0a\x09\x09and: [superclassName = aDefinition superclassName\x0a\x09\x09and: [category = aDefinition category\x0a\x09\x09and: [instVarNames = aDefinition instVarNames\x0a\x09\x09and: [classInstVarNames = aDefinition classInstVarNames\x0a\x09\x09and: [comment = aDefinition comment]]]]]\x0a!\x0a\x0asuperclassName\x0a\x0a\x09^superclassName\x0a!\x0a\x0aname\x0a\x0a\x09^name\x0a!\x0a\x0acategory\x0a\x0a\x09^category\x0a!\x0a\x0acomment\x0a\x0a\x09^comment\x0a!\x0a\x0adescription\x0a\x0a\x09^ Array with: name\x0a!\x0a\x0ainstVarNames\x0a\x0a\x09^instVarNames\x0a!\x0a\x0aclassInstVarNames\x0a\x0a\x09^classInstVarNames\x0a! !\x0a\x0a!CypressClassDefinition class methodsFor: 'not yet classified'!\x0a\x0aname: aClassName \x0asuperclassName: aSuperclassName\x0acategory: aCategory\x0ainstVarNames: anInstanceVariableNames\x0aclassInstVarNames: aClassInstanceVariableNames\x0acomment: aComment\x0a\x0a\x09^(self new) \x0a\x09\x09name: aClassName \x0a\x09\x09superclassName: aSuperclassName\x0a\x09\x09category: aCategory\x0a\x09\x09instVarNames: anInstanceVariableNames\x0a\x09\x09classInstVarNames: aClassInstanceVariableNames\x0a\x09\x09comment: aComment\x0a! !\x0a\x0aCypressDefinition subclass: #CypressMethodDefinition\x0a\x09instanceVariableNames: 'classIsMeta source category selector className'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressMethodDefinition methodsFor: 'not yet classified'!\x0a\x0aclassName: aName classIsMeta: isMetaclass selector: aSelector category: aCategory source: aSource\x0a\x0a\x09className := aName.\x0a\x09classIsMeta := isMetaclass.\x0a\x09selector := aSelector.\x0a\x09category := aCategory.\x0a\x09source := aSource.\x0a!\x0a\x0a= aDefinition\x0a ^ super = aDefinition\x0a and: [ aDefinition source = self source\x0a and: [ aDefinition category = self category ] ]\x0a!\x0a\x0asource\x0a\x0a\x09^source\x0a!\x0a\x0acategory\x0a\x0a\x09^category\x0a!\x0a\x0adescription\x0a\x09^ Array\x09\x0a\x09\x09with: className\x0a\x09\x09with: selector\x0a\x09\x09with: classIsMeta\x0a! !\x0a\x0a!CypressMethodDefinition class methodsFor: 'not yet classified'!\x0a\x0aclassName: aName\x0aclassIsMeta: isMetaclass\x0aselector: aSelector\x0acategory: aCategory\x0asource: aSource\x0a\x0a\x09^(self new)\x0a\x09\x09className: aName\x0a\x09\x09classIsMeta: isMetaclass\x0a\x09\x09selector: aSelector\x0a\x09\x09category: aCategory\x0a\x09\x09source: aSource\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressAddition\x0a\x09instanceVariableNames: 'definition'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressAddition methodsFor: 'not yet classified'!\x0a\x0adefinition: aDefinition\x0a\x0a\x09definition := aDefinition\x0a! !\x0a\x0a!CypressAddition class methodsFor: 'not yet classified'!\x0a\x0aof: aDefinition\x0a\x09^ self new definition: aDefinition\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressModification\x0a\x09instanceVariableNames: 'obsoletion modification'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressModification methodsFor: 'not yet classified'!\x0a\x0abase: base target: target\x0a\x0a\x09obsoletion := base.\x0a\x09modification := target.\x0a! !\x0a\x0a!CypressModification class methodsFor: 'not yet classified'!\x0a\x0aof: base to: target\x0a\x09^ self new base: base target: target\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressRemoval\x0a\x09instanceVariableNames: 'definition'\x0a\x09package: 'Cypress-Definitions'!\x0a\x0a!CypressRemoval methodsFor: 'not yet classified'!\x0a\x0adefinition: aDefinition\x0a\x0a\x09definition := aDefinition\x0a! !\x0a\x0a!CypressRemoval class methodsFor: 'not yet classified'!\x0a\x0aof: aDefinition\x0a\x09^ self new definition: aDefinition\x0a! !\x0a\x0a!Object methodsFor: '*Cypress-Definitions'!\x0a\x0aspecies\x0a\x0a\x09^self class\x0a! !\x0a\x0a!Class methodsFor: '*Cypress-Definitions'!\x0a\x0aasCypressClassDefinition\x0a\x09^CypressClassDefinition\x0a\x09\x09name: self name\x0a\x09\x09superclassName: self superclass name\x0a\x09\x09category: self category \x0a\x09\x09instVarNames: self instanceVariableNames\x0a\x09\x09classInstVarNames: self class instanceVariableNames\x0a\x09\x09comment: self comment\x0a! !\x0a\x0a!CompiledMethod methodsFor: '*Cypress-Definitions'!\x0a\x0aasCypressMethodDefinition\x0a\x0a\x09^CypressMethodDefinition \x0a \x09className: self methodClass name\x0a\x09\x09classIsMeta: self methodClass isMetaclass\x0a\x09\x09selector: self selector\x0a\x09\x09category: self category\x0a\x09\x09source: self source\x0a! !\x0a\x0a!CharacterArray methodsFor: '*Cypress-Definitions'!\x0a\x0asameAs: aString\x0a\x0a\x09^self asUppercase = aString asUppercase\x0a! !\x0a\x0a";
11
- return self;},
6
+ selector: "codeGeneratorClass",
7
+ category: 'accessing',
8
+ fn: function () {
9
+ var self = this;
10
+ return smalltalk.CodeGenerator || CodeGenerator;
11
+ },
12
12
  args: [],
13
- source: "bigChunkString\x0a\x0a\x09^'Smalltalk current createPackage: ''Cypress-Definitions'' properties: #{}!\x0aObject subclass: #CypressSnapshot\x0a\x09instanceVariableNames: ''definitions''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressSnapshot methodsFor: ''not yet classified''!\x0a\x0adefinitions: aDefinitions\x0a\x0a\x09definitions := aDefinitions\x0a!\x0a\x0adefinitions\x0a\x0a\x09^definitions\x0a! !\x0a\x0a!CypressSnapshot class methodsFor: ''not yet classified''!\x0a\x0adefinitions: aDefinitions\x0a\x0a\x09^(self new) definitions: aDefinitions\x0a! !\x0a\x0aObject subclass: #CypressPackage\x0a\x09instanceVariableNames: ''name''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressPackage methodsFor: ''not yet classified''!\x0a\x0a= other\x0a\x09^ other species = self species and: [other name sameAs: name]\x0a!\x0a\x0aname\x0a\x09^ name\x0a!\x0a\x0aname: aString\x0a\x09name := aString\x0a!\x0a\x0asnapshot\x0a\x09| package definitions name |\x0a\x09package := Package named: self name.\x0a\x09definitions := OrderedCollection new.\x0a\x09package sortedClasses do: [:cls |\x0a \x09definitions add: cls asCypressClassDefinition.\x0a cls methodDictionary values do: [:method |\x0a\x09\x09\x09(method category match: ''^\x5c*'') ifFalse: [ \x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]].\x0a cls class methodDictionary values do: [:method |\x0a\x09\x09\x09(method category match: ''^\x5c*'') ifFalse: [ \x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]]].\x0a\x09name := package name.\x0a\x09Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |\x0a\x09\x09each methodDictionary values do: [:method |\x0a\x09\x09\x09method category = (''*'', name) ifTrue: [\x0a\x09\x09\x09\x09definitions add: method asCypressMethodDefinition ]]].\x0a\x09^ CypressSnapshot definitions: definitions\x0a!\x0a\x0aprintString\x0a\x09^super printString, ''('', name, '')''\x0a! !\x0a\x0aObject subclass: #CypressDefinition\x0a\x09instanceVariableNames: ''''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressDefinition methodsFor: ''not yet classified''!\x0a\x0a= aDefinition\x0a\x09^(aDefinition isKindOf: CypressDefinition) and: [self isRevisionOf: aDefinition]\x0a!\x0a\x0aisRevisionOf: aDefinition\x0a\x09^ (aDefinition isKindOf: CypressDefinition) and: [aDefinition description = self description]\x0a!\x0a\x0adescription\x0a\x09self subclassResponsibility\x0a!\x0a\x0aisSameRevisionAs: aDefinition\x0a\x09^ self = aDefinition\x0a! !\x0a\x0aObject subclass: #CypressPatch\x0a\x09instanceVariableNames: ''operations''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressPatch methodsFor: ''not yet classified''!\x0a\x0afromBase: baseSnapshot toTarget: targetSnapshot\x0a\x09| base target |\x09\x0a\x09operations := OrderedCollection new.\x0a\x09base := CypressDefinitionIndex definitions: baseSnapshot definitions.\x0a\x09target := CypressDefinitionIndex definitions: targetSnapshot definitions.\x0a\x09\x0a\x09target definitions do:\x0a\x09\x09[:t |\x0a\x09\x09base\x0a\x09\x09\x09definitionLike: t\x0a\x09\x09\x09ifPresent: [:b | (b isSameRevisionAs: t) ifFalse: [operations add: (CypressModification of: b to: t)]]\x0a\x09\x09\x09ifAbsent: [operations add: (CypressAddition of: t)]].\x0a\x09\x09\x0a\x09base definitions do:\x0a\x09\x09[:b |\x0a\x09\x09target\x0a\x09\x09\x09definitionLike: b\x0a\x09\x09\x09ifPresent: [:t | ]\x0a\x09\x09\x09ifAbsent: [operations add: (CypressRemoval of: b)]]\x0a!\x0a\x0aoperations\x0a\x0a\x09^operations\x0a! !\x0a\x0a!CypressPatch class methodsFor: ''not yet classified''!\x0a\x0afromBase: baseSnapshot toTarget: targetSnapshot\x0a\x09^ (self new)\x0a\x09\x09fromBase: baseSnapshot\x0a\x09\x09toTarget: targetSnapshot\x0a! !\x0a\x0aObject subclass: #CypressDefinitionIndex\x0a\x09instanceVariableNames: ''definitionMap''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressDefinitionIndex methodsFor: ''not yet classified''!\x0a\x0aadd: aDefinition\x0a\x09^ self definitionMap at: aDefinition description put: aDefinition\x0a!\x0a\x0aaddAll: aCollection\x0a\x09aCollection do: [:ea | self add: ea]\x0a!\x0a\x0adefinitionLike: aDefinition ifPresent: foundBlock ifAbsent: errorBlock\x0a\x09| definition |\x0a\x09definition := self definitionMap at: aDefinition description ifAbsent: [].\x0a\x09^ definition\x0a\x09\x09ifNil: errorBlock\x0a\x09\x09ifNotNil: [foundBlock value: definition]\x0a!\x0a\x0adefinitions\x0a\x09^self definitionMap values\x0a!\x0a\x0adefinitionMap\x0a\x09definitionMap ifNil: [ definitionMap := Dictionary new ].\x0a\x09^ definitionMap\x0a!\x0a\x0aremove: aDefinition\x0a\x09self definitionMap removeKey: aDefinition description ifAbsent: []\x0a! !\x0a\x0a!CypressDefinitionIndex class methodsFor: ''not yet classified''!\x0a\x0adefinitions: aCollection\x0a\x09^ self new addAll: aCollection\x0a! !\x0a\x0aObject subclass: #CypressPatchOperation\x0a\x09instanceVariableNames: ''''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0aCypressDefinition subclass: #CypressClassDefinition\x0a\x09instanceVariableNames: ''name superclassName category comment instVarNames classInstVarNames''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressClassDefinition methodsFor: ''not yet classified''!\x0a\x0aname: aClassName superclassName: aSuperclassName category: aCategory instVarNames: anInstanceVariableNames classInstVarNames: aClassInstanceVariableNames comment: aComment\x0a\x0a\x09name := aClassName.\x0a\x09superclassName := aSuperclassName.\x0a\x09category := aCategory.\x0a\x09instVarNames := anInstanceVariableNames.\x0a\x09classInstVarNames := aClassInstanceVariableNames.\x0a\x09comment := aComment\x0a!\x0a\x0a= aDefinition\x0a\x09^(super = aDefinition)\x0a\x09\x09and: [superclassName = aDefinition superclassName\x0a\x09\x09and: [category = aDefinition category\x0a\x09\x09and: [instVarNames = aDefinition instVarNames\x0a\x09\x09and: [classInstVarNames = aDefinition classInstVarNames\x0a\x09\x09and: [comment = aDefinition comment]]]]]\x0a!\x0a\x0asuperclassName\x0a\x0a\x09^superclassName\x0a!\x0a\x0aname\x0a\x0a\x09^name\x0a!\x0a\x0acategory\x0a\x0a\x09^category\x0a!\x0a\x0acomment\x0a\x0a\x09^comment\x0a!\x0a\x0adescription\x0a\x0a\x09^ Array with: name\x0a!\x0a\x0ainstVarNames\x0a\x0a\x09^instVarNames\x0a!\x0a\x0aclassInstVarNames\x0a\x0a\x09^classInstVarNames\x0a! !\x0a\x0a!CypressClassDefinition class methodsFor: ''not yet classified''!\x0a\x0aname: aClassName \x0asuperclassName: aSuperclassName\x0acategory: aCategory\x0ainstVarNames: anInstanceVariableNames\x0aclassInstVarNames: aClassInstanceVariableNames\x0acomment: aComment\x0a\x0a\x09^(self new) \x0a\x09\x09name: aClassName \x0a\x09\x09superclassName: aSuperclassName\x0a\x09\x09category: aCategory\x0a\x09\x09instVarNames: anInstanceVariableNames\x0a\x09\x09classInstVarNames: aClassInstanceVariableNames\x0a\x09\x09comment: aComment\x0a! !\x0a\x0aCypressDefinition subclass: #CypressMethodDefinition\x0a\x09instanceVariableNames: ''classIsMeta source category selector className''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressMethodDefinition methodsFor: ''not yet classified''!\x0a\x0aclassName: aName classIsMeta: isMetaclass selector: aSelector category: aCategory source: aSource\x0a\x0a\x09className := aName.\x0a\x09classIsMeta := isMetaclass.\x0a\x09selector := aSelector.\x0a\x09category := aCategory.\x0a\x09source := aSource.\x0a!\x0a\x0a= aDefinition\x0a ^ super = aDefinition\x0a and: [ aDefinition source = self source\x0a and: [ aDefinition category = self category ] ]\x0a!\x0a\x0asource\x0a\x0a\x09^source\x0a!\x0a\x0acategory\x0a\x0a\x09^category\x0a!\x0a\x0adescription\x0a\x09^ Array\x09\x0a\x09\x09with: className\x0a\x09\x09with: selector\x0a\x09\x09with: classIsMeta\x0a! !\x0a\x0a!CypressMethodDefinition class methodsFor: ''not yet classified''!\x0a\x0aclassName: aName\x0aclassIsMeta: isMetaclass\x0aselector: aSelector\x0acategory: aCategory\x0asource: aSource\x0a\x0a\x09^(self new)\x0a\x09\x09className: aName\x0a\x09\x09classIsMeta: isMetaclass\x0a\x09\x09selector: aSelector\x0a\x09\x09category: aCategory\x0a\x09\x09source: aSource\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressAddition\x0a\x09instanceVariableNames: ''definition''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressAddition methodsFor: ''not yet classified''!\x0a\x0adefinition: aDefinition\x0a\x0a\x09definition := aDefinition\x0a! !\x0a\x0a!CypressAddition class methodsFor: ''not yet classified''!\x0a\x0aof: aDefinition\x0a\x09^ self new definition: aDefinition\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressModification\x0a\x09instanceVariableNames: ''obsoletion modification''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressModification methodsFor: ''not yet classified''!\x0a\x0abase: base target: target\x0a\x0a\x09obsoletion := base.\x0a\x09modification := target.\x0a! !\x0a\x0a!CypressModification class methodsFor: ''not yet classified''!\x0a\x0aof: base to: target\x0a\x09^ self new base: base target: target\x0a! !\x0a\x0aCypressPatchOperation subclass: #CypressRemoval\x0a\x09instanceVariableNames: ''definition''\x0a\x09package: ''Cypress-Definitions''!\x0a\x0a!CypressRemoval methodsFor: ''not yet classified''!\x0a\x0adefinition: aDefinition\x0a\x0a\x09definition := aDefinition\x0a! !\x0a\x0a!CypressRemoval class methodsFor: ''not yet classified''!\x0a\x0aof: aDefinition\x0a\x09^ self new definition: aDefinition\x0a! !\x0a\x0a!Object methodsFor: ''*Cypress-Definitions''!\x0a\x0aspecies\x0a\x0a\x09^self class\x0a! !\x0a\x0a!Class methodsFor: ''*Cypress-Definitions''!\x0a\x0aasCypressClassDefinition\x0a\x09^CypressClassDefinition\x0a\x09\x09name: self name\x0a\x09\x09superclassName: self superclass name\x0a\x09\x09category: self category \x0a\x09\x09instVarNames: self instanceVariableNames\x0a\x09\x09classInstVarNames: self class instanceVariableNames\x0a\x09\x09comment: self comment\x0a! !\x0a\x0a!CompiledMethod methodsFor: ''*Cypress-Definitions''!\x0a\x0aasCypressMethodDefinition\x0a\x0a\x09^CypressMethodDefinition \x0a \x09className: self methodClass name\x0a\x09\x09classIsMeta: self methodClass isMetaclass\x0a\x09\x09selector: self selector\x0a\x09\x09category: self category\x0a\x09\x09source: self source\x0a! !\x0a\x0a!CharacterArray methodsFor: ''*Cypress-Definitions''!\x0a\x0asameAs: aString\x0a\x0a\x09^self asUppercase = aString asUppercase\x0a! !\x0a\x0a'",
13
+ source: "codeGeneratorClass\x0a\x09^ CodeGenerator",
14
14
  messageSends: [],
15
+ referencedClasses: ["CodeGenerator"]
16
+ }),
17
+ smalltalk.CodeGeneratorTest);
18
+
19
+ smalltalk.addMethod(
20
+ "_compiler",
21
+ smalltalk.method({
22
+ selector: "compiler",
23
+ category: 'factory',
24
+ fn: function () {
25
+ var self = this;
26
+ var $2, $3, $1;
27
+ $2 = smalltalk.send(smalltalk.Compiler || Compiler, "_new", []);
28
+ smalltalk.send($2, "_codeGeneratorClass_", [smalltalk.send(self, "_codeGeneratorClass", [])]);
29
+ $3 = smalltalk.send($2, "_yourself", []);
30
+ $1 = $3;
31
+ return $1;
32
+ },
33
+ args: [],
34
+ source: "compiler\x0a\x09^ Compiler new\x0a\x09\x09codeGeneratorClass: self codeGeneratorClass;\x0a\x09\x09yourself",
35
+ messageSends: ["codeGeneratorClass:", "codeGeneratorClass", "new", "yourself"],
36
+ referencedClasses: ["Compiler"]
37
+ }),
38
+ smalltalk.CodeGeneratorTest);
39
+
40
+ smalltalk.addMethod(
41
+ "_setUp",
42
+ smalltalk.method({
43
+ selector: "setUp",
44
+ category: 'initialization',
45
+ fn: function () {
46
+ var self = this;
47
+ self['@receiver'] = smalltalk.send(smalltalk.send(self, "_targetClass", []), "_new", []);
48
+ return self;
49
+ },
50
+ args: [],
51
+ source: "setUp\x0a\x09receiver := self targetClass new",
52
+ messageSends: ["new", "targetClass"],
15
53
  referencedClasses: []
16
54
  }),
17
- smalltalk.ImporterTest);
55
+ smalltalk.CodeGeneratorTest);
18
56
 
19
57
  smalltalk.addMethod(
20
- "_chunkString",
58
+ "_should_return_",
21
59
  smalltalk.method({
22
- selector: "chunkString",
23
- category: 'private',
24
- fn: function (){
25
- var self=this;
26
- return "!Object methodsFor: 'importer test method'!\x0a\x0aimporterTestMethod\x0a\x0a\x09^'success'\x0a! !\x0a";
27
- return self;},
60
+ selector: "should:return:",
61
+ category: 'testing',
62
+ fn: function (aString, anObject) {
63
+ var self = this;
64
+ var method;
65
+ var result;
66
+ method = smalltalk.send(smalltalk.send(self, "_compiler", []), "_install_forClass_category_", [aString, smalltalk.send(self, "_targetClass", []), "tests"]);
67
+ result = smalltalk.send(self['@receiver'], "_perform_", [smalltalk.send(method, "_selector", [])]);
68
+ smalltalk.send(smalltalk.send(self, "_targetClass", []), "_removeCompiledMethod_", [method]);
69
+ smalltalk.send(self, "_assert_equals_", [anObject, result]);
70
+ return self;
71
+ },
72
+ args: ["aString", "anObject"],
73
+ source: "should: aString return: anObject\x0a\x09| method result |\x0a\x0a\x09method := self compiler install: aString forClass: self targetClass category: 'tests'.\x0a\x09result := receiver perform: method selector.\x0a\x09self targetClass removeCompiledMethod: method.\x0a\x09self assert: anObject equals: result",
74
+ messageSends: ["install:forClass:category:", "targetClass", "compiler", "perform:", "selector", "removeCompiledMethod:", "assert:equals:"],
75
+ referencedClasses: []
76
+ }),
77
+ smalltalk.CodeGeneratorTest);
78
+
79
+ smalltalk.addMethod(
80
+ "_targetClass",
81
+ smalltalk.method({
82
+ selector: "targetClass",
83
+ category: 'accessing',
84
+ fn: function () {
85
+ var self = this;
86
+ return smalltalk.DoIt || DoIt;
87
+ },
28
88
  args: [],
29
- source: "chunkString\x0a\x0a\x09^'!Object methodsFor: ''importer test method''!\x0a\x0aimporterTestMethod\x0a\x0a\x09^''success''\x0a! !\x0a'",
89
+ source: "targetClass\x0a\x09^ DoIt",
90
+ messageSends: [],
91
+ referencedClasses: ["DoIt"]
92
+ }),
93
+ smalltalk.CodeGeneratorTest);
94
+
95
+ smalltalk.addMethod(
96
+ "_tearDown",
97
+ smalltalk.method({
98
+ selector: "tearDown",
99
+ category: 'initialization',
100
+ fn: function () {
101
+ var self = this;
102
+ return self;
103
+ },
104
+ args: [],
105
+ source: "tearDown\x0a\x09\x22receiver := nil\x22",
30
106
  messageSends: [],
31
107
  referencedClasses: []
32
108
  }),
33
- smalltalk.ImporterTest);
109
+ smalltalk.CodeGeneratorTest);
34
110
 
35
111
  smalltalk.addMethod(
36
- "_cleanUp",
112
+ "_testAssignment",
37
113
  smalltalk.method({
38
- selector: "cleanUp",
39
- category: 'running',
40
- fn: function (){
41
- var self=this;
42
- ((($receiver = smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_methodDictionary", []), "_includesKey_", [smalltalk.symbolFor("importerTestMethod")])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send((smalltalk.Object || Object), "_removeCompiledMethod_", [smalltalk.send((smalltalk.Object || Object), "_methodAt_", [smalltalk.symbolFor("importerTestMethod")])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send((smalltalk.Object || Object), "_removeCompiledMethod_", [smalltalk.send((smalltalk.Object || Object), "_methodAt_", [smalltalk.symbolFor("importerTestMethod")])]);})]));
43
- return self;},
114
+ selector: "testAssignment",
115
+ category: 'tests',
116
+ fn: function () {
117
+ var self = this;
118
+ smalltalk.send(self, "_should_return_", ["foo | a | a := true ifTrue: [ 1 ]. ^ a", 1]);
119
+ smalltalk.send(self, "_should_return_", ["foo | a | a := false ifTrue: [ 1 ]. ^ a", nil]);
120
+ smalltalk.send(self, "_should_return_", ["foo | a | ^ a := true ifTrue: [ 1 ]", 1]);
121
+ return self;
122
+ },
123
+ args: [],
124
+ source: "testAssignment\x0a\x09self should: 'foo | a | a := true ifTrue: [ 1 ]. ^ a' return: 1.\x0a\x09self should: 'foo | a | a := false ifTrue: [ 1 ]. ^ a' return: nil.\x0a\x0a\x09self should: 'foo | a | ^ a := true ifTrue: [ 1 ]' return: 1 ",
125
+ messageSends: ["should:return:"],
126
+ referencedClasses: []
127
+ }),
128
+ smalltalk.CodeGeneratorTest);
129
+
130
+ smalltalk.addMethod(
131
+ "_testBlockReturn",
132
+ smalltalk.method({
133
+ selector: "testBlockReturn",
134
+ category: 'tests',
135
+ fn: function () {
136
+ var self = this;
137
+ smalltalk.send(self, "_should_return_", ["foo ^ #(1 2 3) collect: [ :each | true ifTrue: [ each + 1 ] ]", [2, 3, 4]]);
138
+ smalltalk.send(self, "_should_return_", ["foo ^ #(1 2 3) collect: [ :each | false ifFalse: [ each + 1 ] ]", [2, 3, 4]]);
139
+ smalltalk.send(self, "_should_return_", ["foo ^ #(1 2 3) collect: [ :each | each odd ifTrue: [ each + 1 ] ifFalse: [ each - 1 ] ]", [2, 1, 4]]);
140
+ return self;
141
+ },
142
+ args: [],
143
+ source: "testBlockReturn\x0a\x09self should: 'foo ^ #(1 2 3) collect: [ :each | true ifTrue: [ each + 1 ] ]' return: #(2 3 4).\x0a\x09self should: 'foo ^ #(1 2 3) collect: [ :each | false ifFalse: [ each + 1 ] ]' return: #(2 3 4).\x0a\x09self should: 'foo ^ #(1 2 3) collect: [ :each | each odd ifTrue: [ each + 1 ] ifFalse: [ each - 1 ] ]' return: #(2 1 4).",
144
+ messageSends: ["should:return:"],
145
+ referencedClasses: []
146
+ }),
147
+ smalltalk.CodeGeneratorTest);
148
+
149
+ smalltalk.addMethod(
150
+ "_testCascades",
151
+ smalltalk.method({
152
+ selector: "testCascades",
153
+ category: 'tests',
154
+ fn: function () {
155
+ var self = this;
156
+ smalltalk.send(self, "_should_return_", ["foo ^ Array new add: 3; add: 4; yourself", [3, 4]]);
157
+ return self;
158
+ },
159
+ args: [],
160
+ source: "testCascades\x0a\x09\x0a\x09self should: 'foo ^ Array new add: 3; add: 4; yourself' return: #(3 4)",
161
+ messageSends: ["should:return:"],
162
+ referencedClasses: []
163
+ }),
164
+ smalltalk.CodeGeneratorTest);
165
+
166
+ smalltalk.addMethod(
167
+ "_testLiterals",
168
+ smalltalk.method({
169
+ selector: "testLiterals",
170
+ category: 'tests',
171
+ fn: function () {
172
+ var self = this;
173
+ smalltalk.send(self, "_should_return_", ["foo ^ 1", 1]);
174
+ smalltalk.send(self, "_should_return_", ["foo ^ 'hello'", "hello"]);
175
+ smalltalk.send(self, "_should_return_", ["foo ^ #(1 2 3 4)", [1, 2, 3, 4]]);
176
+ smalltalk.send(self, "_should_return_", ["foo ^ {1. [:x | x ] value: 2. 3. [4] value}", [1, 2, 3, 4]]);
177
+ smalltalk.send(self, "_should_return_", ["foo ^ true", true]);
178
+ smalltalk.send(self, "_should_return_", ["foo ^ false", false]);
179
+ smalltalk.send(self, "_should_return_", ["foo ^ #{1->2. 3->4}", smalltalk.HashedCollection._fromPairs_([smalltalk.send(1, "__minus_gt", [2]), smalltalk.send(3, "__minus_gt", [4])])]);
180
+ smalltalk.send(self, "_should_return_", ["foo ^ #hello", smalltalk.symbolFor("hello")]);
181
+ smalltalk.send(self, "_should_return_", ["foo ^ -123.456", -123.456]);
182
+ return self;
183
+ },
184
+ args: [],
185
+ source: "testLiterals\x0a\x09self should: 'foo ^ 1' return: 1.\x0a\x09self should: 'foo ^ ''hello''' return: 'hello'.\x0a\x09self should: 'foo ^ #(1 2 3 4)' return: #(1 2 3 4).\x0a\x09self should: 'foo ^ {1. [:x | x ] value: 2. 3. [4] value}' return: #(1 2 3 4).\x0a\x09self should: 'foo ^ true' return: true.\x0a\x09self should: 'foo ^ false' return: false.\x0a\x09self should: 'foo ^ #{1->2. 3->4}' return: #{1->2. 3->4}.\x0a\x09self should: 'foo ^ #hello' return: #hello.\x0a\x09self should: 'foo ^ -123.456' return: -123.456",
186
+ messageSends: ["should:return:", "->"],
187
+ referencedClasses: []
188
+ }),
189
+ smalltalk.CodeGeneratorTest);
190
+
191
+ smalltalk.addMethod(
192
+ "_testLocalReturn",
193
+ smalltalk.method({
194
+ selector: "testLocalReturn",
195
+ category: 'tests',
196
+ fn: function () {
197
+ var self = this;
198
+ smalltalk.send(self, "_should_return_", ["foo ^ 1", 1]);
199
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 + 1", 2]);
200
+ smalltalk.send(self, "_should_return_", ["foo ", self['@receiver']]);
201
+ smalltalk.send(self, "_should_return_", ["foo self asString", self['@receiver']]);
202
+ smalltalk.send(self, "_should_return_", ["foo | a b | a := 1. b := 2. ^ a + b", 3]);
203
+ return self;
204
+ },
205
+ args: [],
206
+ source: "testLocalReturn\x0a\x09self should: 'foo ^ 1' return: 1.\x0a\x09self should: 'foo ^ 1 + 1' return: 2.\x0a\x09self should: 'foo ' return: receiver.\x0a\x09self should: 'foo self asString' return: receiver.\x0a\x09self should: 'foo | a b | a := 1. b := 2. ^ a + b' return: 3",
207
+ messageSends: ["should:return:"],
208
+ referencedClasses: []
209
+ }),
210
+ smalltalk.CodeGeneratorTest);
211
+
212
+ smalltalk.addMethod(
213
+ "_testMessageSends",
214
+ smalltalk.method({
215
+ selector: "testMessageSends",
216
+ category: 'tests',
217
+ fn: function () {
218
+ var self = this;
219
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 asString", "1"]);
220
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 + 1", 2]);
221
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 + 2 * 3", 9]);
222
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 to: 3", [1, 2, 3]]);
223
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 to: 5 by: 2", [1, 3, 5]]);
224
+ return self;
225
+ },
226
+ args: [],
227
+ source: "testMessageSends\x0a\x09self should: 'foo ^ 1 asString' return: '1'.\x0a\x0a\x09self should: 'foo ^ 1 + 1' return: 2.\x0a\x09self should: 'foo ^ 1 + 2 * 3' return: 9.\x0a\x0a\x09self should: 'foo ^ 1 to: 3' return: #(1 2 3).\x0a\x09self should: 'foo ^ 1 to: 5 by: 2' return: #(1 3 5)",
228
+ messageSends: ["should:return:"],
229
+ referencedClasses: []
230
+ }),
231
+ smalltalk.CodeGeneratorTest);
232
+
233
+ smalltalk.addMethod(
234
+ "_testNestedIfTrue",
235
+ smalltalk.method({
236
+ selector: "testNestedIfTrue",
237
+ category: 'tests',
238
+ fn: function () {
239
+ var self = this;
240
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifTrue: [ false ifFalse: [ 1 ] ]", 1]);
241
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifTrue: [ false ifTrue: [ 1 ] ]", nil]);
242
+ smalltalk.send(self, "_should_return_", ["foo true ifTrue: [ false ifFalse: [ ^ 1 ] ]", 1]);
243
+ smalltalk.send(self, "_should_return_", ["foo true ifTrue: [ false ifTrue: [ ^ 1 ] ]", self['@receiver']]);
244
+ return self;
245
+ },
246
+ args: [],
247
+ source: "testNestedIfTrue\x0a\x09self should: 'foo ^ true ifTrue: [ false ifFalse: [ 1 ] ]' return: 1.\x0a\x09self should: 'foo ^ true ifTrue: [ false ifTrue: [ 1 ] ]' return: nil.\x0a\x0a\x09self should: 'foo true ifTrue: [ false ifFalse: [ ^ 1 ] ]' return: 1.\x0a\x09self should: 'foo true ifTrue: [ false ifTrue: [ ^ 1 ] ]' return: receiver.",
248
+ messageSends: ["should:return:"],
249
+ referencedClasses: []
250
+ }),
251
+ smalltalk.CodeGeneratorTest);
252
+
253
+ smalltalk.addMethod(
254
+ "_testNonLocalReturn",
255
+ smalltalk.method({
256
+ selector: "testNonLocalReturn",
257
+ category: 'tests',
258
+ fn: function () {
259
+ var self = this;
260
+ smalltalk.send(self, "_should_return_", ["foo [ ^ 1 ] value", 1]);
261
+ smalltalk.send(self, "_should_return_", ["foo [ ^ 1 + 1 ] value", 2]);
262
+ smalltalk.send(self, "_should_return_", ["foo | a b | a := 1. b := 2. [ ^ a + b ] value. self halt", 3]);
263
+ smalltalk.send(self, "_should_return_", ["foo [ :x | ^ x + x ] value: 4. ^ 2", 8]);
264
+ return self;
265
+ },
266
+ args: [],
267
+ source: "testNonLocalReturn\x0a\x09self should: 'foo [ ^ 1 ] value' return: 1.\x0a\x09self should: 'foo [ ^ 1 + 1 ] value' return: 2.\x0a\x09self should: 'foo | a b | a := 1. b := 2. [ ^ a + b ] value. self halt' return: 3.\x0a\x09self should: 'foo [ :x | ^ x + x ] value: 4. ^ 2' return: 8",
268
+ messageSends: ["should:return:"],
269
+ referencedClasses: []
270
+ }),
271
+ smalltalk.CodeGeneratorTest);
272
+
273
+ smalltalk.addMethod(
274
+ "_testifFalse",
275
+ smalltalk.method({
276
+ selector: "testifFalse",
277
+ category: 'tests',
278
+ fn: function () {
279
+ var self = this;
280
+ smalltalk.send(self, "_should_return_", ["foo true ifFalse: [ ^ 1 ]", self['@receiver']]);
281
+ smalltalk.send(self, "_should_return_", ["foo false ifFalse: [ ^ 2 ]", 2]);
282
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifFalse: [ 1 ]", nil]);
283
+ smalltalk.send(self, "_should_return_", ["foo ^ false ifFalse: [ 2 ]", 2]);
284
+ return self;
285
+ },
286
+ args: [],
287
+ source: "testifFalse\x0a\x09self should: 'foo true ifFalse: [ ^ 1 ]' return: receiver.\x0a\x09self should: 'foo false ifFalse: [ ^ 2 ]' return: 2.\x0a\x09\x0a\x09self should: 'foo ^ true ifFalse: [ 1 ]' return: nil.\x0a\x09self should: 'foo ^ false ifFalse: [ 2 ]' return: 2.",
288
+ messageSends: ["should:return:"],
289
+ referencedClasses: []
290
+ }),
291
+ smalltalk.CodeGeneratorTest);
292
+
293
+ smalltalk.addMethod(
294
+ "_testifFalseIfTrue",
295
+ smalltalk.method({
296
+ selector: "testifFalseIfTrue",
297
+ category: 'tests',
298
+ fn: function () {
299
+ var self = this;
300
+ smalltalk.send(self, "_should_return_", ["foo true ifFalse: [ ^ 1 ] ifTrue: [ ^ 2 ]", 2]);
301
+ smalltalk.send(self, "_should_return_", ["foo false ifFalse: [ ^ 2 ] ifTrue: [ ^1 ]", 2]);
302
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifFalse: [ 1 ] ifTrue: [ 2 ]", 2]);
303
+ smalltalk.send(self, "_should_return_", ["foo ^ false ifFalse: [ 2 ] ifTrue: [ 1 ]", 2]);
304
+ return self;
305
+ },
306
+ args: [],
307
+ source: "testifFalseIfTrue\x0a\x09self should: 'foo true ifFalse: [ ^ 1 ] ifTrue: [ ^ 2 ]' return: 2.\x0a\x09self should: 'foo false ifFalse: [ ^ 2 ] ifTrue: [ ^1 ]' return: 2.\x0a\x09\x0a\x09self should: 'foo ^ true ifFalse: [ 1 ] ifTrue: [ 2 ]' return: 2.\x0a\x09self should: 'foo ^ false ifFalse: [ 2 ] ifTrue: [ 1 ]' return: 2.",
308
+ messageSends: ["should:return:"],
309
+ referencedClasses: []
310
+ }),
311
+ smalltalk.CodeGeneratorTest);
312
+
313
+ smalltalk.addMethod(
314
+ "_testifNil",
315
+ smalltalk.method({
316
+ selector: "testifNil",
317
+ category: 'tests',
318
+ fn: function () {
319
+ var self = this;
320
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 ifNil: [ 2 ]", 1]);
321
+ smalltalk.send(self, "_should_return_", ["foo ^ nil ifNil: [ 2 ]", 2]);
322
+ smalltalk.send(self, "_should_return_", ["foo 1 ifNil: [ ^ 2 ]", self['@receiver']]);
323
+ smalltalk.send(self, "_should_return_", ["foo nil ifNil: [ ^ 2 ]", 2]);
324
+ return self;
325
+ },
326
+ args: [],
327
+ source: "testifNil\x0a\x09self should: 'foo ^ 1 ifNil: [ 2 ]' return: 1.\x0a\x09self should: 'foo ^ nil ifNil: [ 2 ]' return: 2.\x0a\x0a\x09self should: 'foo 1 ifNil: [ ^ 2 ]' return: receiver.\x0a\x09self should: 'foo nil ifNil: [ ^ 2 ]' return: 2.",
328
+ messageSends: ["should:return:"],
329
+ referencedClasses: []
330
+ }),
331
+ smalltalk.CodeGeneratorTest);
332
+
333
+ smalltalk.addMethod(
334
+ "_testifNilIfNotNil",
335
+ smalltalk.method({
336
+ selector: "testifNilIfNotNil",
337
+ category: 'tests',
338
+ fn: function () {
339
+ var self = this;
340
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 ifNil: [ 2 ] ifNotNil: [ 3 ]", 3]);
341
+ smalltalk.send(self, "_should_return_", ["foo ^ nil ifNil: [ 2 ] ifNotNil: [ 3 ]", 2]);
342
+ smalltalk.send(self, "_should_return_", ["foo 1 ifNil: [ ^ 2 ] ifNotNil: [ ^3 ]", 3]);
343
+ smalltalk.send(self, "_should_return_", ["foo nil ifNil: [ ^ 2 ] ifNotNil: [ ^3 ]", 2]);
344
+ return self;
345
+ },
346
+ args: [],
347
+ source: "testifNilIfNotNil\x0a\x09self should: 'foo ^ 1 ifNil: [ 2 ] ifNotNil: [ 3 ]' return: 3.\x0a\x09self should: 'foo ^ nil ifNil: [ 2 ] ifNotNil: [ 3 ]' return: 2.\x0a\x0a\x09self should: 'foo 1 ifNil: [ ^ 2 ] ifNotNil: [ ^3 ]' return: 3.\x0a\x09self should: 'foo nil ifNil: [ ^ 2 ] ifNotNil: [ ^3 ]' return: 2.",
348
+ messageSends: ["should:return:"],
349
+ referencedClasses: []
350
+ }),
351
+ smalltalk.CodeGeneratorTest);
352
+
353
+ smalltalk.addMethod(
354
+ "_testifNotNil",
355
+ smalltalk.method({
356
+ selector: "testifNotNil",
357
+ category: 'tests',
358
+ fn: function () {
359
+ var self = this;
360
+ smalltalk.send(self, "_should_return_", ["foo ^ 1 ifNotNil: [ 2 ]", 2]);
361
+ smalltalk.send(self, "_should_return_", ["foo ^ nil ifNotNil: [ 2 ]", nil]);
362
+ smalltalk.send(self, "_should_return_", ["foo 1 ifNotNil: [ ^ 2 ]", 2]);
363
+ smalltalk.send(self, "_should_return_", ["foo nil ifNotNil: [ ^ 2 ]", self['@receiver']]);
364
+ return self;
365
+ },
366
+ args: [],
367
+ source: "testifNotNil\x0a\x09self should: 'foo ^ 1 ifNotNil: [ 2 ]' return: 2.\x0a\x09self should: 'foo ^ nil ifNotNil: [ 2 ]' return: nil.\x0a\x0a\x09self should: 'foo 1 ifNotNil: [ ^ 2 ]' return: 2.\x0a\x09self should: 'foo nil ifNotNil: [ ^ 2 ]' return: receiver.",
368
+ messageSends: ["should:return:"],
369
+ referencedClasses: []
370
+ }),
371
+ smalltalk.CodeGeneratorTest);
372
+
373
+ smalltalk.addMethod(
374
+ "_testifTrue",
375
+ smalltalk.method({
376
+ selector: "testifTrue",
377
+ category: 'tests',
378
+ fn: function () {
379
+ var self = this;
380
+ smalltalk.send(self, "_should_return_", ["foo false ifTrue: [ ^ 1 ]", self['@receiver']]);
381
+ smalltalk.send(self, "_should_return_", ["foo true ifTrue: [ ^ 2 ]", 2]);
382
+ smalltalk.send(self, "_should_return_", ["foo ^ false ifTrue: [ 1 ]", nil]);
383
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifTrue: [ 2 ]", 2]);
384
+ return self;
385
+ },
386
+ args: [],
387
+ source: "testifTrue\x0a\x09self should: 'foo false ifTrue: [ ^ 1 ]' return: receiver.\x0a\x09self should: 'foo true ifTrue: [ ^ 2 ]' return: 2.\x0a\x09\x0a\x09self should: 'foo ^ false ifTrue: [ 1 ]' return: nil.\x0a\x09self should: 'foo ^ true ifTrue: [ 2 ]' return: 2.",
388
+ messageSends: ["should:return:"],
389
+ referencedClasses: []
390
+ }),
391
+ smalltalk.CodeGeneratorTest);
392
+
393
+ smalltalk.addMethod(
394
+ "_testifTrueIfFalse",
395
+ smalltalk.method({
396
+ selector: "testifTrueIfFalse",
397
+ category: 'tests',
398
+ fn: function () {
399
+ var self = this;
400
+ smalltalk.send(self, "_should_return_", ["foo false ifTrue: [ ^ 1 ] ifFalse: [ ^2 ]", 2]);
401
+ smalltalk.send(self, "_should_return_", ["foo true ifTrue: [ ^ 1 ] ifFalse: [ ^ 2 ]", 1]);
402
+ smalltalk.send(self, "_should_return_", ["foo ^ false ifTrue: [ 2 ] ifFalse: [ 1 ]", 1]);
403
+ smalltalk.send(self, "_should_return_", ["foo ^ true ifTrue: [ 2 ] ifFalse: [ 1 ]", 2]);
404
+ return self;
405
+ },
406
+ args: [],
407
+ source: "testifTrueIfFalse\x0a\x09self should: 'foo false ifTrue: [ ^ 1 ] ifFalse: [ ^2 ]' return: 2.\x0a\x09self should: 'foo true ifTrue: [ ^ 1 ] ifFalse: [ ^ 2 ]' return: 1.\x0a\x09\x0a\x09self should: 'foo ^ false ifTrue: [ 2 ] ifFalse: [ 1 ]' return: 1.\x0a\x09self should: 'foo ^ true ifTrue: [ 2 ] ifFalse: [ 1 ]' return: 2.",
408
+ messageSends: ["should:return:"],
409
+ referencedClasses: []
410
+ }),
411
+ smalltalk.CodeGeneratorTest);
412
+
413
+
414
+
415
+ smalltalk.addClass('InliningCodeGeneratorTest', smalltalk.CodeGeneratorTest, [], 'Compiler-Tests');
416
+ smalltalk.addMethod(
417
+ "_codeGeneratorClass",
418
+ smalltalk.method({
419
+ selector: "codeGeneratorClass",
420
+ category: 'accessing',
421
+ fn: function () {
422
+ var self = this;
423
+ return smalltalk.InliningCodeGenerator || InliningCodeGenerator;
424
+ },
425
+ args: [],
426
+ source: "codeGeneratorClass\x0a\x09^ InliningCodeGenerator",
427
+ messageSends: [],
428
+ referencedClasses: ["InliningCodeGenerator"]
429
+ }),
430
+ smalltalk.InliningCodeGeneratorTest);
431
+
432
+
433
+
434
+ smalltalk.addClass('ScopeVarTest', smalltalk.TestCase, [], 'Compiler-Tests');
435
+ smalltalk.addMethod(
436
+ "_testClassRefVar",
437
+ smalltalk.method({
438
+ selector: "testClassRefVar",
439
+ category: 'tests',
440
+ fn: function () {
441
+ var self = this;
442
+ var $1, $2;
443
+ var node;
444
+ $1 = smalltalk.send(smalltalk.ClassReferenceNode || ClassReferenceNode, "_new", []);
445
+ smalltalk.send($1, "_value_", ["Object"]);
446
+ $2 = smalltalk.send($1, "_yourself", []);
447
+ node = $2;
448
+ smalltalk.send(smalltalk.send(smalltalk.SemanticAnalyzer || SemanticAnalyzer, "_new", []), "_visit_", [node]);
449
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(node, "_binding", []), "_isClassRefVar", [])]);
450
+ return self;
451
+ },
452
+ args: [],
453
+ source: "testClassRefVar\x0a\x09| node |\x0a\x09node := ClassReferenceNode new\x0a\x09\x09value: 'Object';\x0a\x09\x09yourself.\x0a\x09SemanticAnalyzer new visit: node.\x0a\x09self assert: node binding isClassRefVar",
454
+ messageSends: ["value:", "new", "yourself", "visit:", "assert:", "isClassRefVar", "binding"],
455
+ referencedClasses: ["ClassReferenceNode", "SemanticAnalyzer"]
456
+ }),
457
+ smalltalk.ScopeVarTest);
458
+
459
+ smalltalk.addMethod(
460
+ "_testInstanceVar",
461
+ smalltalk.method({
462
+ selector: "testInstanceVar",
463
+ category: 'tests',
464
+ fn: function () {
465
+ var self = this;
466
+ var $1, $2;
467
+ var node;
468
+ var scope;
469
+ $1 = smalltalk.send(smalltalk.VariableNode || VariableNode, "_new", []);
470
+ smalltalk.send($1, "_value_", ["bzzz"]);
471
+ $2 = smalltalk.send($1, "_yourself", []);
472
+ node = $2;
473
+ scope = smalltalk.send(smalltalk.MethodLexicalScope || MethodLexicalScope, "_new", []);
474
+ smalltalk.send(scope, "_addIVar_", ["bzzz"]);
475
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(scope, "_bindingFor_", [node]), "_isInstanceVar", [])]);
476
+ return self;
477
+ },
478
+ args: [],
479
+ source: "testInstanceVar\x0a\x09| node scope |\x0a\x09node := VariableNode new\x0a\x09\x09value: 'bzzz';\x0a\x09\x09yourself.\x0a\x09scope := MethodLexicalScope new.\x0a\x09scope addIVar: 'bzzz'.\x0a\x09self assert: (scope bindingFor: node) isInstanceVar",
480
+ messageSends: ["value:", "new", "yourself", "addIVar:", "assert:", "isInstanceVar", "bindingFor:"],
481
+ referencedClasses: ["VariableNode", "MethodLexicalScope"]
482
+ }),
483
+ smalltalk.ScopeVarTest);
484
+
485
+ smalltalk.addMethod(
486
+ "_testPseudoVar",
487
+ smalltalk.method({
488
+ selector: "testPseudoVar",
489
+ category: 'tests',
490
+ fn: function () {
491
+ var self = this;
492
+ var $1, $2;
493
+ var node;
494
+ var pseudoVars;
495
+ pseudoVars = ["self", "super", "true", "false", "nil"];
496
+ smalltalk.send(pseudoVars, "_do_", [function (each) {$1 = smalltalk.send(smalltalk.VariableNode || VariableNode, "_new", []);smalltalk.send($1, "_value_", [each]);$2 = smalltalk.send($1, "_yourself", []);node = $2;node;return smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.MethodLexicalScope || MethodLexicalScope, "_new", []), "_bindingFor_", [node]), "_isPseudoVar", [])]);}]);
497
+ return self;
498
+ },
44
499
  args: [],
45
- source: "cleanUp\x0a\x0a\x09(Object methodDictionary includesKey: #importerTestMethod)\x0a\x09\x09ifTrue: [ Object removeCompiledMethod: (Object methodAt: #importerTestMethod)].",
46
- messageSends: ["ifTrue:", "includesKey:", "methodDictionary", "removeCompiledMethod:", "methodAt:"],
47
- referencedClasses: ["Object"]
500
+ source: "testPseudoVar\x0a\x09| node pseudoVars |\x0a\x09pseudoVars := #('self' 'super' 'true' 'false' 'nil').\x0a\x09pseudoVars do: [:each |\x0a\x09\x09node := VariableNode new\x0a\x09\x09value: each;\x0a\x09\x09yourself.\x0a\x09\x09self assert: (MethodLexicalScope new bindingFor: node) isPseudoVar ]",
501
+ messageSends: ["do:", "value:", "new", "yourself", "assert:", "isPseudoVar", "bindingFor:"],
502
+ referencedClasses: ["VariableNode", "MethodLexicalScope"]
48
503
  }),
49
- smalltalk.ImporterTest);
504
+ smalltalk.ScopeVarTest);
50
505
 
506
+ smalltalk.addMethod(
507
+ "_testTempVar",
508
+ smalltalk.method({
509
+ selector: "testTempVar",
510
+ category: 'tests',
511
+ fn: function () {
512
+ var self = this;
513
+ var $1, $2;
514
+ var node;
515
+ var scope;
516
+ $1 = smalltalk.send(smalltalk.VariableNode || VariableNode, "_new", []);
517
+ smalltalk.send($1, "_value_", ["bzzz"]);
518
+ $2 = smalltalk.send($1, "_yourself", []);
519
+ node = $2;
520
+ scope = smalltalk.send(smalltalk.MethodLexicalScope || MethodLexicalScope, "_new", []);
521
+ smalltalk.send(scope, "_addTemp_", ["bzzz"]);
522
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(scope, "_bindingFor_", [node]), "_isTempVar", [])]);
523
+ return self;
524
+ },
525
+ args: [],
526
+ source: "testTempVar\x0a\x09| node scope |\x0a\x09node := VariableNode new\x0a\x09\x09value: 'bzzz';\x0a\x09\x09yourself.\x0a\x09scope := MethodLexicalScope new.\x0a\x09scope addTemp: 'bzzz'.\x0a\x09self assert: (scope bindingFor: node) isTempVar",
527
+ messageSends: ["value:", "new", "yourself", "addTemp:", "assert:", "isTempVar", "bindingFor:"],
528
+ referencedClasses: ["VariableNode", "MethodLexicalScope"]
529
+ }),
530
+ smalltalk.ScopeVarTest);
531
+
532
+ smalltalk.addMethod(
533
+ "_testUnknownVar",
534
+ smalltalk.method({
535
+ selector: "testUnknownVar",
536
+ category: 'tests',
537
+ fn: function () {
538
+ var self = this;
539
+ var $1, $2;
540
+ var node;
541
+ $1 = smalltalk.send(smalltalk.VariableNode || VariableNode, "_new", []);
542
+ smalltalk.send($1, "_value_", ["bzzz"]);
543
+ $2 = smalltalk.send($1, "_yourself", []);
544
+ node = $2;
545
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.MethodLexicalScope || MethodLexicalScope, "_new", []), "_bindingFor_", [node]), "_isNil", [])]);
546
+ return self;
547
+ },
548
+ args: [],
549
+ source: "testUnknownVar\x0a\x09| node |\x0a\x09node := VariableNode new\x0a\x09\x09value: 'bzzz';\x0a\x09\x09yourself.\x0a\x09self assert: (MethodLexicalScope new bindingFor: node) isNil",
550
+ messageSends: ["value:", "new", "yourself", "assert:", "isNil", "bindingFor:"],
551
+ referencedClasses: ["VariableNode", "MethodLexicalScope"]
552
+ }),
553
+ smalltalk.ScopeVarTest);
554
+
555
+
556
+
557
+ smalltalk.addClass('SemanticAnalyzerTest', smalltalk.TestCase, ['analyzer'], 'Compiler-Tests');
51
558
  smalltalk.addMethod(
52
559
  "_setUp",
53
560
  smalltalk.method({
54
561
  selector: "setUp",
55
562
  category: 'running',
56
- fn: function (){
57
- var self=this;
58
- smalltalk.send(self, "_setUp", [], smalltalk.ImporterTest.superclass || nil);
59
- smalltalk.send(self, "_cleanUp", []);
60
- return self;},
563
+ fn: function () {
564
+ var self = this;
565
+ self['@analyzer'] = smalltalk.send(smalltalk.SemanticAnalyzer || SemanticAnalyzer, "_on_", [smalltalk.Object || Object]);
566
+ return self;
567
+ },
61
568
  args: [],
62
- source: "setUp\x0a\x0a\x09super setUp.\x0a\x09self cleanUp",
63
- messageSends: ["setUp", "cleanUp"],
569
+ source: "setUp\x0a\x09analyzer := SemanticAnalyzer on: Object",
570
+ messageSends: ["on:"],
571
+ referencedClasses: ["Object", "SemanticAnalyzer"]
572
+ }),
573
+ smalltalk.SemanticAnalyzerTest);
574
+
575
+ smalltalk.addMethod(
576
+ "_testAssignment",
577
+ smalltalk.method({
578
+ selector: "testAssignment",
579
+ category: 'tests',
580
+ fn: function () {
581
+ var self = this;
582
+ var src;
583
+ var ast;
584
+ src = "foo self := 1";
585
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
586
+ smalltalk.send(self, "_should_raise_", [function () {return smalltalk.send(self['@analyzer'], "_visit_", [ast]);}, smalltalk.InvalidAssignmentError || InvalidAssignmentError]);
587
+ return self;
588
+ },
589
+ args: [],
590
+ source: "testAssignment\x0a\x09| src ast |\x0a\x0a\x09src := 'foo self := 1'.\x0a\x09ast := smalltalk parse: src.\x0a\x09self should: [analyzer visit: ast] raise: InvalidAssignmentError",
591
+ messageSends: ["parse:", "should:raise:", "visit:"],
592
+ referencedClasses: ["InvalidAssignmentError"]
593
+ }),
594
+ smalltalk.SemanticAnalyzerTest);
595
+
596
+ smalltalk.addMethod(
597
+ "_testNonLocalReturn",
598
+ smalltalk.method({
599
+ selector: "testNonLocalReturn",
600
+ category: 'tests',
601
+ fn: function () {
602
+ var self = this;
603
+ var src;
604
+ var ast;
605
+ src = "foo | a | a + 1. ^ a";
606
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
607
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
608
+ smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(ast, "_scope", []), "_hasNonLocalReturn", [])]);
609
+ return self;
610
+ },
611
+ args: [],
612
+ source: "testNonLocalReturn\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. ^ a'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09self deny: ast scope hasNonLocalReturn",
613
+ messageSends: ["parse:", "visit:", "deny:", "hasNonLocalReturn", "scope"],
64
614
  referencedClasses: []
65
615
  }),
66
- smalltalk.ImporterTest);
616
+ smalltalk.SemanticAnalyzerTest);
67
617
 
68
618
  smalltalk.addMethod(
69
- "_tearDown",
619
+ "_testNonLocalReturn2",
70
620
  smalltalk.method({
71
- selector: "tearDown",
72
- category: 'running',
73
- fn: function (){
74
- var self=this;
75
- smalltalk.send(self, "_tearDown", [], smalltalk.ImporterTest.superclass || nil);
76
- smalltalk.send(self, "_cleanUp", []);
77
- return self;},
621
+ selector: "testNonLocalReturn2",
622
+ category: 'tests',
623
+ fn: function () {
624
+ var self = this;
625
+ var src;
626
+ var ast;
627
+ src = "foo | a | a + 1. [\xA0[ ^ a]\xA0]";
628
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
629
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
630
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(ast, "_scope", []), "_hasNonLocalReturn", [])]);
631
+ return self;
632
+ },
78
633
  args: [],
79
- source: "tearDown\x0a\x0a\x09super tearDown.\x0a\x09self cleanUp",
80
- messageSends: ["tearDown", "cleanUp"],
634
+ source: "testNonLocalReturn2\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. [ [ ^ a] ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09self assert: ast scope hasNonLocalReturn",
635
+ messageSends: ["parse:", "visit:", "assert:", "hasNonLocalReturn", "scope"],
81
636
  referencedClasses: []
82
637
  }),
83
- smalltalk.ImporterTest);
638
+ smalltalk.SemanticAnalyzerTest);
84
639
 
85
640
  smalltalk.addMethod(
86
- "_testBigChunkString",
641
+ "_testScope",
87
642
  smalltalk.method({
88
- selector: "testBigChunkString",
643
+ selector: "testScope",
89
644
  category: 'tests',
90
- fn: function (){
91
- var self=this;
92
- smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_bigChunkString", []), "_readStream", [])]);
93
- smalltalk.send(smalltalk.send((smalltalk.CypressPackage || CypressPackage), "_new", []), "_species", []);
94
- return self;},
645
+ fn: function () {
646
+ var self = this;
647
+ var src;
648
+ var ast;
649
+ src = "foo | a | a + 1. [ | b | b := a ]";
650
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
651
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
652
+ smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_scope", []), "__eq_eq", [smalltalk.send(ast, "_scope", [])])]);
653
+ return self;
654
+ },
95
655
  args: [],
96
- source: "testBigChunkString\x0a\x09\x22importer does not correctly add extension methods.\x0a\x0a\x09 After loading in AmberProjectImporter, the following import fails...get a MNU from `CypressPackage new species`:\x0a\x0a \x09\x09AmberProjectImporter\x0a\x09\x09\x09importSTPackage: 'Cypress-Definitions' \x0a\x09\x09\x09prefix: 'tests/'.\x0a\x0a\x09\x09CypressPackage new species. \x0a\x0a\x09WARNING this guy isn't cleaned up automatically\x22\x0a\x0a\x09Importer new import: self bigChunkString readStream.\x0a\x09CypressPackage new species.",
97
- messageSends: ["import:", "new", "readStream", "bigChunkString", "species"],
98
- referencedClasses: ["Importer", "CypressPackage"]
656
+ source: "testScope\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. [ | b | b := a ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09self deny: ast nodes first nodes last scope == ast scope.",
657
+ messageSends: ["parse:", "visit:", "deny:", "==", "scope", "last", "nodes", "first"],
658
+ referencedClasses: []
99
659
  }),
100
- smalltalk.ImporterTest);
660
+ smalltalk.SemanticAnalyzerTest);
101
661
 
102
662
  smalltalk.addMethod(
103
- "_testChunkString",
663
+ "_testScope2",
104
664
  smalltalk.method({
105
- selector: "testChunkString",
665
+ selector: "testScope2",
106
666
  category: 'tests',
107
- fn: function (){
108
- var self=this;
109
- smalltalk.send(smalltalk.send((smalltalk.Importer || Importer), "_new", []), "_import_", [smalltalk.send(smalltalk.send(self, "_chunkString", []), "_readStream", [])]);
110
- smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_methodDictionary", []), "_includesKey_", ["importerTestMethod"])]);
111
- smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Object || Object), "_new", []), "_importerTestMethod", []), "__eq", ["success"])]);
112
- return self;},
667
+ fn: function () {
668
+ var self = this;
669
+ var src;
670
+ var ast;
671
+ src = "foo | a | a + 1. [ [ | b | b := a\xA0] ]";
672
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
673
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
674
+ smalltalk.send(self, "_deny_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_scope", []), "__eq_eq", [smalltalk.send(ast, "_scope", [])])]);
675
+ return self;
676
+ },
113
677
  args: [],
114
- source: "testChunkString\x0a\x0a\x09Importer new import: self chunkString readStream.\x0a\x09self assert: (Object methodDictionary includesKey: 'importerTestMethod').\x0a\x09self assert: (Object new importerTestMethod = 'success').",
115
- messageSends: ["import:", "new", "readStream", "chunkString", "assert:", "includesKey:", "methodDictionary", "=", "importerTestMethod"],
116
- referencedClasses: ["Importer", "Object"]
678
+ source: "testScope2\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. [ [ | b | b := a ] ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09self deny: ast nodes first nodes last nodes first nodes first scope == ast scope.",
679
+ messageSends: ["parse:", "visit:", "deny:", "==", "scope", "first", "nodes", "last"],
680
+ referencedClasses: []
117
681
  }),
118
- smalltalk.ImporterTest);
682
+ smalltalk.SemanticAnalyzerTest);
119
683
 
684
+ smalltalk.addMethod(
685
+ "_testScopeLevel",
686
+ smalltalk.method({
687
+ selector: "testScopeLevel",
688
+ category: 'tests',
689
+ fn: function () {
690
+ var self = this;
691
+ var src;
692
+ var ast;
693
+ src = "foo | a | a + 1. [ [ | b | b := a\xA0] ]";
694
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
695
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
696
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(ast, "_scope", []), "_scopeLevel", []), "__eq", [1])]);
697
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_scope", []), "_scopeLevel", []), "__eq", [3])]);
698
+ return self;
699
+ },
700
+ args: [],
701
+ source: "testScopeLevel\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. [ [ | b | b := a ] ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09self assert: ast scope scopeLevel = 1.\x0a\x09self assert: ast nodes first nodes last nodes first nodes first scope scopeLevel = 3",
702
+ messageSends: ["parse:", "visit:", "assert:", "=", "scopeLevel", "scope", "first", "nodes", "last"],
703
+ referencedClasses: []
704
+ }),
705
+ smalltalk.SemanticAnalyzerTest);
120
706
 
707
+ smalltalk.addMethod(
708
+ "_testUnknownVariables",
709
+ smalltalk.method({
710
+ selector: "testUnknownVariables",
711
+ category: 'tests',
712
+ fn: function () {
713
+ var self = this;
714
+ var src;
715
+ var ast;
716
+ src = "foo | a | b + a";
717
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
718
+ smalltalk.send(self, "_should_raise_", [function () {return smalltalk.send(self['@analyzer'], "_visit_", [ast]);}, smalltalk.UnknownVariableError || UnknownVariableError]);
719
+ return self;
720
+ },
721
+ args: [],
722
+ source: "testUnknownVariables\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | b + a'.\x0a\x09ast := smalltalk parse: src.\x0a\x0a\x09self should: [ analyzer visit: ast ] raise: UnknownVariableError",
723
+ messageSends: ["parse:", "should:raise:", "visit:"],
724
+ referencedClasses: ["UnknownVariableError"]
725
+ }),
726
+ smalltalk.SemanticAnalyzerTest);
121
727
 
122
728
  smalltalk.addMethod(
123
- "_importerLoadMethod",
729
+ "_testUnknownVariablesDefinedInJS",
124
730
  smalltalk.method({
125
- selector: "importerLoadMethod",
126
- category: '*Compiler-Tests',
127
- fn: function (){
128
- var self=this;
129
- return "success";
130
- return self;},
731
+ selector: "testUnknownVariablesDefinedInJS",
732
+ category: 'tests',
733
+ fn: function () {
734
+ var self = this;
735
+ var someVariable = 1;
736
+ smalltalk.send(self, "_shouldnt_raise_", [function () {return smalltalk.send(smalltalk, "_parse_", ["foo someVariable"]);}, smalltalk.UnknownVariableError || UnknownVariableError]);
737
+ return self;
738
+ },
131
739
  args: [],
132
- source: "importerLoadMethod\x0a\x0a\x09^'success'",
133
- messageSends: [],
740
+ source: "testUnknownVariablesDefinedInJS\x0a\x0a\x09< var someVariable = 1 >.\x0a\x0a\x09self shouldnt: [ smalltalk parse: 'foo someVariable' ] raise: UnknownVariableError",
741
+ messageSends: ["shouldnt:raise:", "parse:"],
742
+ referencedClasses: ["UnknownVariableError"]
743
+ }),
744
+ smalltalk.SemanticAnalyzerTest);
745
+
746
+ smalltalk.addMethod(
747
+ "_testUnknownVariablesWithScope",
748
+ smalltalk.method({
749
+ selector: "testUnknownVariablesWithScope",
750
+ category: 'tests',
751
+ fn: function () {
752
+ var self = this;
753
+ var src;
754
+ var ast;
755
+ src = "foo | a b | [ c + 1. [ a + 1. d + 1 ]]";
756
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
757
+ smalltalk.send(self, "_should_raise_", [function () {return smalltalk.send(self['@analyzer'], "_visit_", [ast]);}, smalltalk.UnknownVariableError || UnknownVariableError]);
758
+ return self;
759
+ },
760
+ args: [],
761
+ source: "testUnknownVariablesWithScope\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a b | [ c + 1. [ a + 1. d + 1 ]]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09\x0a\x09self should: [ analyzer visit: ast ] raise: UnknownVariableError",
762
+ messageSends: ["parse:", "should:raise:", "visit:"],
763
+ referencedClasses: ["UnknownVariableError"]
764
+ }),
765
+ smalltalk.SemanticAnalyzerTest);
766
+
767
+ smalltalk.addMethod(
768
+ "_testVariableShadowing",
769
+ smalltalk.method({
770
+ selector: "testVariableShadowing",
771
+ category: 'tests',
772
+ fn: function () {
773
+ var self = this;
774
+ var src;
775
+ var ast;
776
+ src = "foo | a | a + 1";
777
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
778
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
779
+ return self;
780
+ },
781
+ args: [],
782
+ source: "testVariableShadowing\x0a\x09| src ast |\x0a\x09src := 'foo | a | a + 1'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast",
783
+ messageSends: ["parse:", "visit:"],
134
784
  referencedClasses: []
135
785
  }),
136
- smalltalk.Object);
786
+ smalltalk.SemanticAnalyzerTest);
787
+
788
+ smalltalk.addMethod(
789
+ "_testVariableShadowing2",
790
+ smalltalk.method({
791
+ selector: "testVariableShadowing2",
792
+ category: 'tests',
793
+ fn: function () {
794
+ var self = this;
795
+ var src;
796
+ var ast;
797
+ src = "foo | a | a + 1. [ | a | a := 2 ]";
798
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
799
+ smalltalk.send(self, "_should_raise_", [function () {return smalltalk.send(self['@analyzer'], "_visit_", [ast]);}, smalltalk.ShadowingVariableError || ShadowingVariableError]);
800
+ return self;
801
+ },
802
+ args: [],
803
+ source: "testVariableShadowing2\x0a\x09| src ast |\x0a\x09src := 'foo | a | a + 1. [ | a | a := 2 ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09self should: [analyzer visit: ast] raise: ShadowingVariableError",
804
+ messageSends: ["parse:", "should:raise:", "visit:"],
805
+ referencedClasses: ["ShadowingVariableError"]
806
+ }),
807
+ smalltalk.SemanticAnalyzerTest);
808
+
809
+ smalltalk.addMethod(
810
+ "_testVariableShadowing3",
811
+ smalltalk.method({
812
+ selector: "testVariableShadowing3",
813
+ category: 'tests',
814
+ fn: function () {
815
+ var self = this;
816
+ var src;
817
+ var ast;
818
+ src = "foo | a | a + 1. [ | b | b := 2 ]";
819
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
820
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
821
+ return self;
822
+ },
823
+ args: [],
824
+ source: "testVariableShadowing3\x0a\x09| src ast |\x0a\x09src := 'foo | a | a + 1. [ | b | b := 2 ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast",
825
+ messageSends: ["parse:", "visit:"],
826
+ referencedClasses: []
827
+ }),
828
+ smalltalk.SemanticAnalyzerTest);
829
+
830
+ smalltalk.addMethod(
831
+ "_testVariableShadowing4",
832
+ smalltalk.method({
833
+ selector: "testVariableShadowing4",
834
+ category: 'tests',
835
+ fn: function () {
836
+ var self = this;
837
+ var src;
838
+ var ast;
839
+ src = "foo | a | a + 1. [ [\xA0[ | b | b := 2 ]\xA0]\xA0]";
840
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
841
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
842
+ return self;
843
+ },
844
+ args: [],
845
+ source: "testVariableShadowing4\x0a\x09| src ast |\x0a\x09src := 'foo | a | a + 1. [ [ [ | b | b := 2 ] ] ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast",
846
+ messageSends: ["parse:", "visit:"],
847
+ referencedClasses: []
848
+ }),
849
+ smalltalk.SemanticAnalyzerTest);
850
+
851
+ smalltalk.addMethod(
852
+ "_testVariableShadowing5",
853
+ smalltalk.method({
854
+ selector: "testVariableShadowing5",
855
+ category: 'tests',
856
+ fn: function () {
857
+ var self = this;
858
+ var src;
859
+ var ast;
860
+ src = "foo | a | a + 1. [ [\xA0[ | a | a := 2 ]\xA0]\xA0]";
861
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
862
+ smalltalk.send(self, "_should_raise_", [function () {return smalltalk.send(self['@analyzer'], "_visit_", [ast]);}, smalltalk.ShadowingVariableError || ShadowingVariableError]);
863
+ return self;
864
+ },
865
+ args: [],
866
+ source: "testVariableShadowing5\x0a\x09| src ast |\x0a\x09src := 'foo | a | a + 1. [ [ [ | a | a := 2 ] ] ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09self should: [analyzer visit: ast] raise: ShadowingVariableError",
867
+ messageSends: ["parse:", "should:raise:", "visit:"],
868
+ referencedClasses: ["ShadowingVariableError"]
869
+ }),
870
+ smalltalk.SemanticAnalyzerTest);
871
+
872
+ smalltalk.addMethod(
873
+ "_testVariablesLookup",
874
+ smalltalk.method({
875
+ selector: "testVariablesLookup",
876
+ category: 'tests',
877
+ fn: function () {
878
+ var self = this;
879
+ var src;
880
+ var ast;
881
+ src = "foo | a | a + 1. [ | b | b := a ]";
882
+ ast = smalltalk.send(smalltalk, "_parse_", [src]);
883
+ smalltalk.send(self['@analyzer'], "_visit_", [ast]);
884
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_receiver", []), "_binding", []), "_isTempVar", [])]);
885
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_receiver", []), "_binding", []), "_scope", []), "__eq_eq", [smalltalk.send(ast, "_scope", [])])]);
886
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_left", []), "_binding", []), "_isTempVar", [])]);
887
+ smalltalk.send(self, "_assert_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_nodes", []), "_first", []), "_nodes", []), "_first", []), "_left", []), "_binding", []), "_scope", []), "__eq_eq", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(ast, "_nodes", []), "_first", []), "_nodes", []), "_last", []), "_scope", [])])]);
888
+ return self;
889
+ },
890
+ args: [],
891
+ source: "testVariablesLookup\x0a\x09| src ast |\x0a\x0a\x09src := 'foo | a | a + 1. [ | b | b := a ]'.\x0a\x09ast := smalltalk parse: src.\x0a\x09analyzer visit: ast.\x0a\x0a\x09\x22Binding for `a` in the message send\x22\x0a\x09self assert: ast nodes first nodes first receiver binding isTempVar.\x0a\x09self assert: ast nodes first nodes first receiver binding scope == ast scope.\x0a\x0a\x09\x22Binding for `b`\x22\x0a\x09self assert: ast nodes first nodes last nodes first nodes first left binding isTempVar.\x0a\x09self assert: ast nodes first nodes last nodes first nodes first left binding scope == ast nodes first nodes last scope.",
892
+ messageSends: ["parse:", "visit:", "assert:", "isTempVar", "binding", "receiver", "first", "nodes", "==", "scope", "left", "last"],
893
+ referencedClasses: []
894
+ }),
895
+ smalltalk.SemanticAnalyzerTest);
896
+
897
+
137
898