resin 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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