浏览代码

Merge remote-tracking branch 'gokr/master'

Nicolas Petton 13 年之前
父节点
当前提交
66b7d224ac
共有 16 个文件被更改,包括 1432 次插入1850 次删除
  1. 76 76
      js/Canvas.js
  2. 103 87
      js/Compiler.js
  3. 158 158
      js/Examples.js
  4. 245 183
      js/IDE.js
  5. 137 137
      js/JQuery.js
  6. 132 114
      js/Kernel.js
  7. 104 74
      js/Parser.js
  8. 316 316
      js/SUnit.js
  9. 9 84
      st/Canvas.st
  10. 9 83
      st/Compiler.st
  11. 3 7
      st/Examples.st
  12. 21 123
      st/IDE.st
  13. 10 51
      st/JQuery.st
  14. 15 246
      st/Kernel.st
  15. 91 104
      st/Parser.st
  16. 3 7
      st/SUnit.st

+ 76 - 76
js/Canvas.js

@@ -113,7 +113,7 @@ fn: function (aPoint, aNumber, aNumber2, aNumber3, aBoolean){
 var self=this;
 self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean);
 return self;},
-source: unescape('arcTo%3A%20aPoint%20radius%3A%20aNumber%20startAngle%3A%20aNumber2%20endAngle%3A%20aNumber3%20anticlockwise%3A%20aBoolean%0A%09%7B%27self.arc%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20aNumber%2C%20aNumber2%2C%20aNumber3%2C%20aBoolean%29%27%7D%20'),
+source: unescape('arcTo%3A%20aPoint%20radius%3A%20aNumber%20startAngle%3A%20aNumber2%20endAngle%3A%20aNumber3%20anticlockwise%3A%20aBoolean%0A%09%7B%27self.arc%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20aNumber%2C%20aNumber2%2C%20aNumber3%2C%20aBoolean%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -236,7 +236,7 @@ fn: function (aTagBrush){
 var self=this;
 self['@root']=aTagBrush;
 return self;},
-source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush%0A'),
+source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -251,7 +251,7 @@ fn: function (){
 var self=this;
 return self['@root'];
 return self;},
-source: unescape('root%0A%20%20%20%20%5Eroot%0A'),
+source: unescape('root%0A%20%20%20%20%5Eroot'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -267,9 +267,9 @@ var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 self['@root']=smalltalk.send(smalltalk.TagBrush, "_fromString_canvas_", ["div", self]);
 return self;},
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%0A'),
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self'),
 messageSends: ["initialize", "fromString:canvas:"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: [smalltalk.TagBrush]
 }),
 smalltalk.HTMLCanvas);
 
@@ -282,7 +282,7 @@ fn: function (anObject){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
 return self;},
-source: unescape('with%3A%20anObject%0A%20%20%20%20%5Eself%20root%20with%3A%20anObject%0A'),
+source: unescape('with%3A%20anObject%0A%20%20%20%20%5Eself%20root%20with%3A%20anObject'),
 messageSends: ["with:", "root"],
 referencedClasses: []
 }),
@@ -297,9 +297,9 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(smalltalk.TagBrush, "_fromString_canvas_", [aString, self]);
 return self;},
-source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self%0A'),
+source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self'),
 messageSends: ["fromString:canvas:"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: [smalltalk.TagBrush]
 }),
 smalltalk.HTMLCanvas);
 
@@ -312,7 +312,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
 return self;},
-source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29%0A'),
+source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29'),
 messageSends: ["addBrush:", "newTag:"],
 referencedClasses: []
 }),
@@ -327,7 +327,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h1"]);
 return self;},
-source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27%0A'),
+source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -342,7 +342,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h2"]);
 return self;},
-source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27%0A'),
+source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -357,7 +357,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h3"]);
 return self;},
-source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27%0A'),
+source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -372,7 +372,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h4"]);
 return self;},
-source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27%0A'),
+source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -387,7 +387,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h5"]);
 return self;},
-source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27%0A'),
+source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -402,7 +402,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h6"]);
 return self;},
-source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27%0A'),
+source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -417,7 +417,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["p"]);
 return self;},
-source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27%0A'),
+source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -432,7 +432,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["div"]);
 return self;},
-source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27%0A'),
+source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -447,7 +447,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["span"]);
 return self;},
-source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27%0A'),
+source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -462,7 +462,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["img"]);
 return self;},
-source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27%0A'),
+source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -477,7 +477,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["ul"]);
 return self;},
-source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27%0A'),
+source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -492,7 +492,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["ol"]);
 return self;},
-source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27%0A'),
+source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -507,7 +507,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["li"]);
 return self;},
-source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27%0A'),
+source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -522,7 +522,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["table"]);
 return self;},
-source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27%0A'),
+source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -537,7 +537,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["tr"]);
 return self;},
-source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27%0A'),
+source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -552,7 +552,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["td"]);
 return self;},
-source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27%0A'),
+source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -567,7 +567,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["th"]);
 return self;},
-source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27%0A'),
+source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -582,7 +582,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["form"]);
 return self;},
-source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27%0A'),
+source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -597,7 +597,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["input"]);
 return self;},
-source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27%0A'),
+source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -612,7 +612,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["button"]);
 return self;},
-source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27%0A'),
+source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -627,7 +627,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["select"]);
 return self;},
-source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27%0A'),
+source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -642,7 +642,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["option"]);
 return self;},
-source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27%0A'),
+source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -657,7 +657,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["textarea"]);
 return self;},
-source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27%0A'),
+source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -672,7 +672,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["a"]);
 return self;},
-source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27%0A'),
+source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -687,7 +687,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["canvas"]);
 return self;},
-source: unescape('canvas%0A%09%5Eself%20tag%3A%20%27canvas%27%0A'),
+source: unescape('canvas%0A%09%5Eself%20tag%3A%20%27canvas%27'),
 messageSends: ["tag:"],
 referencedClasses: []
 }),
@@ -706,7 +706,7 @@ var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
 smalltalk.send(self, "_append_", [anObject]);
 return self;},
-source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20asJQuery%20empty.%0A%20%20%20%20self%20append%3A%20anObject%0A'),
+source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20asJQuery%20empty.%0A%20%20%20%20self%20append%3A%20anObject'),
 messageSends: ["empty", "asJQuery", "append:"],
 referencedClasses: []
 }),
@@ -722,7 +722,7 @@ var self=this;
 smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
 return aTagBrush;
 return self;},
-source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush%0A'),
+source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush'),
 messageSends: ["appendChild:", "element"],
 referencedClasses: []
 }),
@@ -737,7 +737,7 @@ fn: function (anObject){
 var self=this;
 smalltalk.send(self, "_append_", [anObject]);
 return self;},
-source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject%0A'),
+source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject'),
 messageSends: ["append:"],
 referencedClasses: []
 }),
@@ -752,7 +752,7 @@ fn: function (anObject){
 var self=this;
 smalltalk.send(anObject, "_appendToBrush_", [self]);
 return self;},
-source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self%0A'),
+source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self'),
 messageSends: ["appendToBrush:"],
 referencedClasses: []
 }),
@@ -767,7 +767,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_addBrush_", [self]);
 return self;},
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self%0A'),
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self'),
 messageSends: ["addBrush:"],
 referencedClasses: []
 }),
@@ -786,7 +786,7 @@ smalltalk.send(self['@canvas'], "_root_", [self]);
 smalltalk.send(aBlock, "_value_", [self['@canvas']]);
 smalltalk.send(self['@canvas'], "_root_", [root]);
 return self;},
-source: unescape('appendBlock%3A%20aBlock%0A%20%20%20%20%7C%20root%20%7C%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20canvas%20root%3A%20self.%0A%20%20%20%20aBlock%20value%3A%20canvas.%0A%20%20%20%20canvas%20root%3A%20root%0A'),
+source: unescape('appendBlock%3A%20aBlock%0A%20%20%20%20%7C%20root%20%7C%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20canvas%20root%3A%20self.%0A%20%20%20%20aBlock%20value%3A%20canvas.%0A%20%20%20%20canvas%20root%3A%20root'),
 messageSends: ["root", "root:", "value:"],
 referencedClasses: []
 }),
@@ -801,7 +801,7 @@ fn: function (anElement){
 var self=this;
 self['@element'].appendChild(anElement);
 return self;},
-source: unescape('appendChild%3A%20anElement%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.appendChild%28anElement%29%27%7D%0A'),
+source: unescape('appendChild%3A%20anElement%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.appendChild%28anElement%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -816,7 +816,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
 return self;},
-source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29%0A'),
+source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29'),
 messageSends: ["appendChild:", "createTextNodeFor:"],
 referencedClasses: []
 }),
@@ -831,7 +831,7 @@ fn: function (aString, aValue){
 var self=this;
 self['@element'].setAttribute(aString, aValue);
 return self;},
-source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.setAttribute%28aString%2C%20aValue%29%27%7D%0A'),
+source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.setAttribute%28aString%2C%20aValue%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -846,7 +846,7 @@ fn: function (aString){
 var self=this;
 self['@element'].removeAttribute(aString);
 return self;},
-source: unescape('removeAt%3A%20aString%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.removeAttribute%28aString%29%27%7D%0A'),
+source: unescape('removeAt%3A%20aString%0A%20%20%20%20%7B%27self%5B%27%27@element%27%27%5D.removeAttribute%28aString%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -861,7 +861,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["class", aString]);
 return self;},
-source: unescape('class%3A%20aString%0A%20%20%20%20self%20at%3A%20%27class%27%20put%3A%20aString%0A'),
+source: unescape('class%3A%20aString%0A%20%20%20%20self%20at%3A%20%27class%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -876,7 +876,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["id", aString]);
 return self;},
-source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString%0A'),
+source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -891,7 +891,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["src", aString]);
 return self;},
-source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString%0A'),
+source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -906,7 +906,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["href", aString]);
 return self;},
-source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString%0A'),
+source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -921,7 +921,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["title", aString]);
 return self;},
-source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString%0A'),
+source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -936,7 +936,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["style", aString]);
 return self;},
-source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString%0A'),
+source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -952,7 +952,7 @@ var self=this;
 self['@element']=smalltalk.send(self, "_createElementFor_", [aString]);
 self['@canvas']=aCanvas;
 return self;},
-source: unescape('initializeFromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20self%20createElementFor%3A%20aString.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas%0A'),
+source: unescape('initializeFromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20self%20createElementFor%3A%20aString.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
 messageSends: ["createElementFor:"],
 referencedClasses: []
 }),
@@ -967,7 +967,7 @@ fn: function (){
 var self=this;
 return self['@element'];
 return self;},
-source: unescape('element%0A%20%20%20%20%5Eelement%0A'),
+source: unescape('element%0A%20%20%20%20%5Eelement'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -982,7 +982,7 @@ fn: function (){
 var self=this;
 return smalltalk.JQuery._from_(jQuery(self['@element']));
 return self;},
-source: unescape('asJQuery%0A%09%7B%27return%20smalltalk.JQuery._from_%28jQuery%28self%5B%27%27@element%27%27%5D%29%29%27%7D%0A'),
+source: unescape('asJQuery%0A%09%7B%27return%20smalltalk.JQuery._from_%28jQuery%28self%5B%27%27@element%27%27%5D%29%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -997,7 +997,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_asJQuery", [])]);
 return self;},
-source: unescape('asJQueryDo%3A%20aBlock%0A%20%20%20%20aBlock%20value%3A%20self%20asJQuery%0A'),
+source: unescape('asJQueryDo%3A%20aBlock%0A%20%20%20%20aBlock%20value%3A%20self%20asJQuery'),
 messageSends: ["value:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1012,7 +1012,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keydown", aBlock]);
 return self;},
-source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keydown%27%20do%3A%20aBlock%0A'),
+source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keydown%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1027,7 +1027,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keypress", aBlock]);
 return self;},
-source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keypress%27%20do%3A%20aBlock%0A'),
+source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keypress%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1042,7 +1042,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keyup", aBlock]);
 return self;},
-source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keyup%27%20do%3A%20aBlock%0A'),
+source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keyup%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1057,7 +1057,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["focus", aBlock]);
 return self;},
-source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27focus%27%20do%3A%20aBlock%0A'),
+source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27focus%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1072,7 +1072,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["blur", aBlock]);
 return self;},
-source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27blur%27%20do%3A%20aBlock%0A'),
+source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27blur%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1087,7 +1087,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["change", aBlock]);
 return self;},
-source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27change%27%20do%3A%20aBlock%0A'),
+source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27change%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1102,7 +1102,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["click", aBlock]);
 return self;},
-source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27click%27%20do%3A%20aBlock%0A'),
+source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27click%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1117,7 +1117,7 @@ fn: function (aString){
 var self=this;
 return document.createElement(String(aString));
 return self;},
-source: unescape('createElementFor%3A%20aString%0A%09%7B%27return%20document.createElement%28String%28aString%29%29%27%7D%0A'),
+source: unescape('createElementFor%3A%20aString%0A%09%7B%27return%20document.createElement%28String%28aString%29%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1132,7 +1132,7 @@ fn: function (aString){
 var self=this;
 return document.createTextNode(String(aString));
 return self;},
-source: unescape('createTextNodeFor%3A%20aString%0A%09%7B%27return%20document.createTextNode%28String%28aString%29%29%27%7D%0A'),
+source: unescape('createTextNodeFor%3A%20aString%0A%09%7B%27return%20document.createTextNode%28String%28aString%29%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1148,7 +1148,7 @@ fn: function (aString, aCanvas){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_initializeFromString_canvas_", [aString, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-source: unescape('fromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromString%3A%20aString%20canvas%3A%20aCanvas%3B%0A%09yourself%0A'),
+source: unescape('fromString%3A%20aString%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromString%3A%20aString%20canvas%3A%20aCanvas%3B%0A%09yourself'),
 messageSends: ["initializeFromString:canvas:", "yourself", "new"],
 referencedClasses: []
 }),
@@ -1165,7 +1165,7 @@ fn: function (){
 var self=this;
 return self['@root'];
 return self;},
-source: unescape('root%0A%20%20%20%20%5Eroot%0A'),
+source: unescape('root%0A%20%20%20%20%5Eroot'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1180,7 +1180,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
 return self;},
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery%0A'),
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery'),
 messageSends: ["appendToJQuery:", "asJQuery"],
 referencedClasses: []
 }),
@@ -1196,7 +1196,7 @@ var self=this;
 smalltalk.send(self, "_render", []);
 smalltalk.send(aJQuery, "_append_", [smalltalk.send(smalltalk.send(self, "_root", []), "_asJQuery", [])]);
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20render.%0A%20%20%20%20aJQuery%20append%3A%20self%20root%20asJQuery%0A'),
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20self%20render.%0A%20%20%20%20aJQuery%20append%3A%20self%20root%20asJQuery'),
 messageSends: ["render", "append:", "asJQuery", "root"],
 referencedClasses: []
 }),
@@ -1211,7 +1211,7 @@ fn: function (aString){
 var self=this;
 alert(aString);
 return self;},
-source: unescape('alert%3A%20aString%0A%20%20%20%20%7B%27alert%28aString%29%27%7D%0A'),
+source: unescape('alert%3A%20aString%0A%20%20%20%20%7B%27alert%28aString%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1226,7 +1226,7 @@ fn: function (aString){
 var self=this;
 return window.confirm(aString);
 return self;},
-source: unescape('confirm%3A%20aString%0A%20%20%20%20%7B%27return%20window.confirm%28aString%29%27%7D%0A'),
+source: unescape('confirm%3A%20aString%0A%20%20%20%20%7B%27return%20window.confirm%28aString%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1241,7 +1241,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_prompt_default_", [aString, ""]);
 return self;},
-source: unescape('prompt%3A%20aString%0A%20%20%20%20%5Eself%20prompt%3A%20aString%20default%3A%20%27%27%0A'),
+source: unescape('prompt%3A%20aString%0A%20%20%20%20%5Eself%20prompt%3A%20aString%20default%3A%20%27%27'),
 messageSends: ["prompt:default:"],
 referencedClasses: []
 }),
@@ -1256,7 +1256,7 @@ fn: function (aString, anotherString){
 var self=this;
 return window.prompt(aString, anotherString);
 return self;},
-source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%7B%27return%20window.prompt%28aString%2C%20anotherString%29%27%7D%0A'),
+source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%7B%27return%20window.prompt%28aString%2C%20anotherString%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1275,7 +1275,7 @@ smalltalk.send(canvas, "_root_", [smalltalk.send(self, "_root", [])]);
 smalltalk.send(smalltalk.send(smalltalk.send(self, "_root", []), "_asJQuery", []), "_empty", []);
 smalltalk.send(self, "_renderOn_", [canvas]);
 return self;},
-source: unescape('update%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20canvas%20root%3A%20self%20root.%0A%20%20%20%20self%20root%20asJQuery%20empty.%0A%20%20%20%20self%20renderOn%3A%20canvas%0A'),
+source: unescape('update%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20canvas%20root%3A%20self%20root.%0A%20%20%20%20self%20root%20asJQuery%20empty.%0A%20%20%20%20self%20renderOn%3A%20canvas'),
 messageSends: ["new", "root:", "root", "empty", "asJQuery", "renderOn:"],
 referencedClasses: [smalltalk.HTMLCanvas]
 }),
@@ -1293,7 +1293,7 @@ canvas=smalltalk.send(smalltalk.HTMLCanvas, "_new", []);
 self['@root']=smalltalk.send(canvas, "_root", []);
 smalltalk.send(self, "_renderOn_", [canvas]);
 return self;},
-source: unescape('render%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20self%20renderOn%3A%20canvas%0A'),
+source: unescape('render%0A%20%20%20%20%7C%20canvas%20%7C%0A%20%20%20%20canvas%20%3A%3D%20HTMLCanvas%20new.%0A%20%20%20%20root%20%3A%3D%20canvas%20root.%0A%20%20%20%20self%20renderOn%3A%20canvas'),
 messageSends: ["new", "root", "renderOn:"],
 referencedClasses: [smalltalk.HTMLCanvas]
 }),
@@ -1308,7 +1308,7 @@ fn: function (html){
 var self=this;
 self;
 return self;},
-source: unescape('renderOn%3A%20html%0A%20%20%20%20self%0A'),
+source: unescape('renderOn%3A%20html%0A%20%20%20%20self'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1373,7 +1373,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_append_", [smalltalk.send(self, "_asString", [])]);
 return self;},
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20append%3A%20self%20asString%0A'),
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20append%3A%20self%20asString'),
 messageSends: ["append:", "asString"],
 referencedClasses: []
 }),
@@ -1403,7 +1403,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_appendString_", [self]);
 return self;},
-source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self%0A'),
+source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self'),
 messageSends: ["appendString:"],
 referencedClasses: []
 }),

+ 103 - 87
js/Compiler.js

@@ -8,7 +8,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@nodes'], "_ifNil_", [(function(){return self['@nodes']=smalltalk.send(smalltalk.Array, "_new", []);})]);
 return self;},
-source: unescape('nodes%0A%09%5Enodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20Array%20new%5D%0A'),
+source: unescape('nodes%0A%09%5Enodes%20ifNil%3A%20%5Bnodes%20%3A%3D%20Array%20new%5D'),
 messageSends: ["ifNil:", "new"],
 referencedClasses: [smalltalk.Array]
 }),
@@ -23,7 +23,7 @@ fn: function (aCollection){
 var self=this;
 self['@nodes']=aCollection;
 return self;},
-source: unescape('nodes%3A%20aCollection%0A%09nodes%20%3A%3D%20aCollection%0A'),
+source: unescape('nodes%3A%20aCollection%0A%09nodes%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -38,7 +38,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_nodes", []), "_add_", [aNode]);
 return self;},
-source: unescape('addNode%3A%20aNode%0A%09self%20nodes%20add%3A%20aNode%0A'),
+source: unescape('addNode%3A%20aNode%0A%09self%20nodes%20add%3A%20aNode'),
 messageSends: ["add:", "nodes"],
 referencedClasses: []
 }),
@@ -53,7 +53,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitNode%3A%20self'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -71,7 +71,7 @@ fn: function (){
 var self=this;
 return self['@selector'];
 return self;},
-source: unescape('selector%0A%09%5Eselector%0A'),
+source: unescape('selector%0A%09%5Eselector'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -86,7 +86,7 @@ fn: function (aString){
 var self=this;
 self['@selector']=aString;
 return self;},
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString%0A'),
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -101,7 +101,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@arguments'], "_ifNil_", [(function(){return [];})]);
 return self;},
-source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5B%23%28%29%5D%0A'),
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5B%23%28%29%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
 }),
@@ -116,7 +116,7 @@ fn: function (aCollection){
 var self=this;
 self['@arguments']=aCollection;
 return self;},
-source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection%0A'),
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -131,7 +131,7 @@ fn: function (){
 var self=this;
 return self['@source'];
 return self;},
-source: unescape('source%0A%09%5Esource%0A'),
+source: unescape('source%0A%09%5Esource'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -146,7 +146,7 @@ fn: function (aString){
 var self=this;
 self['@source']=aString;
 return self;},
-source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString%0A'),
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -161,7 +161,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitMethodNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitMethodNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitMethodNode%3A%20self'),
 messageSends: ["visitMethodNode:"],
 referencedClasses: []
 }),
@@ -179,7 +179,7 @@ fn: function (){
 var self=this;
 return self['@selector'];
 return self;},
-source: unescape('selector%0A%09%5Eselector%0A'),
+source: unescape('selector%0A%09%5Eselector'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -194,7 +194,7 @@ fn: function (aString){
 var self=this;
 self['@selector']=aString;
 return self;},
-source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString%0A'),
+source: unescape('selector%3A%20aString%0A%09selector%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -209,7 +209,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@arguments'], "_ifNil_", [(function(){return self['@arguments']=[];})]);
 return self;},
-source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5Barguments%20%3A%3D%20%23%28%29%5D%0A'),
+source: unescape('arguments%0A%09%5Earguments%20ifNil%3A%20%5Barguments%20%3A%3D%20%23%28%29%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
 }),
@@ -224,7 +224,7 @@ fn: function (aCollection){
 var self=this;
 self['@arguments']=aCollection;
 return self;},
-source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection%0A'),
+source: unescape('arguments%3A%20aCollection%0A%09arguments%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -239,7 +239,7 @@ fn: function (){
 var self=this;
 return self['@receiver'];
 return self;},
-source: unescape('receiver%0A%09%5Ereceiver%0A'),
+source: unescape('receiver%0A%09%5Ereceiver'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -254,7 +254,7 @@ fn: function (aNode){
 var self=this;
 self['@receiver']=aNode;
 return self;},
-source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode%0A'),
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -269,7 +269,7 @@ fn: function (anObject){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(smalltalk.send(self, "_receiver", []), "_ifNil_ifNotNil_", [(function(){return anObject;}), (function(){return smalltalk.send(smalltalk.send(self, "_receiver", []), "_valueForReceiver_", [anObject]);})])]);smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.SendNode, "_new", []));
 return self;},
-source: unescape('valueForReceiver%3A%20anObject%0A%09%5ESendNode%20new%0A%09%20%20%20%20receiver%3A%20%28self%20receiver%20%0A%09%09ifNil%3A%20%5BanObject%5D%0A%09%09ifNotNil%3A%20%5Bself%20receiver%20valueForReceiver%3A%20anObject%5D%29%3B%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself%0A'),
+source: unescape('valueForReceiver%3A%20anObject%0A%09%5ESendNode%20new%0A%09%20%20%20%20receiver%3A%20%28self%20receiver%20%0A%09%09ifNil%3A%20%5BanObject%5D%0A%09%09ifNotNil%3A%20%5Bself%20receiver%20valueForReceiver%3A%20anObject%5D%29%3B%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself'),
 messageSends: ["receiver:", "ifNil:ifNotNil:", "receiver", "valueForReceiver:", "selector:", "selector", "arguments:", "arguments", "yourself", "new"],
 referencedClasses: [smalltalk.SendNode]
 }),
@@ -286,9 +286,9 @@ var first=nil;
 first=(function($rec){smalltalk.send($rec, "_selector_", [smalltalk.send(self, "_selector", [])]);smalltalk.send($rec, "_arguments_", [smalltalk.send(self, "_arguments", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.SendNode, "_new", []));
 return (function($rec){smalltalk.send($rec, "_receiver_", [smalltalk.send(self, "_receiver", [])]);smalltalk.send($rec, "_nodes_", [smalltalk.send(smalltalk.send(smalltalk.Array, "_with_", [first]), "__comma", [aCollection])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.CascadeNode, "_new", []));
 return self;},
-source: unescape('cascadeNodeWithMessages%3A%20aCollection%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20SendNode%20new%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself.%0A%09%5ECascadeNode%20new%0A%09%20%20%20%20receiver%3A%20self%20receiver%3B%0A%09%20%20%20%20nodes%3A%20%28Array%20with%3A%20first%29%2C%20aCollection%3B%0A%09%20%20%20%20yourself%0A'),
+source: unescape('cascadeNodeWithMessages%3A%20aCollection%0A%09%7C%20first%20%7C%0A%09first%20%3A%3D%20SendNode%20new%0A%09%20%20%20%20selector%3A%20self%20selector%3B%0A%09%20%20%20%20arguments%3A%20self%20arguments%3B%0A%09%20%20%20%20yourself.%0A%09%5ECascadeNode%20new%0A%09%20%20%20%20receiver%3A%20self%20receiver%3B%0A%09%20%20%20%20nodes%3A%20%28Array%20with%3A%20first%29%2C%20aCollection%3B%0A%09%20%20%20%20yourself'),
 messageSends: ["selector:", "selector", "arguments:", "arguments", "yourself", "new", "receiver:", "receiver", "nodes:", unescape("%2C"), "with:"],
-referencedClasses: [smalltalk.SendNode,smalltalk.Array,smalltalk.nil]
+referencedClasses: [smalltalk.SendNode,smalltalk.Array,smalltalk.CascadeNode]
 }),
 smalltalk.SendNode);
 
@@ -301,7 +301,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitSendNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSendNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSendNode%3A%20self'),
 messageSends: ["visitSendNode:"],
 referencedClasses: []
 }),
@@ -319,7 +319,7 @@ fn: function (){
 var self=this;
 return self['@receiver'];
 return self;},
-source: unescape('receiver%0A%09%5Ereceiver%0A'),
+source: unescape('receiver%0A%09%5Ereceiver'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -334,7 +334,7 @@ fn: function (aNode){
 var self=this;
 self['@receiver']=aNode;
 return self;},
-source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode%0A'),
+source: unescape('receiver%3A%20aNode%0A%09receiver%20%3A%3D%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -349,7 +349,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitCascadeNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitCascadeNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitCascadeNode%3A%20self'),
 messageSends: ["visitCascadeNode:"],
 referencedClasses: []
 }),
@@ -367,7 +367,7 @@ fn: function (){
 var self=this;
 return self['@left'];
 return self;},
-source: unescape('left%0A%09%5Eleft%0A'),
+source: unescape('left%0A%09%5Eleft'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -382,7 +382,7 @@ fn: function (aNode){
 var self=this;
 self['@left']=aNode;
 return self;},
-source: unescape('left%3A%20aNode%0A%09left%20%3A%3D%20aNode%0A'),
+source: unescape('left%3A%20aNode%0A%09left%20%3A%3D%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -397,7 +397,7 @@ fn: function (){
 var self=this;
 return self['@right'];
 return self;},
-source: unescape('right%0A%09%5Eright%0A'),
+source: unescape('right%0A%09%5Eright'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -412,7 +412,7 @@ fn: function (aNode){
 var self=this;
 self['@right']=aNode;
 return self;},
-source: unescape('right%3A%20aNode%0A%09right%20%3A%3D%20aNode%0A'),
+source: unescape('right%3A%20aNode%0A%09right%20%3A%3D%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -427,7 +427,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitAssignmentNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitAssignmentNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitAssignmentNode%3A%20self'),
 messageSends: ["visitAssignmentNode:"],
 referencedClasses: []
 }),
@@ -445,7 +445,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@parameters'], "_ifNil_", [(function(){return self['@parameters']=smalltalk.send(smalltalk.Array, "_new", []);})]);
 return self;},
-source: unescape('parameters%0A%09%5Eparameters%20ifNil%3A%20%5Bparameters%20%3A%3D%20Array%20new%5D%0A'),
+source: unescape('parameters%0A%09%5Eparameters%20ifNil%3A%20%5Bparameters%20%3A%3D%20Array%20new%5D'),
 messageSends: ["ifNil:", "new"],
 referencedClasses: [smalltalk.Array]
 }),
@@ -460,7 +460,7 @@ fn: function (aCollection){
 var self=this;
 self['@parameters']=aCollection;
 return self;},
-source: unescape('parameters%3A%20aCollection%0A%09parameters%20%3A%3D%20aCollection%0A'),
+source: unescape('parameters%3A%20aCollection%0A%09parameters%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -475,7 +475,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitBlockNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockNode%3A%20self'),
 messageSends: ["visitBlockNode:"],
 referencedClasses: []
 }),
@@ -493,7 +493,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@temps'], "_ifNil_", [(function(){return [];})]);
 return self;},
-source: unescape('temps%0A%09%5Etemps%20ifNil%3A%20%5B%23%28%29%5D%0A'),
+source: unescape('temps%0A%09%5Etemps%20ifNil%3A%20%5B%23%28%29%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
 }),
@@ -508,7 +508,7 @@ fn: function (aCollection){
 var self=this;
 self['@temps']=aCollection;
 return self;},
-source: unescape('temps%3A%20aCollection%0A%09temps%20%3A%3D%20aCollection%0A'),
+source: unescape('temps%3A%20aCollection%0A%09temps%20%3A%3D%20aCollection'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -523,9 +523,9 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_nodes_", [smalltalk.send(self, "_nodes", [])]);smalltalk.send($rec, "_temps_", [smalltalk.send(self, "_temps", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(smalltalk.BlockSequenceNode, "_new", []));
 return self;},
-source: unescape('asBlockSequenceNode%0A%09%5EBlockSequenceNode%20new%0A%09%20%20%20%20nodes%3A%20self%20nodes%3B%0A%09%20%20%20%20temps%3A%20self%20temps%3B%0A%09%20%20%20%20yourself%0A'),
+source: unescape('asBlockSequenceNode%0A%09%5EBlockSequenceNode%20new%0A%09%20%20%20%20nodes%3A%20self%20nodes%3B%0A%09%20%20%20%20temps%3A%20self%20temps%3B%0A%09%20%20%20%20yourself'),
 messageSends: ["nodes:", "nodes", "temps:", "temps", "yourself", "new"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: [smalltalk.BlockSequenceNode]
 }),
 smalltalk.SequenceNode);
 
@@ -538,7 +538,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitSequenceNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSequenceNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitSequenceNode%3A%20self'),
 messageSends: ["visitSequenceNode:"],
 referencedClasses: []
 }),
@@ -556,7 +556,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitBlockSequenceNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockSequenceNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitBlockSequenceNode%3A%20self'),
 messageSends: ["visitBlockSequenceNode:"],
 referencedClasses: []
 }),
@@ -574,7 +574,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitReturnNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitReturnNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitReturnNode%3A%20self'),
 messageSends: ["visitReturnNode:"],
 referencedClasses: []
 }),
@@ -592,7 +592,7 @@ fn: function (){
 var self=this;
 return self['@value'];
 return self;},
-source: unescape('value%0A%09%5Evalue%0A'),
+source: unescape('value%0A%09%5Evalue'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -607,7 +607,7 @@ fn: function (anObject){
 var self=this;
 self['@value']=anObject;
 return self;},
-source: unescape('value%3A%20anObject%0A%09value%20%3A%3D%20anObject%0A'),
+source: unescape('value%3A%20anObject%0A%09value%20%3A%3D%20anObject'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -622,7 +622,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitValueNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitValueNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitValueNode%3A%20self'),
 messageSends: ["visitValueNode:"],
 referencedClasses: []
 }),
@@ -640,7 +640,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitVariableNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitVariableNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitVariableNode%3A%20self'),
 messageSends: ["visitVariableNode:"],
 referencedClasses: []
 }),
@@ -658,7 +658,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitClassReferenceNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitClassReferenceNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitClassReferenceNode%3A%20self'),
 messageSends: ["visitClassReferenceNode:"],
 referencedClasses: []
 }),
@@ -676,7 +676,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self['@source'], "_ifNil_", [(function(){return "";})]);
 return self;},
-source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D%0A'),
+source: unescape('source%0A%09%5Esource%20ifNil%3A%20%5B%27%27%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
 }),
@@ -691,7 +691,7 @@ fn: function (aString){
 var self=this;
 self['@source']=aString;
 return self;},
-source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString%0A'),
+source: unescape('source%3A%20aString%0A%09source%20%3A%3D%20aString'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -706,7 +706,7 @@ fn: function (aVisitor){
 var self=this;
 smalltalk.send(aVisitor, "_visitJSStatementNode_", [self]);
 return self;},
-source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitJSStatementNode%3A%20self%0A'),
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitJSStatementNode%3A%20self'),
 messageSends: ["visitJSStatementNode:"],
 referencedClasses: []
 }),
@@ -724,7 +724,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(aNode, "_accept_", [self]);
 return self;},
-source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self%0A'),
+source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self'),
 messageSends: ["accept:"],
 referencedClasses: []
 }),
@@ -739,7 +739,7 @@ fn: function (aNode){
 var self=this;
 
 return self;},
-source: unescape('visitNode%3A%20aNode%0A'),
+source: unescape('visitNode%3A%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -754,7 +754,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitMethodNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitMethodNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -769,7 +769,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitSequenceNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitSequenceNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -784,7 +784,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitSequenceNode_", [aNode]);
 return self;},
-source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09self%20visitSequenceNode%3A%20aNode%0A'),
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09self%20visitSequenceNode%3A%20aNode'),
 messageSends: ["visitSequenceNode:"],
 referencedClasses: []
 }),
@@ -799,7 +799,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitBlockNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitBlockNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -814,7 +814,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitReturnNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitReturnNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -829,7 +829,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitSendNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitSendNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -844,7 +844,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitCascadeNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitCascadeNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -859,7 +859,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitValueNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitValueNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -874,7 +874,7 @@ fn: function (aNode){
 var self=this;
 
 return self;},
-source: unescape('visitVariableNode%3A%20aNode%0A'),
+source: unescape('visitVariableNode%3A%20aNode'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -889,7 +889,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self, "_visitNode_", [aNode]);
 return self;},
-source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode%0A'),
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
 messageSends: ["visitNode:"],
 referencedClasses: []
 }),
@@ -904,7 +904,7 @@ fn: function (aNode){
 var self=this;
 (function($rec){smalltalk.send($rec, "_nextPutAll_", ["smalltalk."]);return smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})(self);
 return self;},
-source: unescape('visitClassReferenceNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value%0A'),
+source: unescape('visitClassReferenceNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27smalltalk.%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20value'),
 messageSends: ["nextPutAll:", "value"],
 referencedClasses: []
 }),
@@ -919,7 +919,7 @@ fn: function (aNode){
 var self=this;
 (function($rec){smalltalk.send($rec, "_nextPutAll_", [unescape("function%28%29%7B")]);smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(aNode, "_source", [])]);return smalltalk.send($rec, "_nextPutAll_", [unescape("%7D%29%28%29")]);})(self);
 return self;},
-source: unescape('visitJSStatementNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27function%28%29%7B%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20source%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%28%29%27%0A'),
+source: unescape('visitJSStatementNode%3A%20aNode%0A%09self%20%0A%09%20%20%20%20nextPutAll%3A%20%27function%28%29%7B%27%3B%0A%09%20%20%20%20nextPutAll%3A%20aNode%20source%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%7D%29%28%29%27'),
 messageSends: ["nextPutAll:", "source"],
 referencedClasses: []
 }),
@@ -942,7 +942,7 @@ self['@tempVariables']=[];
 self['@messageSends']=[];
 classReferenced=[];
 return self;},
-source: unescape('initialize%0A%09super%20initialize.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09classReferenced%20%3A%3D%20%23%28%29%0A'),
+source: unescape('initialize%0A%09super%20initialize.%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09unknownVariables%20%3A%3D%20%23%28%29.%0A%09tempVariables%20%3A%3D%20%23%28%29.%0A%09messageSends%20%3A%3D%20%23%28%29.%0A%09classReferenced%20%3A%3D%20%23%28%29'),
 messageSends: ["initialize", "writeStream"],
 referencedClasses: []
 }),
@@ -957,7 +957,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.SmalltalkParser, "_new", []);
 return self;},
-source: unescape('parser%0A%09%5ESmalltalkParser%20new%0A'),
+source: unescape('parser%0A%09%5ESmalltalkParser%20new'),
 messageSends: ["new"],
 referencedClasses: [smalltalk.SmalltalkParser]
 }),
@@ -972,7 +972,7 @@ fn: function (){
 var self=this;
 return self['@currentClass'];
 return self;},
-source: unescape('currentClass%0A%09%5EcurrentClass%0A'),
+source: unescape('currentClass%0A%09%5EcurrentClass'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -987,7 +987,7 @@ fn: function (aClass){
 var self=this;
 self['@currentClass']=aClass;
 return self;},
-source: unescape('currentClass%3A%20aClass%0A%09currentClass%20%3A%3D%20aClass%0A'),
+source: unescape('currentClass%3A%20aClass%0A%09currentClass%20%3A%3D%20aClass'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -1003,9 +1003,9 @@ var self=this;
 smalltalk.send(smalltalk.DoIt, "_addCompiledMethod_", [smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compileExpression_", [aString])])]);
 return smalltalk.send(smalltalk.send(smalltalk.DoIt, "_new", []), "_doIt", []);
 return self;},
-source: unescape('loadExpression%3A%20aString%0A%09DoIt%20addCompiledMethod%3A%20%28self%20eval%3A%20%28self%20compileExpression%3A%20aString%29%29.%0A%09%5EDoIt%20new%20doIt%0A'),
+source: unescape('loadExpression%3A%20aString%0A%09DoIt%20addCompiledMethod%3A%20%28self%20eval%3A%20%28self%20compileExpression%3A%20aString%29%29.%0A%09%5EDoIt%20new%20doIt'),
 messageSends: ["addCompiledMethod:", "eval:", "compileExpression:", "doIt", "new"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: [smalltalk.DoIt]
 }),
 smalltalk.Compiler);
 
@@ -1018,7 +1018,7 @@ fn: function (aString, aClass){
 var self=this;
 return smalltalk.send(self, "_eval_", [smalltalk.send(self, "_compile_forClass_", [aString, aClass])]);
 return self;},
-source: unescape('load%3A%20aString%20forClass%3A%20aClass%0A%09%5Eself%20eval%3A%20%28self%20compile%3A%20aString%20forClass%3A%20aClass%29%0A'),
+source: unescape('load%3A%20aString%20forClass%3A%20aClass%0A%09%5Eself%20eval%3A%20%28self%20compile%3A%20aString%20forClass%3A%20aClass%29'),
 messageSends: ["eval:", "compile:forClass:"],
 referencedClasses: []
 }),
@@ -1050,9 +1050,9 @@ var self=this;
 smalltalk.send(self, "_currentClass_", [smalltalk.DoIt]);
 return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parseExpression_", [aString])]);
 return self;},
-source: unescape('compileExpression%3A%20aString%0A%09self%20currentClass%3A%20DoIt.%0A%09%5Eself%20compileNode%3A%20%28self%20parseExpression%3A%20aString%29%0A'),
+source: unescape('compileExpression%3A%20aString%0A%09self%20currentClass%3A%20DoIt.%0A%09%5Eself%20compileNode%3A%20%28self%20parseExpression%3A%20aString%29'),
 messageSends: ["currentClass:", "compileNode:", "parseExpression:"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: [smalltalk.DoIt]
 }),
 smalltalk.Compiler);
 
@@ -1080,7 +1080,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_compileNode_", [smalltalk.send(self, "_parse_", [aString])]);
 return self;},
-source: unescape('compile%3A%20aString%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20aString%29%0A'),
+source: unescape('compile%3A%20aString%0A%09%5Eself%20compileNode%3A%20%28self%20parse%3A%20aString%29'),
 messageSends: ["compileNode:", "parse:"],
 referencedClasses: []
 }),
@@ -1097,7 +1097,7 @@ self['@stream']=smalltalk.send("", "_writeStream", []);
 smalltalk.send(self, "_visit_", [aNode]);
 return smalltalk.send(self['@stream'], "_contents", []);
 return self;},
-source: unescape('compileNode%3A%20aNode%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode.%0A%09%5Estream%20contents%0A'),
+source: unescape('compileNode%3A%20aNode%0A%09stream%20%3A%3D%20%27%27%20writeStream.%0A%09self%20visit%3A%20aNode.%0A%09%5Estream%20contents'),
 messageSends: ["writeStream", "visit:", "contents"],
 referencedClasses: []
 }),
@@ -1112,7 +1112,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(aNode, "_accept_", [self]);
 return self;},
-source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self%0A'),
+source: unescape('visit%3A%20aNode%0A%09aNode%20accept%3A%20self'),
 messageSends: ["accept:"],
 referencedClasses: []
 }),
@@ -1170,7 +1170,7 @@ smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29%7B")]);
 smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){return smalltalk.send(self, "_visit_", [each]);})]);
 smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29")]);
 return self;},
-source: unescape('visitBlockNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%27.%0A%09aNode%20parameters%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%0A%09%09tempVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27%0A'),
+source: unescape('visitBlockNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%28function%28%27.%0A%09aNode%20parameters%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%0A%09%09tempVariables%20add%3A%20each.%0A%09%09stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%27'),
 messageSends: ["nextPutAll:", "do:separatedBy:", "parameters", "add:", "do:", "nodes", "visit:"],
 referencedClasses: []
 }),
@@ -1183,9 +1183,10 @@ selector: 'visitSequenceNode:',
 category: 'visiting',
 fn: function (aNode){
 var self=this;
-smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [each]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
+smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [each]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);}), (function(){return smalltalk.send(self['@stream'], "_lf", []);})]);
 return self;},
-source: unescape('visitSequenceNode%3A%20aNode%0A%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20tempVariables%20add%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20lf%5D%0A'),
+source: unescape('visitSequenceNode%3A%20aNode%0A%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20tempVariables%20add%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20lf%5D'),
 messageSends: ["do:", "temps", "add:", "nextPutAll:", unescape("%2C"), "lf", "do:separatedBy:", "nodes", "visit:"],
 referencedClasses: []
 }),
@@ -1203,7 +1204,7 @@ self['@nestedBlocks']=smalltalk.send(self['@nestedBlocks'], "__plus", [(1)]);
 smalltalk.send(smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_isEmpty", []), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("return%20nil%3B")]);}), (function(){smalltalk.send(smalltalk.send(aNode, "_temps", []), "_do_", [(function(each){smalltalk.send(self['@tempVariables'], "_add_", [each]);return (function($rec){smalltalk.send($rec, "_nextPutAll_", [smalltalk.send(smalltalk.send("var ", "__comma", [each]), "__comma", [unescape("%3Dnil%3B")])]);return smalltalk.send($rec, "_lf", []);})(self['@stream']);})]);index=(0);return smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_", [(function(each){index=smalltalk.send(index, "__plus", [(1)]);smalltalk.send(smalltalk.send(index, "__eq", [smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_size", [])]), "_ifTrue_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", ["return "]);})]);smalltalk.send(self, "_visit_", [each]);return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3B")]);})]);})]);
 self['@nestedBlocks']=smalltalk.send(self['@nestedBlocks'], "__minus", [(1)]);
 return self;},
-source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20+%201.%0A%09aNode%20nodes%20isEmpty%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20nil%3B%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20tempVariables%20add%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09%09index%20%3A%3D%200.%0A%09%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%09%20%20%20%20self%20visit%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%5D.%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20-%201%0A'),
+source: unescape('visitBlockSequenceNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20+%201.%0A%09aNode%20nodes%20isEmpty%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20nil%3B%27%5D%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09aNode%20temps%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20tempVariables%20add%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27var%20%27%2C%20each%2C%20%27%3Dnil%3B%27%3B%20lf%5D.%0A%09%09index%20%3A%3D%200.%0A%09%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%09%20%20%20%20self%20visit%3A%20each.%0A%09%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D%5D.%0A%09nestedBlocks%20%3A%3D%20nestedBlocks%20-%201'),
 messageSends: [unescape("+"), "ifTrue:ifFalse:", "isEmpty", "nodes", "nextPutAll:", "do:", "temps", "add:", unescape("%2C"), "lf", "ifTrue:", unescape("%3D"), "size", "visit:", unescape("-")],
 referencedClasses: []
 }),
@@ -1274,7 +1275,7 @@ smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%7D%29%28")]);
 smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_receiver", [])]);
 smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%29")]);
 return self;},
-source: unescape('visitCascadeNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09index%20%3A%3D%200.%0A%09%28tempVariables%20includes%3A%20%27%24rec%27%29%20ifFalse%3A%20%5B%0A%09%09tempVariables%20add%3A%20%27%24rec%27%5D.%0A%09stream%20nextPutAll%3A%20%27%28function%28%24rec%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%20%20%20%20each%20receiver%3A%20%28VariableNode%20new%20value%3A%20%27%24rec%27%29.%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%27.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20nextPutAll%3A%20%27%29%27%0A'),
+source: unescape('visitCascadeNode%3A%20aNode%0A%09%7C%20index%20%7C%0A%09index%20%3A%3D%200.%0A%09%28tempVariables%20includes%3A%20%27%24rec%27%29%20ifFalse%3A%20%5B%0A%09%09tempVariables%20add%3A%20%27%24rec%27%5D.%0A%09stream%20nextPutAll%3A%20%27%28function%28%24rec%29%7B%27.%0A%09aNode%20nodes%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20index%20%3A%3D%20index%20+%201.%0A%09%20%20%20%20index%20%3D%20aNode%20nodes%20size%20ifTrue%3A%20%5B%0A%09%09stream%20nextPutAll%3A%20%27return%20%27%5D.%0A%09%20%20%20%20each%20receiver%3A%20%28VariableNode%20new%20value%3A%20%27%24rec%27%29.%0A%09%20%20%20%20self%20visit%3A%20each.%0A%09%20%20%20%20stream%20nextPutAll%3A%20%27%3B%27%5D.%0A%09stream%20nextPutAll%3A%20%27%7D%29%28%27.%0A%09self%20visit%3A%20aNode%20receiver.%0A%09stream%20nextPutAll%3A%20%27%29%27'),
 messageSends: ["ifFalse:", "includes:", "add:", "nextPutAll:", "do:", "nodes", unescape("+"), "ifTrue:", unescape("%3D"), "size", "receiver:", "value:", "new", "visit:", "receiver"],
 referencedClasses: [smalltalk.VariableNode]
 }),
@@ -1289,7 +1290,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(aNode, "_value", []), "_asJavascript", [])]);
 return self;},
-source: unescape('visitValueNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20aNode%20value%20asJavascript%0A'),
+source: unescape('visitValueNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20aNode%20value%20asJavascript'),
 messageSends: ["nextPutAll:", "asJavascript", "value"],
 referencedClasses: []
 }),
@@ -1306,7 +1307,7 @@ smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_left", [])]);
 smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%3D")]);
 smalltalk.send(self, "_visit_", [smalltalk.send(aNode, "_right", [])]);
 return self;},
-source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visit%3A%20aNode%20left.%0A%09stream%20nextPutAll%3A%20%27%3D%27.%0A%09self%20visit%3A%20aNode%20right%0A'),
+source: unescape('visitAssignmentNode%3A%20aNode%0A%09self%20visit%3A%20aNode%20left.%0A%09stream%20nextPutAll%3A%20%27%3D%27.%0A%09self%20visit%3A%20aNode%20right'),
 messageSends: ["visit:", "left", "nextPutAll:", "right"],
 referencedClasses: []
 }),
@@ -1339,7 +1340,7 @@ fn: function (aNode){
 var self=this;
 smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_currentClass", []), "_instanceVariableNames", []), "_includes_", [smalltalk.send(aNode, "_value", [])]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(smalltalk.send(unescape("self%5B%27@"), "__comma", [smalltalk.send(aNode, "_value", [])]), "__comma", [unescape("%27%5D")])]);}), (function(){smalltalk.send(smalltalk.send(smalltalk.send(self, "_knownVariables", []), "_includes_", [smalltalk.send(aNode, "_value", [])]), "_ifFalse_", [(function(){return smalltalk.send(self['@unknownVariables'], "_add_", [smalltalk.send(aNode, "_value", [])]);})]);return smalltalk.send(self['@stream'], "_nextPutAll_", [smalltalk.send(aNode, "_value", [])]);})]);
 return self;},
-source: unescape('visitVariableNode%3A%20aNode%0A%09%28self%20currentClass%20instanceVariableNames%20includes%3A%20aNode%20value%29%20%0A%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27self%5B%27%27@%27%2C%20aNode%20value%2C%20%27%27%27%5D%27%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09%28self%20knownVariables%20includes%3A%20aNode%20value%29%20ifFalse%3A%20%5B%0A%09%09%09%09unknownVariables%20add%3A%20aNode%20value%5D.%0A%09%09%09stream%20nextPutAll%3A%20aNode%20value%5D%0A'),
+source: unescape('visitVariableNode%3A%20aNode%0A%09%28self%20currentClass%20instanceVariableNames%20includes%3A%20aNode%20value%29%20%0A%09%09ifTrue%3A%20%5Bstream%20nextPutAll%3A%20%27self%5B%27%27@%27%2C%20aNode%20value%2C%20%27%27%27%5D%27%5D%0A%09%09ifFalse%3A%20%5B%0A%09%09%09%28self%20knownVariables%20includes%3A%20aNode%20value%29%20ifFalse%3A%20%5B%0A%09%09%09%09unknownVariables%20add%3A%20aNode%20value%5D.%0A%09%09%09stream%20nextPutAll%3A%20aNode%20value%5D'),
 messageSends: ["ifTrue:ifFalse:", "includes:", "instanceVariableNames", "currentClass", "value", "nextPutAll:", unescape("%2C"), "ifFalse:", "knownVariables", "add:"],
 referencedClasses: []
 }),
@@ -1369,7 +1370,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_parser", []), "_parse_", [smalltalk.send(aString, "_readStream", [])]);
 return self;},
-source: unescape('parse%3A%20aString%0A%20%20%20%20%5Eself%20parser%20parse%3A%20aString%20readStream%0A'),
+source: unescape('parse%3A%20aString%0A%20%20%20%20%5Eself%20parser%20parse%3A%20aString%20readStream'),
 messageSends: ["parse:", "parser", "readStream"],
 referencedClasses: []
 }),
@@ -1384,7 +1385,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_parse_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")])]);
 return self;},
-source: unescape('parseExpression%3A%20aString%0A%20%20%20%20%5Eself%20parse%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27%0A'),
+source: unescape('parseExpression%3A%20aString%0A%20%20%20%20%5Eself%20parse%3A%20%27doIt%20%5E%5B%27%2C%20aString%2C%20%27%5D%20value%27'),
 messageSends: ["parse:", unescape("%2C")],
 referencedClasses: []
 }),
@@ -1497,6 +1498,21 @@ referencedClasses: []
 }),
 smalltalk.Compiler);
 
+smalltalk.addMethod(
+'_visitFailure_',
+smalltalk.method({
+selector: 'visitFailure:',
+category: 'visiting',
+fn: function (aFailure){
+var self=this;
+smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
+return self;},
+source: unescape('visitFailure%3A%20aFailure%0A%09self%20error%3A%20aFailure%20asString'),
+messageSends: ["error:", "asString"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
+
 
 smalltalk.addMethod(
 '_recompile_',
@@ -1539,11 +1555,11 @@ selector: 'doIt',
 category: '',
 fn: function (){
 var self=this;
-return smalltalk.send((function(){return smalltalk.send(smalltalk.send(smalltalk.ChunkExporter, "_new", []), "_exportCategory_", ["Parser"]);}), "_value", []);
+return smalltalk.send((function(){return smalltalk.send("abc", "_trimLeft_", ["az"]);}), "_value", []);
 return self;},
-source: unescape('doIt%20%5E%5BChunkExporter%20new%20exportCategory%3A%20%27Parser%27%20%5D%20value'),
-messageSends: ["value", "exportCategory:", "new"],
-referencedClasses: [smalltalk.ChunkExporter]
+source: unescape('doIt%20%5E%5B%27abc%27%20trimLeft%3A%20%27az%27%5D%20value'),
+messageSends: ["value", "trimLeft:"],
+referencedClasses: []
 }),
 smalltalk.DoIt);
 

+ 158 - 158
js/Examples.js

@@ -1,37 +1,4 @@
 smalltalk.addClass('Counter', smalltalk.Widget, ['count', 'header'], 'Examples');
-smalltalk.addMethod(
-'_initialize',
-smalltalk.method({
-selector: 'initialize',
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Widget);
-self['@count']=(0);
-return self;},
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20count%20%3A%3D%200%0A'),
-messageSends: ["initialize"],
-referencedClasses: []
-}),
-smalltalk.Counter);
-
-smalltalk.addMethod(
-'_renderOn_',
-smalltalk.method({
-selector: 'renderOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-self['@header']=(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_h1", []));
-(function($rec){smalltalk.send($rec, "_with_", [unescape("++")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_increase", []);})]);})(smalltalk.send(html, "_button", []));
-(function($rec){smalltalk.send($rec, "_with_", [unescape("--")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_decrease", []);})]);})(smalltalk.send(html, "_button", []));
-return self;},
-source: unescape('renderOn%3A%20html%0A%20%20%20%20header%20%3A%3D%20html%20h1%20%0A%09with%3A%20count%20asString%3B%0A%09yourself.%0A%20%20%20%20html%20button%0A%09with%3A%20%27++%27%3B%0A%09onClick%3A%20%5Bself%20increase%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27--%27%3B%0A%09onClick%3A%20%5Bself%20decrease%5D%0A'),
-messageSends: ["with:", "asString", "yourself", "h1", "onClick:", "increase", "button", "decrease"],
-referencedClasses: []
-}),
-smalltalk.Counter);
-
 smalltalk.addMethod(
 '_increase',
 smalltalk.method({
@@ -64,9 +31,22 @@ referencedClasses: []
 }),
 smalltalk.Counter);
 
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Widget);
+self['@count']=(0);
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20count%20%3A%3D%200'),
+messageSends: ["initialize"],
+referencedClasses: []
+}),
+smalltalk.Counter);
 
-
-smalltalk.addClass('Tetris', smalltalk.Widget, ['renderingContext', 'timer', 'speed', 'score', 'rows', 'movingPiece'], 'Examples');
 smalltalk.addMethod(
 '_renderOn_',
 smalltalk.method({
@@ -74,108 +54,122 @@ selector: 'renderOn:',
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["tetris"]);return smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_h3", []), "_with_", ["Tetris"]);smalltalk.send(self, "_renderCanvasOn_", [html]);return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+self['@header']=(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(html, "_h1", []));
+(function($rec){smalltalk.send($rec, "_with_", [unescape("++")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_increase", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", [unescape("--")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_decrease", []);})]);})(smalltalk.send(html, "_button", []));
 return self;},
-source: unescape('renderOn%3A%20html%0A%09html%20div%0A%09%09class%3A%20%27tetris%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20h3%20with%3A%20%27Tetris%27.%0A%09%09%09self%20renderCanvasOn%3A%20html.%0A%09%09%09self%20renderButtonsOn%3A%20html%5D'),
-messageSends: ["class:", "with:", "h3", "renderCanvasOn:", "renderButtonsOn:", "div"],
+source: unescape('renderOn%3A%20html%0A%20%20%20%20header%20%3A%3D%20html%20h1%20%0A%09with%3A%20count%20asString%3B%0A%09yourself.%0A%20%20%20%20html%20button%0A%09with%3A%20%27++%27%3B%0A%09onClick%3A%20%5Bself%20increase%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27--%27%3B%0A%09onClick%3A%20%5Bself%20decrease%5D'),
+messageSends: ["with:", "asString", "yourself", "h1", "onClick:", "increase", "button", "decrease"],
 referencedClasses: []
 }),
-smalltalk.Tetris);
+smalltalk.Counter);
+
+
 
+smalltalk.addClass('Tetris', smalltalk.Widget, ['renderingContext', 'timer', 'speed', 'score', 'rows', 'movingPiece'], 'Examples');
 smalltalk.addMethod(
-'_renderCanvasOn_',
+'_width',
 smalltalk.method({
-selector: 'renderCanvasOn:',
-category: 'rendering',
-fn: function (html){
+selector: 'width',
+category: 'accessing',
+fn: function (){
 var self=this;
-var canvas=nil;
-canvas=smalltalk.send(html, "_canvas", []);
-smalltalk.send(canvas, "_at_put_", ["width", smalltalk.send(smalltalk.send(self, "_width", []), "_asString", [])]);
-smalltalk.send(canvas, "_at_put_", ["height", smalltalk.send(smalltalk.send(self, "_height", []), "_asString", [])]);
-self['@renderingContext']=smalltalk.send(smalltalk.CanvasRenderingContext, "_tagBrush_", [canvas]);
-smalltalk.send(self, "_redraw", []);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_width", []);
 return self;},
-source: unescape('renderCanvasOn%3A%20html%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20html%20canvas.%0A%09canvas%20at%3A%20%27width%27%20put%3A%20self%20width%20asString.%0A%09canvas%20at%3A%20%27height%27%20put%3A%20self%20height%20asString.%0A%09renderingContext%20%3A%3D%20CanvasRenderingContext%20tagBrush%3A%20canvas.%0A%09self%20redraw'),
-messageSends: ["canvas", "at:put:", "asString", "width", "height", "tagBrush:", "redraw"],
-referencedClasses: [smalltalk.CanvasRenderingContext]
+source: unescape('width%0A%09%5Eself%20class%20width'),
+messageSends: ["width", "class"],
+referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_renderButtonsOn_',
+'_height',
 smalltalk.method({
-selector: 'renderButtonsOn:',
-category: 'rendering',
-fn: function (html){
+selector: 'height',
+category: 'accessing',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["tetris_buttons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["New game"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_startNewGame", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", [unescape("play/pause")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_update", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
+return smalltalk.send(smalltalk.send(self, "_class", []), "_height", []);
 return self;},
-source: unescape('renderButtonsOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27tetris_buttons%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20button%0A%09%09%09%09with%3A%20%27New%20game%27%3B%0A%09%09%09%09onClick%3A%20%5Bself%20startNewGame%5D.%0A%09%09%09html%20button%0A%09%09%09%09with%3A%20%27play/pause%27%3B%0A%09%09%09%09onClick%3A%20%5Bself%20update%5D%5D'),
-messageSends: ["class:", "with:", "onClick:", "startNewGame", "button", "update", "div"],
+source: unescape('height%0A%09%5Eself%20class%20height'),
+messageSends: ["height", "class"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_initialize',
+'_squares',
 smalltalk.method({
-selector: 'initialize',
-category: 'initialization',
+selector: 'squares',
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Widget);
-smalltalk.send(self, "_newGame", []);
+return smalltalk.send(smalltalk.send(self, "_class", []), "_squares", []);
 return self;},
-source: unescape('initialize%0A%09super%20initialize.%0A%09self%20newGame'),
-messageSends: ["initialize", "newGame"],
+source: unescape('squares%0A%09%5Eself%20class%20squares'),
+messageSends: ["squares", "class"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_startNewGame',
+'_gluePiece_',
 smalltalk.method({
-selector: 'startNewGame',
-category: 'actions',
-fn: function (){
+selector: 'gluePiece:',
+category: 'accessing',
+fn: function (aPiece){
 var self=this;
-smalltalk.send(self, "_newGame", []);
-smalltalk.send(self['@timer'], "_ifNotNil_", [(function(){return smalltalk.send(self['@timer'], "_clearInterval", []);})]);
-self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_nextStep", []);}), "_valueWithInterval_", [self['@speed']]);
+smalltalk.send(aPiece, "_glueOn_", [self]);
 return self;},
-source: unescape('startNewGame%0A%09self%20newGame.%0A%09timer%20ifNotNil%3A%20%5Btimer%20clearInterval%5D.%0A%09timer%20%3A%3D%20%5Bself%20nextStep%5D%20valueWithInterval%3A%20speed'),
-messageSends: ["newGame", "ifNotNil:", "clearInterval", "valueWithInterval:", "nextStep"],
+source: unescape('gluePiece%3A%20aPiece%0A%09aPiece%20glueOn%3A%20self'),
+messageSends: ["glueOn:"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_width',
+'_rows',
 smalltalk.method({
-selector: 'width',
+selector: 'rows',
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_width", []);
+return self['@rows'];
 return self;},
-source: unescape('width%0A%09%5Eself%20class%20width'),
-messageSends: ["width", "class"],
+source: unescape('rows%0A%09%22An%20array%20of%20rows.%20Each%20row%20is%20a%20collection%20of%20points.%22%0A%09%5Erows'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_height',
+'_addRow_',
 smalltalk.method({
-selector: 'height',
+selector: 'addRow:',
 category: 'accessing',
+fn: function (aCollection){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_rows", []), "_add_", [aCollection]);
+return self;},
+source: unescape('addRow%3A%20aCollection%0A%09self%20rows%20add%3A%20aCollection'),
+messageSends: ["add:", "rows"],
+referencedClasses: []
+}),
+smalltalk.Tetris);
+
+smalltalk.addMethod(
+'_startNewGame',
+smalltalk.method({
+selector: 'startNewGame',
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_height", []);
+smalltalk.send(self, "_newGame", []);
+smalltalk.send(self['@timer'], "_ifNotNil_", [(function(){return smalltalk.send(self['@timer'], "_clearInterval", []);})]);
+self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_nextStep", []);}), "_valueWithInterval_", [self['@speed']]);
 return self;},
-source: unescape('height%0A%09%5Eself%20class%20height'),
-messageSends: ["height", "class"],
+source: unescape('startNewGame%0A%09self%20newGame.%0A%09timer%20ifNotNil%3A%20%5Btimer%20clearInterval%5D.%0A%09timer%20%3A%3D%20%5Bself%20nextStep%5D%20valueWithInterval%3A%20speed'),
+messageSends: ["newGame", "ifNotNil:", "clearInterval", "valueWithInterval:", "nextStep"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
@@ -191,7 +185,7 @@ smalltalk.send(self['@movingPiece'], "_ifNil_", [(function(){return smalltalk.se
 smalltalk.send(smalltalk.send(self['@movingPiece'], "_canMoveIn_", [self]), "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@movingPiece'], "_position_", [smalltalk.send(smalltalk.send(self['@movingPiece'], "_position", []), "__plus", [smalltalk.send((0), "__at", [(1)])])]);}), (function(){return smalltalk.send(self, "_newPiece", []);})]);
 smalltalk.send(self, "_redraw", []);
 return self;},
-source: unescape('nextStep%0A%09movingPiece%20ifNil%3A%20%5Bself%20newPiece%5D.%0A%09%28movingPiece%20canMoveIn%3A%20self%29%0A%09%09ifTrue%3A%20%5BmovingPiece%20position%3A%20movingPiece%20position%20+%20%280@1%29%5D%0A%09%09ifFalse%3A%20%5Bself%20newPiece%5D.%0A%09self%20redraw%0A%09'),
+source: unescape('nextStep%0A%09movingPiece%20ifNil%3A%20%5Bself%20newPiece%5D.%0A%09%28movingPiece%20canMoveIn%3A%20self%29%0A%09%09ifTrue%3A%20%5BmovingPiece%20position%3A%20movingPiece%20position%20+%20%280@1%29%5D%0A%09%09ifFalse%3A%20%5Bself%20newPiece%5D.%0A%09self%20redraw'),
 messageSends: ["ifNil:", "newPiece", "ifTrue:ifFalse:", "canMoveIn:", "position:", unescape("+"), "position", unescape("@"), "redraw"],
 referencedClasses: []
 }),
@@ -277,36 +271,6 @@ self['@movingPiece']=smalltalk.send(smalltalk.TetrisPiece, "_atRandom", []);
 return self;},
 source: unescape('newPiece%0A%09movingPiece%20%3A%3D%20TetrisPiece%20atRandom'),
 messageSends: ["atRandom"],
-referencedClasses: [smalltalk.nil]
-}),
-smalltalk.Tetris);
-
-smalltalk.addMethod(
-'_squares',
-smalltalk.method({
-selector: 'squares',
-category: 'accessing',
-fn: function (){
-var self=this;
-return smalltalk.send(smalltalk.send(self, "_class", []), "_squares", []);
-return self;},
-source: unescape('squares%0A%09%5Eself%20class%20squares'),
-messageSends: ["squares", "class"],
-referencedClasses: []
-}),
-smalltalk.Tetris);
-
-smalltalk.addMethod(
-'_gluePiece_',
-smalltalk.method({
-selector: 'gluePiece:',
-category: 'accessing',
-fn: function (aPiece){
-var self=this;
-smalltalk.send(aPiece, "_glueOn_", [self]);
-return self;},
-source: unescape('gluePiece%3A%20aPiece%0A%09aPiece%20glueOn%3A%20self%0A%09'),
-messageSends: ["glueOn:"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
@@ -343,31 +307,67 @@ referencedClasses: []
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_rows',
+'_initialize',
 smalltalk.method({
-selector: 'rows',
-category: 'accessing',
+selector: 'initialize',
+category: 'initialization',
 fn: function (){
 var self=this;
-return self['@rows'];
+smalltalk.send(self, "_initialize", [], smalltalk.Widget);
+smalltalk.send(self, "_newGame", []);
 return self;},
-source: unescape('rows%0A%09%22An%20array%20of%20rows.%20Each%20row%20is%20a%20collection%20of%20points.%22%0A%09%5Erows'),
-messageSends: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09self%20newGame'),
+messageSends: ["initialize", "newGame"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
 
 smalltalk.addMethod(
-'_addRow_',
+'_renderOn_',
 smalltalk.method({
-selector: 'addRow:',
-category: 'accessing',
-fn: function (aCollection){
+selector: 'renderOn:',
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_rows", []), "_add_", [aCollection]);
+(function($rec){smalltalk.send($rec, "_class_", ["tetris"]);return smalltalk.send($rec, "_with_", [(function(){smalltalk.send(smalltalk.send(html, "_h3", []), "_with_", ["Tetris"]);smalltalk.send(self, "_renderCanvasOn_", [html]);return smalltalk.send(self, "_renderButtonsOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
 return self;},
-source: unescape('addRow%3A%20aCollection%0A%09self%20rows%20add%3A%20aCollection'),
-messageSends: ["add:", "rows"],
+source: unescape('renderOn%3A%20html%0A%09html%20div%0A%09%09class%3A%20%27tetris%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20h3%20with%3A%20%27Tetris%27.%0A%09%09%09self%20renderCanvasOn%3A%20html.%0A%09%09%09self%20renderButtonsOn%3A%20html%5D'),
+messageSends: ["class:", "with:", "h3", "renderCanvasOn:", "renderButtonsOn:", "div"],
+referencedClasses: []
+}),
+smalltalk.Tetris);
+
+smalltalk.addMethod(
+'_renderCanvasOn_',
+smalltalk.method({
+selector: 'renderCanvasOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+var canvas=nil;
+canvas=smalltalk.send(html, "_canvas", []);
+smalltalk.send(canvas, "_at_put_", ["width", smalltalk.send(smalltalk.send(self, "_width", []), "_asString", [])]);
+smalltalk.send(canvas, "_at_put_", ["height", smalltalk.send(smalltalk.send(self, "_height", []), "_asString", [])]);
+self['@renderingContext']=smalltalk.send(smalltalk.CanvasRenderingContext, "_tagBrush_", [canvas]);
+smalltalk.send(self, "_redraw", []);
+return self;},
+source: unescape('renderCanvasOn%3A%20html%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20html%20canvas.%0A%09canvas%20at%3A%20%27width%27%20put%3A%20self%20width%20asString.%0A%09canvas%20at%3A%20%27height%27%20put%3A%20self%20height%20asString.%0A%09renderingContext%20%3A%3D%20CanvasRenderingContext%20tagBrush%3A%20canvas.%0A%09self%20redraw'),
+messageSends: ["canvas", "at:put:", "asString", "width", "height", "tagBrush:", "redraw"],
+referencedClasses: [smalltalk.CanvasRenderingContext]
+}),
+smalltalk.Tetris);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){smalltalk.send($rec, "_class_", ["tetris_buttons"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_with_", ["New game"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_startNewGame", []);})]);})(smalltalk.send(html, "_button", []));return (function($rec){smalltalk.send($rec, "_with_", [unescape("play/pause")]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_update", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A%09html%20div%20%0A%09%09class%3A%20%27tetris_buttons%27%3B%0A%09%09with%3A%20%5B%0A%09%09%09html%20button%0A%09%09%09%09with%3A%20%27New%20game%27%3B%0A%09%09%09%09onClick%3A%20%5Bself%20startNewGame%5D.%0A%09%09%09html%20button%0A%09%09%09%09with%3A%20%27play/pause%27%3B%0A%09%09%09%09onClick%3A%20%5Bself%20update%5D%5D'),
+messageSends: ["class:", "with:", "onClick:", "startNewGame", "button", "update", "div"],
 referencedClasses: []
 }),
 smalltalk.Tetris);
@@ -435,22 +435,6 @@ smalltalk.Tetris.klass);
 
 
 smalltalk.addClass('TetrisPiece', smalltalk.Widget, ['rotation', 'position'], 'Examples');
-smalltalk.addMethod(
-'_drawOn_',
-smalltalk.method({
-selector: 'drawOn:',
-category: 'drawing',
-fn: function (aRenderingContext){
-var self=this;
-smalltalk.send(aRenderingContext, "_fillStyle_", [smalltalk.send(self, "_color", [])]);
-smalltalk.send(smalltalk.send(self, "_bounds", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_fillRectFrom_to_", [smalltalk.send(smalltalk.send(each, "__plus", [smalltalk.send(self, "_position", [])]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])]), smalltalk.send(smalltalk.send((1), "__at", [(1)]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])])]);smalltalk.send($rec, "_strokeStyle_", [unescape("%23999")]);smalltalk.send($rec, "_lineWidth_", [(2)]);return smalltalk.send($rec, "_strokeRectFrom_to_", [smalltalk.send(smalltalk.send(each, "__plus", [smalltalk.send(self, "_position", [])]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])]), smalltalk.send(smalltalk.send((1), "__at", [(1)]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])])]);})(aRenderingContext);})]);
-return self;},
-source: unescape('drawOn%3A%20aRenderingContext%0A%09aRenderingContext%20fillStyle%3A%20self%20color.%0A%09self%20bounds%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aRenderingContext%20%0A%09%09%09fillRectFrom%3A%20each%20+%20self%20position*%20Tetris%20squareSize%20to%3A%201@1%20*%20Tetris%20squareSize%3B%0A%09%09%09strokeStyle%3A%20%27%23999%27%3B%0A%09%09%09lineWidth%3A%202%3B%0A%09%09%09strokeRectFrom%3A%20each%20+%20self%20position*%20Tetris%20squareSize%20to%3A%201@1%20*%20Tetris%20squareSize%5D'),
-messageSends: ["fillStyle:", "color", "do:", "bounds", "fillRectFrom:to:", unescape("*"), unescape("+"), "position", "squareSize", unescape("@"), "strokeStyle:", "lineWidth:", "strokeRectFrom:to:"],
-referencedClasses: [smalltalk.Tetris]
-}),
-smalltalk.TetrisPiece);
-
 smalltalk.addMethod(
 '_rotation',
 smalltalk.method({
@@ -542,32 +526,48 @@ referencedClasses: []
 smalltalk.TetrisPiece);
 
 smalltalk.addMethod(
-'_canMove',
+'_height',
 smalltalk.method({
-selector: 'canMove',
-category: 'testing',
+selector: 'height',
+category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(self, "_position", []), "_y", []), "__lt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Tetris, "_squares", []), "_y", []), "__minus", [smalltalk.send(self, "_height", [])])]);
+return (2);
 return self;},
-source: unescape('canMove%0A%09%5Eself%20position%20y%20%3C%20%28Tetris%20squares%20y%20-%20self%20height%29'),
-messageSends: [unescape("%3C"), "y", "position", unescape("-"), "squares", "height"],
+source: unescape('height%0A%09%5E2'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.TetrisPiece);
+
+smalltalk.addMethod(
+'_drawOn_',
+smalltalk.method({
+selector: 'drawOn:',
+category: 'drawing',
+fn: function (aRenderingContext){
+var self=this;
+smalltalk.send(aRenderingContext, "_fillStyle_", [smalltalk.send(self, "_color", [])]);
+smalltalk.send(smalltalk.send(self, "_bounds", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_fillRectFrom_to_", [smalltalk.send(smalltalk.send(each, "__plus", [smalltalk.send(self, "_position", [])]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])]), smalltalk.send(smalltalk.send((1), "__at", [(1)]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])])]);smalltalk.send($rec, "_strokeStyle_", [unescape("%23999")]);smalltalk.send($rec, "_lineWidth_", [(2)]);return smalltalk.send($rec, "_strokeRectFrom_to_", [smalltalk.send(smalltalk.send(each, "__plus", [smalltalk.send(self, "_position", [])]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])]), smalltalk.send(smalltalk.send((1), "__at", [(1)]), "__star", [smalltalk.send(smalltalk.Tetris, "_squareSize", [])])]);})(aRenderingContext);})]);
+return self;},
+source: unescape('drawOn%3A%20aRenderingContext%0A%09aRenderingContext%20fillStyle%3A%20self%20color.%0A%09self%20bounds%20do%3A%20%5B%3Aeach%20%7C%0A%09%09aRenderingContext%20%0A%09%09%09fillRectFrom%3A%20each%20+%20self%20position*%20Tetris%20squareSize%20to%3A%201@1%20*%20Tetris%20squareSize%3B%0A%09%09%09strokeStyle%3A%20%27%23999%27%3B%0A%09%09%09lineWidth%3A%202%3B%0A%09%09%09strokeRectFrom%3A%20each%20+%20self%20position*%20Tetris%20squareSize%20to%3A%201@1%20*%20Tetris%20squareSize%5D'),
+messageSends: ["fillStyle:", "color", "do:", "bounds", "fillRectFrom:to:", unescape("*"), unescape("+"), "position", "squareSize", unescape("@"), "strokeStyle:", "lineWidth:", "strokeRectFrom:to:"],
 referencedClasses: [smalltalk.Tetris]
 }),
 smalltalk.TetrisPiece);
 
 smalltalk.addMethod(
-'_height',
+'_canMove',
 smalltalk.method({
-selector: 'height',
-category: 'accessing',
+selector: 'canMove',
+category: 'testing',
 fn: function (){
 var self=this;
-return (2);
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_position", []), "_y", []), "__lt", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.Tetris, "_squares", []), "_y", []), "__minus", [smalltalk.send(self, "_height", [])])]);
 return self;},
-source: unescape('height%0A%09%5E2'),
-messageSends: [],
-referencedClasses: []
+source: unescape('canMove%0A%09%5Eself%20position%20y%20%3C%20%28Tetris%20squares%20y%20-%20self%20height%29'),
+messageSends: [unescape("%3C"), "y", "position", unescape("-"), "squares", "height"],
+referencedClasses: [smalltalk.Tetris]
 }),
 smalltalk.TetrisPiece);
 

文件差异内容过多而无法显示
+ 245 - 183
js/IDE.js


+ 137 - 137
js/JQuery.js

@@ -1,4 +1,80 @@
 smalltalk.addClass('JQuery', smalltalk.Object, ['jquery'], 'JQuery');
+smalltalk.addMethod(
+'_append_',
+smalltalk.method({
+selector: 'append:',
+category: 'DOM insertion',
+fn: function (anObject){
+var self=this;
+smalltalk.send(anObject, "_appendToJQuery_", [self]);
+return self;},
+source: unescape('append%3A%20anObject%0A%20%20%20%20%22Append%20anObject%20at%20the%20end%20of%20the%20element.%22%0A%20%20%20%20anObject%20appendToJQuery%3A%20self'),
+messageSends: ["appendToJQuery:"],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_appendElement_',
+smalltalk.method({
+selector: 'appendElement:',
+category: 'DOM insertion',
+fn: function (anElement){
+var self=this;
+smalltalk.send(self, "_call_withArgument_", ["append", anElement]);
+return self;},
+source: unescape('appendElement%3A%20anElement%0A%20%20%20%20%22Append%20anElement%20at%20the%20end%20of%20the%20element.%0A%20%20%20%20%20Dont%27t%20call%20this%20method%20directly%2C%20use%20%23append%3A%20instead%22%0A%20%20%20%20self%20call%3A%20%27append%27%20withArgument%3A%20anElement'),
+messageSends: ["call:withArgument:"],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_appendToJQuery_',
+smalltalk.method({
+selector: 'appendToJQuery:',
+category: 'DOM insertion',
+fn: function (aJQuery){
+var self=this;
+smalltalk.send(aJQuery, "_appendElement_", [self['@jquery']]);
+return self;},
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20jquery'),
+messageSends: ["appendElement:"],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_contents_',
+smalltalk.method({
+selector: 'contents:',
+category: 'DOM insertion',
+fn: function (anObject){
+var self=this;
+smalltalk.send(self, "_empty", []);
+smalltalk.send(self, "_append_", [anObject]);
+return self;},
+source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20empty.%0A%20%20%20%20self%20append%3A%20anObject'),
+messageSends: ["empty", "append:"],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_empty',
+smalltalk.method({
+selector: 'empty',
+category: 'DOM insertion',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_call_", ["empty"]);
+return self;},
+source: unescape('empty%0A%20%20%20%20%5Eself%20call%3A%20%27empty%27'),
+messageSends: ["call:"],
+referencedClasses: []
+}),
+smalltalk.JQuery);
+
 smalltalk.addMethod(
 '_removeAttribute_',
 smalltalk.method({
@@ -8,7 +84,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["removeAttribute", aString]);
 return self;},
-source: unescape('removeAttribute%3A%20aString%0A%20%20%20%20%22Remove%20an%20attribute%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27removeAttribute%27%20withArgument%3A%20aString%0A'),
+source: unescape('removeAttribute%3A%20aString%0A%20%20%20%20%22Remove%20an%20attribute%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27removeAttribute%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -23,7 +99,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["attr", aString]);
 return self;},
-source: unescape('attr%3A%20aString%0A%20%20%20%20%22Get%20the%20value%20of%20an%20attribute%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27attr%27%20withArgument%3A%20aString%0A'),
+source: unescape('attr%3A%20aString%0A%20%20%20%20%22Get%20the%20value%20of%20an%20attribute%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27attr%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -38,7 +114,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["val"]);
 return self;},
-source: unescape('val%0A%20%20%20%20%22Get%20the%20current%20value%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27val%27%0A'),
+source: unescape('val%0A%20%20%20%20%22Get%20the%20current%20value%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27val%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -53,7 +129,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["val", aString]);
 return self;},
-source: unescape('val%3A%20aString%0A%20%20%20%20self%20call%3A%20%27val%27%20withArgument%3A%20aString%0A'),
+source: unescape('val%3A%20aString%0A%20%20%20%20self%20call%3A%20%27val%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -83,7 +159,7 @@ fn: function (aString, anotherString){
 var self=this;
 self['@jquery'].css(aString, anotherString);
 return self;},
-source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.css%28aString%2C%20anotherString%29%27%7D%0A'),
+source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.css%28aString%2C%20anotherString%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -98,7 +174,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["addClass", aString]);
 return self;},
-source: unescape('addClass%3A%20aString%0A%20%20%20%20%22Adds%20the%20specified%20class%28es%29%20to%20each%20of%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27addClass%27%20withArgument%3A%20aString%0A'),
+source: unescape('addClass%3A%20aString%0A%20%20%20%20%22Adds%20the%20specified%20class%28es%29%20to%20each%20of%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27addClass%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -113,7 +189,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["removeClass", aString]);
 return self;},
-source: unescape('removeClass%3A%20aString%0A%20%20%20%20%22Remove%20a%20single%20class%2C%20multiple%20classes%2C%20or%20all%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27removeClass%27%20withArgument%3A%20aString%0A'),
+source: unescape('removeClass%3A%20aString%0A%20%20%20%20%22Remove%20a%20single%20class%2C%20multiple%20classes%2C%20or%20all%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20self%20call%3A%20%27removeClass%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -128,7 +204,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["toggleClass", aString]);
 return self;},
-source: unescape('toggleClass%3A%20aString%0A%20%20%20%20%22Add%20or%20remove%20one%20or%20more%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements%2C%20depending%20on%20either%20the%20class%27s%20presence%20or%20the%20value%20of%20the%20switch%20argument.%22%0A%20%20%20%20self%20call%3A%20%27toggleClass%27%20withArgument%3A%20aString%0A'),
+source: unescape('toggleClass%3A%20aString%0A%20%20%20%20%22Add%20or%20remove%20one%20or%20more%20classes%20from%20each%20element%20in%20the%20set%20of%20matched%20elements%2C%20depending%20on%20either%20the%20class%27s%20presence%20or%20the%20value%20of%20the%20switch%20argument.%22%0A%20%20%20%20self%20call%3A%20%27toggleClass%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -143,7 +219,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["height"]);
 return self;},
-source: unescape('height%20%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27height%27%0A'),
+source: unescape('height%20%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27height%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -158,7 +234,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["height", anInteger]);
 return self;},
-source: unescape('height%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27height%27%20withArgument%3A%20anInteger%0A'),
+source: unescape('height%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27height%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -173,7 +249,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["width", anInteger]);
 return self;},
-source: unescape('width%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27width%27%20withArgument%3A%20anInteger%0A'),
+source: unescape('width%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27width%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -188,7 +264,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["width"]);
 return self;},
-source: unescape('width%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27width%27%0A'),
+source: unescape('width%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27width%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -203,7 +279,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["innerHeight"]);
 return self;},
-source: unescape('innerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerHeight%27%0A'),
+source: unescape('innerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerHeight%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -218,7 +294,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["innerWidth"]);
 return self;},
-source: unescape('innerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerWidth%27%0A'),
+source: unescape('innerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20but%20not%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27innerWidth%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -233,7 +309,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["outerHeight"]);
 return self;},
-source: unescape('outerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%2C%20border%2C%20and%20optionally%20margin.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerHeight%27%0A'),
+source: unescape('outerHeight%0A%20%20%20%20%22Get%20the%20current%20computed%20height%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%2C%20border%2C%20and%20optionally%20margin.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerHeight%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -248,7 +324,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["outerWidth"]);
 return self;},
-source: unescape('outerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20and%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerWidth%27%0A'),
+source: unescape('outerWidth%0A%20%20%20%20%22Get%20the%20current%20computed%20width%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20including%20padding%20and%20border.%22%0A%20%20%20%20%5Eself%20call%3A%20%27outerWidth%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -263,7 +339,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["position"]), "_basicAt_", ["top"]);
 return self;},
-source: unescape('top%0A%20%20%20%20%22Get%20the%20current%20y%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27top%27%0A'),
+source: unescape('top%0A%20%20%20%20%22Get%20the%20current%20y%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27top%27'),
 messageSends: ["basicAt:", "call:"],
 referencedClasses: []
 }),
@@ -278,7 +354,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["position"]), "_basicAt_", ["left"]);
 return self;},
-source: unescape('left%0A%20%20%20%20%22Get%20the%20current%20x%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27left%27%0A'),
+source: unescape('left%0A%20%20%20%20%22Get%20the%20current%20x%20coordinate%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20offset%20parent.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27position%27%29%20basicAt%3A%20%27left%27'),
 messageSends: ["basicAt:", "call:"],
 referencedClasses: []
 }),
@@ -293,7 +369,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["offset"]), "_basicAt_", ["left"]);
 return self;},
-source: unescape('offsetLeft%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27left%27%0A'),
+source: unescape('offsetLeft%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27left%27'),
 messageSends: ["basicAt:", "call:"],
 referencedClasses: []
 }),
@@ -308,7 +384,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["offset"]), "_basicAt_", ["top"]);
 return self;},
-source: unescape('offsetTop%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27top%27%0A'),
+source: unescape('offsetTop%0A%20%20%20%20%22Get%20the%20current%20coordinates%20of%20the%20first%20element%20in%20the%20set%20of%20matched%20elements%2C%20relative%20to%20the%20document.%22%0A%20%20%20%20%5E%28self%20call%3A%20%27offset%27%29%20basicAt%3A%20%27top%27'),
 messageSends: ["basicAt:", "call:"],
 referencedClasses: []
 }),
@@ -323,7 +399,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["scrollLeft"]);
 return self;},
-source: unescape('scrollLeft%0A%20%20%20%20%22Get%20the%20current%20horizontal%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollLeft%27%0A'),
+source: unescape('scrollLeft%0A%20%20%20%20%22Get%20the%20current%20horizontal%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollLeft%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -338,7 +414,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["scrollTop"]);
 return self;},
-source: unescape('scrollTop%0A%20%20%20%20%22Get%20the%20current%20vertical%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollTop%27%0A'),
+source: unescape('scrollTop%0A%20%20%20%20%22Get%20the%20current%20vertical%20position%20of%20the%20scroll%20bar%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%5Eself%20call%3A%20%27scrollTop%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -353,7 +429,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["scrollLeft", anInteger]);
 return self;},
-source: unescape('scrollLeft%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollLeft%27%20withArgument%3A%20anInteger%0A'),
+source: unescape('scrollLeft%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollLeft%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -368,7 +444,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["scrollTop", anInteger]);
 return self;},
-source: unescape('scrollTop%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollTop%27%20withArgument%3A%20anInteger%0A'),
+source: unescape('scrollTop%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollTop%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -383,7 +459,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["focus"]);
 return self;},
-source: unescape('focus%0A%20%20%20%20self%20call%3A%20%27focus%27%0A'),
+source: unescape('focus%0A%20%20%20%20self%20call%3A%20%27focus%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -398,7 +474,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["show"]);
 return self;},
-source: unescape('show%0A%20%20%20%20self%20call%3A%20%27show%27%0A'),
+source: unescape('show%0A%20%20%20%20self%20call%3A%20%27show%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -413,7 +489,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["hide"]);
 return self;},
-source: unescape('hide%0A%20%20%20%20self%20call%3A%20%27hide%27%0A'),
+source: unescape('hide%0A%20%20%20%20self%20call%3A%20%27hide%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -428,7 +504,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["remove"]);
 return self;},
-source: unescape('remove%0A%20%20%20%20self%20call%3A%20%27remove%27%0A'),
+source: unescape('remove%0A%20%20%20%20self%20call%3A%20%27remove%27'),
 messageSends: ["call:"],
 referencedClasses: []
 }),
@@ -443,7 +519,7 @@ fn: function (anEventString, aBlock){
 var self=this;
 self['@jquery'].bind(anEventString, function(e){aBlock(e, self)});
 return self;},
-source: unescape('on%3A%20anEventString%20do%3A%20aBlock%0A%20%20%20%20%22Attach%20aBlock%20for%20anEventString%20on%20the%20element%22%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.bind%28anEventString%2C%20function%28e%29%7BaBlock%28e%2C%20self%29%7D%29%27%7D%0A'),
+source: unescape('on%3A%20anEventString%20do%3A%20aBlock%0A%20%20%20%20%22Attach%20aBlock%20for%20anEventString%20on%20the%20element%22%0A%20%20%20%20%7B%27self%5B%27%27@jquery%27%27%5D.bind%28anEventString%2C%20function%28e%29%7BaBlock%28e%2C%20self%29%7D%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -458,88 +534,12 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["unbind", aString]);
 return self;},
-source: unescape('removeEvents%3A%20aString%0A%20%20%20%20%22Unbind%20all%20handlers%20attached%20to%20the%20event%20aString%22%0A%20%20%20%20self%20call%3A%20%27unbind%27%20withArgument%3A%20aString%0A'),
-messageSends: ["call:withArgument:"],
-referencedClasses: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_append_',
-smalltalk.method({
-selector: 'append:',
-category: 'DOM insertion',
-fn: function (anObject){
-var self=this;
-smalltalk.send(anObject, "_appendToJQuery_", [self]);
-return self;},
-source: unescape('append%3A%20anObject%0A%20%20%20%20%22Append%20anObject%20at%20the%20end%20of%20the%20element.%22%0A%20%20%20%20anObject%20appendToJQuery%3A%20self%0A'),
-messageSends: ["appendToJQuery:"],
-referencedClasses: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_appendElement_',
-smalltalk.method({
-selector: 'appendElement:',
-category: 'DOM insertion',
-fn: function (anElement){
-var self=this;
-smalltalk.send(self, "_call_withArgument_", ["append", anElement]);
-return self;},
-source: unescape('appendElement%3A%20anElement%0A%20%20%20%20%22Append%20anElement%20at%20the%20end%20of%20the%20element.%0A%20%20%20%20%20Dont%27t%20call%20this%20method%20directly%2C%20use%20%23append%3A%20instead%22%0A%20%20%20%20self%20call%3A%20%27append%27%20withArgument%3A%20anElement%0A'),
+source: unescape('removeEvents%3A%20aString%0A%20%20%20%20%22Unbind%20all%20handlers%20attached%20to%20the%20event%20aString%22%0A%20%20%20%20self%20call%3A%20%27unbind%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
 smalltalk.JQuery);
 
-smalltalk.addMethod(
-'_appendToJQuery_',
-smalltalk.method({
-selector: 'appendToJQuery:',
-category: 'DOM insertion',
-fn: function (aJQuery){
-var self=this;
-smalltalk.send(aJQuery, "_appendElement_", [self['@jquery']]);
-return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20jquery%0A'),
-messageSends: ["appendElement:"],
-referencedClasses: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_contents_',
-smalltalk.method({
-selector: 'contents:',
-category: 'DOM insertion',
-fn: function (anObject){
-var self=this;
-smalltalk.send(self, "_empty", []);
-smalltalk.send(self, "_append_", [anObject]);
-return self;},
-source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20empty.%0A%20%20%20%20self%20append%3A%20anObject%0A'),
-messageSends: ["empty", "append:"],
-referencedClasses: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_empty',
-smalltalk.method({
-selector: 'empty',
-category: 'DOM insertion',
-fn: function (){
-var self=this;
-return smalltalk.send(self, "_call_", ["empty"]);
-return self;},
-source: unescape('empty%0A%20%20%20%20%5Eself%20call%3A%20%27empty%27'),
-messageSends: ["call:"],
-referencedClasses: []
-}),
-smalltalk.JQuery);
-
 smalltalk.addMethod(
 '_initializeWithJQueryObject_',
 smalltalk.method({
@@ -549,7 +549,7 @@ fn: function (anObject){
 var self=this;
 self['@jquery']=anObject;
 return self;},
-source: unescape('initializeWithJQueryObject%3A%20anObject%0A%20%20%20%20jquery%20%3A%3D%20anObject%0A'),
+source: unescape('initializeWithJQueryObject%3A%20anObject%0A%20%20%20%20jquery%20%3A%3D%20anObject'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -594,7 +594,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["hasClass", aString]);
 return self;},
-source: unescape('hasClass%3A%20aString%0A%20%20%20%20%22Determine%20whether%20any%20of%20the%20matched%20elements%20are%20assigned%20the%20given%20class.%22%0A%20%20%20%20%5Eself%20call%3A%20%27hasClass%27%20withArgument%3A%20aString%0A'),
+source: unescape('hasClass%3A%20aString%0A%20%20%20%20%22Determine%20whether%20any%20of%20the%20matched%20elements%20are%20assigned%20the%20given%20class.%22%0A%20%20%20%20%5Eself%20call%3A%20%27hasClass%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
 }),
@@ -612,7 +612,7 @@ var newJQuery=nil;
 newJQuery = jQuery(String(aString));
 return smalltalk.send(self, "_from_", [newJQuery]);
 return self;},
-source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%7B%27newJQuery%20%3D%20jQuery%28String%28aString%29%29%27%7D.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery%0A'),
+source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%7B%27newJQuery%20%3D%20jQuery%28String%28aString%29%29%27%7D.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
 messageSends: ["from:"],
 referencedClasses: []
 }),
@@ -627,7 +627,7 @@ fn: function (anObject){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_initializeWithJQueryObject_", [anObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-source: unescape('from%3A%20anObject%0A%20%20%20%20%5Eself%20new%0A%09initializeWithJQueryObject%3A%20anObject%3B%0A%09yourself%0A'),
+source: unescape('from%3A%20anObject%0A%20%20%20%20%5Eself%20new%0A%09initializeWithJQueryObject%3A%20anObject%3B%0A%09yourself'),
 messageSends: ["initializeWithJQueryObject:", "yourself", "new"],
 referencedClasses: []
 }),
@@ -680,23 +680,7 @@ smalltalk.JQuery.klass);
 
 
 smalltalk.addClass('Ajax', smalltalk.Object, ['settings'], 'JQuery');
-smalltalk.Ajax.comment=unescape('instance%20variable%20names%3A%0A-%20settings%20%20A%20set%20of%20key/value%20pairs%20that%20configure%20the%20Ajax%20request.%20All%20settings%20are%20optional.%0A%0AFull%20list%20of%20settings%20options%20at%20http%3A//api.jquery.com/jQuery.ajax/%0A')
-smalltalk.addMethod(
-'_initialize',
-smalltalk.method({
-selector: 'initialize',
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-self['@settings']=smalltalk.send(smalltalk.Dictionary, "_new", []);
-return self;},
-source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20settings%20%3A%3D%20Dictionary%20new%0A'),
-messageSends: ["initialize", "new"],
-referencedClasses: [smalltalk.Dictionary]
-}),
-smalltalk.Ajax);
-
+smalltalk.Ajax.comment=unescape('instance%20variable%20names%3A%0A-%20settings%20%20A%20set%20of%20key/value%20pairs%20that%20configure%20the%20Ajax%20request.%20All%20settings%20are%20optional.%0A%0AFull%20list%20of%20settings%20options%20at%20http%3A//api.jquery.com/jQuery.ajax/')
 smalltalk.addMethod(
 '_at_',
 smalltalk.method({
@@ -706,7 +690,7 @@ fn: function (aKey){
 var self=this;
 return smalltalk.send(self['@settings'], "_at_ifAbsent_", [aKey, (function(){return nil;})]);
 return self;},
-source: unescape('at%3A%20aKey%0A%20%20%20%20%5Esettings%20at%3A%20aKey%20ifAbsent%3A%20%5Bnil%5D%0A'),
+source: unescape('at%3A%20aKey%0A%20%20%20%20%5Esettings%20at%3A%20aKey%20ifAbsent%3A%20%5Bnil%5D'),
 messageSends: ["at:ifAbsent:"],
 referencedClasses: []
 }),
@@ -721,7 +705,7 @@ fn: function (aKey, aValue){
 var self=this;
 smalltalk.send(self['@settings'], "_at_put_", [aKey, aValue]);
 return self;},
-source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%20%20%20%20settings%20at%3A%20aKey%20put%3A%20aValue%0A'),
+source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%20%20%20%20settings%20at%3A%20aKey%20put%3A%20aValue'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -736,7 +720,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_at_", ["url"]);
 return self;},
-source: unescape('url%0A%20%20%20%20%5Eself%20at%3A%20%27url%27%0A'),
+source: unescape('url%0A%20%20%20%20%5Eself%20at%3A%20%27url%27'),
 messageSends: ["at:"],
 referencedClasses: []
 }),
@@ -751,7 +735,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["url", aString]);
 return self;},
-source: unescape('url%3A%20aString%0A%20%20%20%20self%20at%3A%20%27url%27%20put%3A%20aString%0A'),
+source: unescape('url%3A%20aString%0A%20%20%20%20self%20at%3A%20%27url%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
 }),
@@ -766,12 +750,28 @@ fn: function (){
 var self=this;
 jQuery.ajax(self['@settings']);
 return self;},
-source: unescape('send%0A%20%20%20%20%7B%27jQuery.ajax%28self%5B%27%27@settings%27%27%5D%29%27%7D%0A'),
+source: unescape('send%0A%20%20%20%20%7B%27jQuery.ajax%28self%5B%27%27@settings%27%27%5D%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.Ajax);
 
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+self['@settings']=smalltalk.send(smalltalk.Dictionary, "_new", []);
+return self;},
+source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20settings%20%3A%3D%20Dictionary%20new'),
+messageSends: ["initialize", "new"],
+referencedClasses: [smalltalk.Dictionary]
+}),
+smalltalk.Ajax);
+
 
 smalltalk.addMethod(
 '_url_',
@@ -782,7 +782,7 @@ fn: function (aString){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_url_", [aString]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
-source: unescape('url%3A%20aString%0A%20%20%20%20%5Eself%20new%0A%09url%3A%20aString%3B%0A%09yourself%0A'),
+source: unescape('url%3A%20aString%0A%20%20%20%20%5Eself%20new%0A%09url%3A%20aString%3B%0A%09yourself'),
 messageSends: ["url:", "yourself", "new"],
 referencedClasses: []
 }),
@@ -801,7 +801,7 @@ canvas=smalltalk.send(smalltalk.HTMLCanvas, "_new", []);
 smalltalk.send(self, "_value_", [canvas]);
 smalltalk.send(aJQuery, "_append_", [canvas]);
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20HTMLCanvas%20new.%0A%09self%20value%3A%20canvas.%0A%09aJQuery%20append%3A%20canvas%0A'),
+source: unescape('appendToJQuery%3A%20aJQuery%0A%09%7C%20canvas%20%7C%0A%09canvas%20%3A%3D%20HTMLCanvas%20new.%0A%09self%20value%3A%20canvas.%0A%09aJQuery%20append%3A%20canvas'),
 messageSends: ["new", "value:", "append:"],
 referencedClasses: [smalltalk.HTMLCanvas]
 }),
@@ -816,7 +816,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.JQuery, "_fromString_", [self]);
 return self;},
-source: unescape('asJQuery%0A%20%20%20%20%5EJQuery%20fromString%3A%20self%0A'),
+source: unescape('asJQuery%0A%20%20%20%20%5EJQuery%20fromString%3A%20self'),
 messageSends: ["fromString:"],
 referencedClasses: [smalltalk.JQuery]
 }),
@@ -831,7 +831,7 @@ fn: function (aJQuery){
 var self=this;
 aJQuery._appendElement_(String(self));
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%7B%27aJQuery._appendElement_%28String%28self%29%29%27%7D%0A'),
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%7B%27aJQuery._appendElement_%28String%28self%29%29%27%7D'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -846,7 +846,7 @@ fn: function (aJQuery){
 var self=this;
 smalltalk.send(aJQuery, "_appendElement_", [smalltalk.send(self['@root'], "_element", [])]);
 return self;},
-source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20root%20element%0A'),
+source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20root%20element'),
 messageSends: ["appendElement:", "element"],
 referencedClasses: []
 }),

文件差异内容过多而无法显示
+ 132 - 114
js/Kernel.js


文件差异内容过多而无法显示
+ 104 - 74
js/Parser.js


+ 316 - 316
js/SUnit.js

@@ -1,29 +1,29 @@
 smalltalk.addClass('TestCase', smalltalk.Object, ['testedClass'], 'SUnit');
 smalltalk.addMethod(
-'_setUp',
+'_testedClass',
 smalltalk.method({
-selector: 'setUp',
-category: 'running',
+selector: 'testedClass',
+category: 'accessing',
 fn: function (){
 var self=this;
-
+return self['@testedClass'];
 return self;},
-source: unescape('setUp'),
+source: unescape('testedClass%0A%09%5EtestedClass'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-'_tearDown',
+'_testedClass_',
 smalltalk.method({
-selector: 'tearDown',
-category: 'running',
-fn: function (){
+selector: 'testedClass:',
+category: 'accessing',
+fn: function (aClass){
 var self=this;
-
+self['@testedClass']=aClass;
 return self;},
-source: unescape('tearDown'),
+source: unescape('testedClass%3A%20aClass%0A%09testedClass%20%3A%3D%20aClass'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -45,92 +45,62 @@ referencedClasses: []
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-'_methods',
+'_signalFailure_',
 smalltalk.method({
-selector: 'methods',
-category: 'running',
-fn: function (){
+selector: 'signalFailure:',
+category: 'private',
+fn: function (aString){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
+(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send(smalltalk.TestFailure, "_new", []));
 return self;},
-source: unescape('methods%0A%09%5Eself%20class%20methodDictionary%20keys%20select%3A%20%5B%3Aeach%20%7C%20each%20match%3A%20%27%5Etest%27%5D'),
-messageSends: ["select:", "keys", "methodDictionary", "class", "match:"],
+source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
+messageSends: ["messageText:", "signal", "new"],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-'_testedClass',
+'_setUp',
 smalltalk.method({
-selector: 'testedClass',
-category: 'accessing',
+selector: 'setUp',
+category: 'running',
 fn: function (){
 var self=this;
-return self['@testedClass'];
-return self;},
-source: unescape('testedClass%0A%09%5EtestedClass'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.TestCase);
 
-smalltalk.addMethod(
-'_testedClass_',
-smalltalk.method({
-selector: 'testedClass:',
-category: 'accessing',
-fn: function (aClass){
-var self=this;
-self['@testedClass']=aClass;
 return self;},
-source: unescape('testedClass%3A%20aClass%0A%09testedClass%20%3A%3D%20aClass'),
+source: unescape('setUp'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-'_assert_',
+'_tearDown',
 smalltalk.method({
-selector: 'assert:',
-category: 'testing',
-fn: function (aBoolean){
+selector: 'tearDown',
+category: 'running',
+fn: function (){
 var self=this;
-smalltalk.send(aBoolean, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", ["Assertion failed"]);})]);
-return self;},
-source: unescape('assert%3A%20aBoolean%0A%09aBoolean%20ifFalse%3A%20%5Bself%20signalFailure%3A%20%27Assertion%20failed%27%5D'),
-messageSends: ["ifFalse:", "signalFailure:"],
-referencedClasses: []
-}),
-smalltalk.TestCase);
 
-smalltalk.addMethod(
-'_deny_',
-smalltalk.method({
-selector: 'deny:',
-category: 'testing',
-fn: function (aBoolean){
-var self=this;
-smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
 return self;},
-source: unescape('deny%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20not'),
-messageSends: ["assert:", "not"],
+source: unescape('tearDown'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
 smalltalk.addMethod(
-'_signalFailure_',
+'_methods',
 smalltalk.method({
-selector: 'signalFailure:',
-category: 'private',
-fn: function (aString){
+selector: 'methods',
+category: 'running',
+fn: function (){
 var self=this;
-(function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send(smalltalk.TestFailure, "_new", []));
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
 return self;},
-source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
-messageSends: ["messageText:", "signal", "new"],
-referencedClasses: [smalltalk.nil]
+source: unescape('methods%0A%09%5Eself%20class%20methodDictionary%20keys%20select%3A%20%5B%3Aeach%20%7C%20each%20match%3A%20%27%5Etest%27%5D'),
+messageSends: ["select:", "keys", "methodDictionary", "class", "match:"],
+referencedClasses: []
 }),
 smalltalk.TestCase);
 
@@ -162,7 +132,37 @@ smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){sm
 return self;},
 source: unescape('performTestFor%3A%20aResult%0A%09self%20methods%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5B%5Bself%20perform%3A%20each%5D%0A%09%09%09on%3A%20TestFailure%20do%3A%20%5B%3Aex%20%7C%20aResult%20addFailure%3A%20self%20class%20name%2C%20%27%3E%3E%27%2C%20each%5D%5D%0A%09%09%09on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20aResult%20addError%3A%20self%20class%20name%2C%20%27%3E%3E%27%2C%20each%5D.%0A%09%09aResult%20increaseRuns%5D'),
 messageSends: ["do:", "methods", "on:do:", "perform:", "addFailure:", unescape("%2C"), "name", "class", "addError:", "increaseRuns"],
-referencedClasses: [smalltalk.nil,smalltalk.Error]
+referencedClasses: [smalltalk.Error]
+}),
+smalltalk.TestCase);
+
+smalltalk.addMethod(
+'_assert_',
+smalltalk.method({
+selector: 'assert:',
+category: 'testing',
+fn: function (aBoolean){
+var self=this;
+smalltalk.send(aBoolean, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", ["Assertion failed"]);})]);
+return self;},
+source: unescape('assert%3A%20aBoolean%0A%09aBoolean%20ifFalse%3A%20%5Bself%20signalFailure%3A%20%27Assertion%20failed%27%5D'),
+messageSends: ["ifFalse:", "signalFailure:"],
+referencedClasses: []
+}),
+smalltalk.TestCase);
+
+smalltalk.addMethod(
+'_deny_',
+smalltalk.method({
+selector: 'deny:',
+category: 'testing',
+fn: function (aBoolean){
+var self=this;
+smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
+return self;},
+source: unescape('deny%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20not'),
+messageSends: ["assert:", "not"],
+referencedClasses: []
 }),
 smalltalk.TestCase);
 
@@ -178,7 +178,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_deny_", [true]);
 return self;},
-source: unescape('testFailure%0A%09self%20deny%3A%20true%0A%09'),
+source: unescape('testFailure%0A%09self%20deny%3A%20true'),
 messageSends: ["deny:"],
 referencedClasses: []
 }),
@@ -293,73 +293,12 @@ fn: function (){
 var self=this;
 return unescape("%5BTest%20runner%5D");
 return self;},
-source: unescape('label%0A%20%20%20%20%5E%27%5BTest%20runner%5D%27%0A'),
+source: unescape('label%0A%20%20%20%20%5E%27%5BTest%20runner%5D%27'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
-smalltalk.addMethod(
-'_canBeClosed',
-smalltalk.method({
-selector: 'canBeClosed',
-category: 'testing',
-fn: function (){
-var self=this;
-return true;
-return self;},
-source: unescape('canBeClosed%0A%20%20%20%20%5Etrue%0A'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_renderBoxOn_',
-smalltalk.method({
-selector: 'renderBoxOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-(function($rec){smalltalk.send($rec, "_renderCategoriesOn_", [html]);smalltalk.send($rec, "_renderClassesOn_", [html]);return smalltalk.send($rec, "_renderResultsOn_", [html]);})(self);
-return self;},
-source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderCategoriesOn%3A%20html%3B%0A%09renderClassesOn%3A%20html%3B%0A%09renderResultsOn%3A%20html'),
-messageSends: ["renderCategoriesOn:", "renderClassesOn:", "renderResultsOn:"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_renderButtonsOn_',
-smalltalk.method({
-selector: 'renderButtonsOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["Run selected"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_run_", [smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_collect_", [(function(each){return smalltalk.send(each, "_new", []);})])]);})]);})(smalltalk.send(html, "_button", []));
-return self;},
-source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Run%20selected%27%3B%0A%09onClick%3A%20%5Bself%20run%3A%20%28self%20selectedClasses%20collect%3A%20%5B%3Aeach%20%7C%20each%20new%5D%29%5D%0A'),
-messageSends: ["with:", "onClick:", "run:", "collect:", "selectedClasses", "new", "button"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_renderCategoriesOn_',
-smalltalk.method({
-selector: 'renderCategoriesOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-self['@categoriesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit categories"]);
-smalltalk.send(self, "_updateCategoriesList", []);
-return self;},
-source: unescape('renderCategoriesOn%3A%20html%0A%20%20%20%20%09categoriesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20categories%27.%0A%09self%20updateCategoriesList'),
-messageSends: ["class:", "ul", "updateCategoriesList"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
 smalltalk.addMethod(
 '_categories',
 smalltalk.method({
@@ -378,54 +317,6 @@ referencedClasses: [smalltalk.Array]
 }),
 smalltalk.TestRunner);
 
-smalltalk.addMethod(
-'_updateCategoriesList',
-smalltalk.method({
-selector: 'updateCategoriesList',
-category: 'updating',
-fn: function (){
-var self=this;
-smalltalk.send(self['@categoriesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["all"]);smalltalk.send($rec, "_with_", ["All"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectAllCategories", []);})]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_categories", []), "_do_", [(function(each){var li=nil;
-li=smalltalk.send(html, "_li", []);smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [each]), "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_toggleCategory_", [each]);})]);})(li);})]);})]);
-return self;},
-source: unescape('updateCategoriesList%0A%20%20%20%20categoriesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20html%20li%20%0A%09%09class%3A%20%27all%27%3B%0A%09%09with%3A%20%27All%27%3B%0A%09%09onClick%3A%20%5Bself%20selectAllCategories%5D.%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20%28self%20selectedCategories%20includes%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20toggleCategory%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "class:", "with:", "onClick:", "selectAllCategories", "li", "do:", "categories", "ifTrue:", "includes:", "selectedCategories", "toggleCategory:"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_renderClassesOn_',
-smalltalk.method({
-selector: 'renderClassesOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-self['@classesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit classes"]);
-smalltalk.send(self, "_updateClassesList", []);
-return self;},
-source: unescape('renderClassesOn%3A%20html%0A%20%20%20%20%09classesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20classes%27.%0A%09self%20updateClassesList'),
-messageSends: ["class:", "ul", "updateClassesList"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_updateClassesList',
-smalltalk.method({
-selector: 'updateClassesList',
-category: 'updating',
-fn: function (){
-var self=this;
-smalltalk.send(self['@classesList'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_isEmpty", []), "_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["all"]);smalltalk.send($rec, "_with_", ["All"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectAllClasses", []);})]);})(smalltalk.send(html, "_li", []));})]);return smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){var li=nil;
-li=smalltalk.send(html, "_li", []);smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [each]), "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(each, "_name", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_toggleClass_", [each]);})]);})(li);})]);})]);
-return self;},
-source: unescape('updateClassesList%0A%20%20%20%20classesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%28self%20selectedCategories%20isEmpty%29%20ifFalse%3A%20%5B%0A%09%09html%20li%0A%09%09%09class%3A%20%27all%27%3B%0A%09%09%09with%3A%20%27All%27%3B%0A%09%09%09onClick%3A%20%5Bself%20selectAllClasses%5D%5D.%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%09li%20%3A%3D%20html%20li.%0A%09%09%28self%20selectedClasses%20includes%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09%09li%20class%3A%20%27selected%27%5D.%0A%09%09li%0A%09%09%09with%3A%20each%20name%3B%0A%09%09%09onClick%3A%20%5Bself%20toggleClass%3A%20each%5D%5D%5D'),
-messageSends: ["contents:", "ifFalse:", "isEmpty", "selectedCategories", "class:", "with:", "onClick:", "selectAllClasses", "li", "do:", "classes", "ifTrue:", "includes:", "selectedClasses", "name", "toggleClass:"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
 smalltalk.addMethod(
 '_classes',
 smalltalk.method({
@@ -487,193 +378,159 @@ referencedClasses: [smalltalk.Array]
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_selectAllCategories',
+'_progressBar',
 smalltalk.method({
-selector: 'selectAllCategories',
-category: 'actions',
+selector: 'progressBar',
+category: 'accessing',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_categories", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(self['@selectedCategories'], "_includes_", [each]), "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]);})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return smalltalk.send(self['@progressBar'], "_ifNil_", [(function(){return self['@progressBar']=smalltalk.send(smalltalk.ProgressBar, "_new", []);})]);
 return self;},
-source: unescape('selectAllCategories%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedCategories%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedCategories%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["do:", "categories", "ifFalse:", "includes:", "add:", "selectedCategories", "updateCategoriesList", "updateClassesList"],
-referencedClasses: []
+source: unescape('progressBar%0A%09%5EprogressBar%20ifNil%3A%20%5BprogressBar%20%3A%3D%20ProgressBar%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: [smalltalk.ProgressBar]
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_toggleCategory_',
+'_selectedMethods',
 smalltalk.method({
-selector: 'toggleCategory:',
-category: 'actions',
-fn: function (aCategory){
+selector: 'selectedMethods',
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_isSelectedCategory_", [aCategory]), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]);
-(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
+return smalltalk.send(self['@selectedMethods'], "_ifNil_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_collect_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keys", []), "_select_", [(function(key){return smalltalk.send(key, "_beginsWith_", ["test"]);})]);})]);})]);
 return self;},
-source: unescape('toggleCategory%3A%20aCategory%0A%09%28self%20isSelectedCategory%3A%20aCategory%29%20%0A%09%09ifFalse%3A%20%5BselectedCategories%20add%3A%20aCategory%5D%0A%09%09ifTrue%3A%20%5BselectedCategories%20remove%3A%20aCategory%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["ifFalse:ifTrue:", "isSelectedCategory:", "add:", "remove:", "updateCategoriesList", "updateClassesList"],
+source: unescape('selectedMethods%0A%09%5EselectedMethods%20ifNil%3A%20%5Bself%20selectedClasses%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20keys%20select%3A%20%5B%3Akey%20%7C%20%20key%20beginsWith%3A%20%27test%27%20%5D%5D%5D'),
+messageSends: ["ifNil:", "collect:", "selectedClasses", "select:", "keys", "methodDictionary", "beginsWith:"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_toggleClass_',
+'_statusInfo',
 smalltalk.method({
-selector: 'toggleClass:',
-category: 'actions',
-fn: function (aClass){
+selector: 'statusInfo',
+category: 'accessing',
+fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_isSelectedClass_", [aClass]), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]);
-smalltalk.send(self, "_updateClassesList", []);
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
 return self;},
-source: unescape('toggleClass%3A%20aClass%0A%09%28self%20isSelectedClass%3A%20aClass%29%20%0A%09%09ifFalse%3A%20%5BselectedClasses%20add%3A%20aClass%5D%0A%09%09ifTrue%3A%20%5BselectedClasses%20remove%3A%20aClass%5D.%0A%09self%20%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["ifFalse:ifTrue:", "isSelectedClass:", "add:", "remove:", "updateClassesList"],
+source: unescape('statusInfo%0A%09%5Eself%20printTotal%2C%20self%20printPasses%2C%20self%20printErrors%2C%20self%20printFailures'),
+messageSends: [unescape("%2C"), "printTotal", "printPasses", "printErrors", "printFailures"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_isSelectedClass_',
+'_result',
 smalltalk.method({
-selector: 'isSelectedClass:',
-category: 'testing',
-fn: function (aClass){
+selector: 'result',
+category: 'accessing',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
+return self['@result'];
 return self;},
-source: unescape('isSelectedClass%3A%20aClass%0A%09%5E%28self%20selectedClasses%20includes%3A%20aClass%29'),
-messageSends: ["includes:", "selectedClasses"],
+source: unescape('result%0A%09%5Eresult'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_isSelectedCategory_',
+'_failedMethods',
 smalltalk.method({
-selector: 'isSelectedCategory:',
-category: 'testing',
-fn: function (aCategory){
+selector: 'failedMethods',
+category: 'accessing',
+fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_collect_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);return smalltalk.send($rec, "_with_", [each]);})(smalltalk.send(html, "_li", []));})]);
 return self;},
-source: unescape('isSelectedCategory%3A%20aCategory%0A%09%5E%28self%20selectedCategories%20includes%3A%20aCategory%29'),
-messageSends: ["includes:", "selectedCategories"],
+source: unescape('failedMethods%0A%09self%20result%20failures%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%20%0A%09%09%09class%3A%20%27failures%27%3B%0A%09%09%09with%3A%20each%5D'),
+messageSends: ["collect:", "failures", "result", "class:", "with:", "li"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_selectAllClasses',
+'_selectAllCategories',
 smalltalk.method({
-selector: 'selectAllClasses',
+selector: 'selectAllCategories',
 category: 'actions',
 fn: function (){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(self['@selectedClasses'], "_includes_", [each]), "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]);})]);
+smalltalk.send(smalltalk.send(self, "_categories", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(self['@selectedCategories'], "_includes_", [each]), "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_add_", [each]);})]);})]);
 (function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;},
-source: unescape('selectAllClasses%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedClasses%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedClasses%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
-messageSends: ["do:", "classes", "ifFalse:", "includes:", "add:", "selectedClasses", "updateCategoriesList", "updateClassesList"],
-referencedClasses: []
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_run_',
-smalltalk.method({
-selector: 'run:',
-category: 'actions',
-fn: function (aCollection){
-var self=this;
-self['@result']=smalltalk.send(smalltalk.TestResult, "_new", []);
-(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
-smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
-smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_inject_into_", [(0), (function(acc, each){return smalltalk.send(acc, "__plus", [smalltalk.send(smalltalk.send(each, "_methods", []), "_size", [])]);})])]);
-smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@result'], "_runs", []), "__slash", [smalltalk.send(self['@result'], "_total", [])]), "__star", [(100)])]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
-return self;},
-source: unescape('run%3A%20aCollection%0A%09result%20%3A%3D%20TestResult%20new.%0A%09self%20%0A%09%09updateStatusDiv%3B%0A%09%09updateMethodsList.%0A%09self%20progressBar%20updatePercent%3A%200.%0A%09result%20total%3A%20%28aCollection%20inject%3A%200%20into%3A%20%5B%3Aacc%20%3Aeach%20%7C%20acc%20+%20each%20methods%20size%5D%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5Beach%20runCaseFor%3A%20result.%0A%09%09self%20progressBar%20updatePercent%3A%20result%20runs%20/%20result%20total%20*%20100.%0A%09%09self%20updateStatusDiv.%0A%09%09self%20updateMethodsList%5D%20valueWithTimeout%3A%20100%5D.'),
-messageSends: ["new", "updateStatusDiv", "updateMethodsList", "updatePercent:", "progressBar", "total:", "inject:into:", unescape("+"), "size", "methods", "do:", "valueWithTimeout:", "runCaseFor:", unescape("*"), unescape("/"), "runs", "total"],
-referencedClasses: [smalltalk.nil]
-}),
-smalltalk.TestRunner);
-
-smalltalk.addMethod(
-'_renderResultsOn_',
-smalltalk.method({
-selector: 'renderResultsOn:',
-category: 'rendering',
-fn: function (html){
-var self=this;
-self['@statusDiv']=smalltalk.send(html, "_div", []);
-smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
-self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit methods"]);
-smalltalk.send(self, "_updateMethodsList", []);
-smalltalk.send(self, "_updateStatusDiv", []);
-return self;},
-source: unescape('renderResultsOn%3A%20html%0A%20%20%20%20%09statusDiv%20%3A%3D%20html%20div.%0A%09html%20with%3A%20self%20progressBar.%0A%20%20%20%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20methods%27.%0A%09self%20updateMethodsList.%0A%09self%20updateStatusDiv'),
-messageSends: ["div", "with:", "progressBar", "class:", "ul", "updateMethodsList", "updateStatusDiv"],
+source: unescape('selectAllCategories%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedCategories%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedCategories%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["do:", "categories", "ifFalse:", "includes:", "add:", "selectedCategories", "updateCategoriesList", "updateClassesList"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_progressBar',
-smalltalk.method({
-selector: 'progressBar',
-category: 'accessing',
-fn: function (){
+'_toggleCategory_',
+smalltalk.method({
+selector: 'toggleCategory:',
+category: 'actions',
+fn: function (aCategory){
 var self=this;
-return smalltalk.send(self['@progressBar'], "_ifNil_", [(function(){return self['@progressBar']=smalltalk.send(smalltalk.ProgressBar, "_new", []);})]);
+smalltalk.send(smalltalk.send(self, "_isSelectedCategory_", [aCategory]), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedCategories'], "_add_", [aCategory]);}), (function(){return smalltalk.send(self['@selectedCategories'], "_remove_", [aCategory]);})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;},
-source: unescape('progressBar%0A%09%5EprogressBar%20ifNil%3A%20%5BprogressBar%20%3A%3D%20ProgressBar%20new%5D'),
-messageSends: ["ifNil:", "new"],
-referencedClasses: [smalltalk.ProgressBar]
+source: unescape('toggleCategory%3A%20aCategory%0A%09%28self%20isSelectedCategory%3A%20aCategory%29%20%0A%09%09ifFalse%3A%20%5BselectedCategories%20add%3A%20aCategory%5D%0A%09%09ifTrue%3A%20%5BselectedCategories%20remove%3A%20aCategory%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["ifFalse:ifTrue:", "isSelectedCategory:", "add:", "remove:", "updateCategoriesList", "updateClassesList"],
+referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_selectedMethods',
+'_toggleClass_',
 smalltalk.method({
-selector: 'selectedMethods',
-category: 'accessing',
-fn: function (){
+selector: 'toggleClass:',
+category: 'actions',
+fn: function (aClass){
 var self=this;
-return smalltalk.send(self['@selectedMethods'], "_ifNil_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_collect_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keys", []), "_select_", [(function(key){return smalltalk.send(key, "_beginsWith_", ["test"]);})]);})]);})]);
+smalltalk.send(smalltalk.send(self, "_isSelectedClass_", [aClass]), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self['@selectedClasses'], "_add_", [aClass]);}), (function(){return smalltalk.send(self['@selectedClasses'], "_remove_", [aClass]);})]);
+smalltalk.send(self, "_updateClassesList", []);
 return self;},
-source: unescape('selectedMethods%0A%09%5EselectedMethods%20ifNil%3A%20%5Bself%20selectedClasses%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20keys%20select%3A%20%5B%3Akey%20%7C%20%20key%20beginsWith%3A%20%27test%27%20%5D%5D%5D'),
-messageSends: ["ifNil:", "collect:", "selectedClasses", "select:", "keys", "methodDictionary", "beginsWith:"],
+source: unescape('toggleClass%3A%20aClass%0A%09%28self%20isSelectedClass%3A%20aClass%29%20%0A%09%09ifFalse%3A%20%5BselectedClasses%20add%3A%20aClass%5D%0A%09%09ifTrue%3A%20%5BselectedClasses%20remove%3A%20aClass%5D.%0A%09self%20%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["ifFalse:ifTrue:", "isSelectedClass:", "add:", "remove:", "updateClassesList"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_statusInfo',
+'_selectAllClasses',
 smalltalk.method({
-selector: 'statusInfo',
-category: 'accessing',
+selector: 'selectAllClasses',
+category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_printTotal", []), "__comma", [smalltalk.send(self, "_printPasses", [])]), "__comma", [smalltalk.send(self, "_printErrors", [])]), "__comma", [smalltalk.send(self, "_printFailures", [])]);
+smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(self['@selectedClasses'], "_includes_", [each]), "_ifFalse_", [(function(){return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_add_", [each]);})]);})]);
+(function($rec){smalltalk.send($rec, "_updateCategoriesList", []);return smalltalk.send($rec, "_updateClassesList", []);})(self);
 return self;},
-source: unescape('statusInfo%0A%09%5Eself%20printTotal%2C%20self%20printPasses%2C%20self%20printErrors%2C%20self%20printFailures'),
-messageSends: [unescape("%2C"), "printTotal", "printPasses", "printErrors", "printFailures"],
+source: unescape('selectAllClasses%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%28selectedClasses%20includes%3A%20each%29%20ifFalse%3A%20%5B%0A%09%09%09self%20selectedClasses%20add%3A%20each%5D%5D.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList'),
+messageSends: ["do:", "classes", "ifFalse:", "includes:", "add:", "selectedClasses", "updateCategoriesList", "updateClassesList"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_result',
+'_run_',
 smalltalk.method({
-selector: 'result',
-category: 'accessing',
-fn: function (){
+selector: 'run:',
+category: 'actions',
+fn: function (aCollection){
 var self=this;
-return self['@result'];
+self['@result']=smalltalk.send(smalltalk.TestResult, "_new", []);
+(function($rec){smalltalk.send($rec, "_updateStatusDiv", []);return smalltalk.send($rec, "_updateMethodsList", []);})(self);
+smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(0)]);
+smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_inject_into_", [(0), (function(acc, each){return smalltalk.send(acc, "__plus", [smalltalk.send(smalltalk.send(each, "_methods", []), "_size", [])]);})])]);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [smalltalk.send(smalltalk.send(smalltalk.send(self['@result'], "_runs", []), "__slash", [smalltalk.send(self['@result'], "_total", [])]), "__star", [(100)])]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
 return self;},
-source: unescape('result%0A%09%5Eresult'),
-messageSends: [],
+source: unescape('run%3A%20aCollection%0A%09result%20%3A%3D%20TestResult%20new.%0A%09self%20%0A%09%09updateStatusDiv%3B%0A%09%09updateMethodsList.%0A%09self%20progressBar%20updatePercent%3A%200.%0A%09result%20total%3A%20%28aCollection%20inject%3A%200%20into%3A%20%5B%3Aacc%20%3Aeach%20%7C%20acc%20+%20each%20methods%20size%5D%29.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09%5Beach%20runCaseFor%3A%20result.%0A%09%09self%20progressBar%20updatePercent%3A%20result%20runs%20/%20result%20total%20*%20100.%0A%09%09self%20updateStatusDiv.%0A%09%09self%20updateMethodsList%5D%20valueWithTimeout%3A%20100%5D.'),
+messageSends: ["new", "updateStatusDiv", "updateMethodsList", "updatePercent:", "progressBar", "total:", "inject:into:", unescape("+"), "size", "methods", "do:", "valueWithTimeout:", "runCaseFor:", unescape("*"), unescape("/"), "runs", "total"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
@@ -690,7 +547,7 @@ self['@result']=smalltalk.send(smalltalk.TestResult, "_new", []);
 return self;},
 source: unescape('initialize%0A%09super%20initialize.%0A%09result%20%3A%3D%20TestResult%20new'),
 messageSends: ["initialize", "new"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: []
 }),
 smalltalk.TestRunner);
 
@@ -755,16 +612,82 @@ referencedClasses: []
 smalltalk.TestRunner);
 
 smalltalk.addMethod(
-'_failedMethods',
+'_renderBoxOn_',
 smalltalk.method({
-selector: 'failedMethods',
-category: 'accessing',
-fn: function (){
+selector: 'renderBoxOn:',
+category: 'rendering',
+fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_collect_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);return smalltalk.send($rec, "_with_", [each]);})(smalltalk.send(html, "_li", []));})]);
+(function($rec){smalltalk.send($rec, "_renderCategoriesOn_", [html]);smalltalk.send($rec, "_renderClassesOn_", [html]);return smalltalk.send($rec, "_renderResultsOn_", [html]);})(self);
 return self;},
-source: unescape('failedMethods%0A%09self%20result%20failures%20collect%3A%20%5B%3Aeach%20%7C%0A%09%09html%20li%20%0A%09%09%09class%3A%20%27failures%27%3B%0A%09%09%09with%3A%20each%5D'),
-messageSends: ["collect:", "failures", "result", "class:", "with:", "li"],
+source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderCategoriesOn%3A%20html%3B%0A%09renderClassesOn%3A%20html%3B%0A%09renderResultsOn%3A%20html'),
+messageSends: ["renderCategoriesOn:", "renderClassesOn:", "renderResultsOn:"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+(function($rec){smalltalk.send($rec, "_with_", ["Run selected"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_run_", [smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_collect_", [(function(each){return smalltalk.send(each, "_new", []);})])]);})]);})(smalltalk.send(html, "_button", []));
+return self;},
+source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Run%20selected%27%3B%0A%09onClick%3A%20%5Bself%20run%3A%20%28self%20selectedClasses%20collect%3A%20%5B%3Aeach%20%7C%20each%20new%5D%29%5D'),
+messageSends: ["with:", "onClick:", "run:", "collect:", "selectedClasses", "new", "button"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_renderCategoriesOn_',
+smalltalk.method({
+selector: 'renderCategoriesOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@categoriesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit categories"]);
+smalltalk.send(self, "_updateCategoriesList", []);
+return self;},
+source: unescape('renderCategoriesOn%3A%20html%0A%20%20%20%20%09categoriesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20categories%27.%0A%09self%20updateCategoriesList'),
+messageSends: ["class:", "ul", "updateCategoriesList"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_renderClassesOn_',
+smalltalk.method({
+selector: 'renderClassesOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@classesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit classes"]);
+smalltalk.send(self, "_updateClassesList", []);
+return self;},
+source: unescape('renderClassesOn%3A%20html%0A%20%20%20%20%09classesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20classes%27.%0A%09self%20updateClassesList'),
+messageSends: ["class:", "ul", "updateClassesList"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_renderResultsOn_',
+smalltalk.method({
+selector: 'renderResultsOn:',
+category: 'rendering',
+fn: function (html){
+var self=this;
+self['@statusDiv']=smalltalk.send(html, "_div", []);
+smalltalk.send(html, "_with_", [smalltalk.send(self, "_progressBar", [])]);
+self['@methodsList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column sunit methods"]);
+smalltalk.send(self, "_updateMethodsList", []);
+smalltalk.send(self, "_updateStatusDiv", []);
+return self;},
+source: unescape('renderResultsOn%3A%20html%0A%20%20%20%20%09statusDiv%20%3A%3D%20html%20div.%0A%09html%20with%3A%20self%20progressBar.%0A%20%20%20%09methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20sunit%20methods%27.%0A%09self%20updateMethodsList.%0A%09self%20updateStatusDiv'),
+messageSends: ["div", "with:", "progressBar", "class:", "ul", "updateMethodsList", "updateStatusDiv"],
 referencedClasses: []
 }),
 smalltalk.TestRunner);
@@ -799,6 +722,83 @@ referencedClasses: []
 }),
 smalltalk.TestRunner);
 
+smalltalk.addMethod(
+'_canBeClosed',
+smalltalk.method({
+selector: 'canBeClosed',
+category: 'testing',
+fn: function (){
+var self=this;
+return true;
+return self;},
+source: unescape('canBeClosed%0A%20%20%20%20%5Etrue'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_isSelectedClass_',
+smalltalk.method({
+selector: 'isSelectedClass:',
+category: 'testing',
+fn: function (aClass){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [aClass]);
+return self;},
+source: unescape('isSelectedClass%3A%20aClass%0A%09%5E%28self%20selectedClasses%20includes%3A%20aClass%29'),
+messageSends: ["includes:", "selectedClasses"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_isSelectedCategory_',
+smalltalk.method({
+selector: 'isSelectedCategory:',
+category: 'testing',
+fn: function (aCategory){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [aCategory]);
+return self;},
+source: unescape('isSelectedCategory%3A%20aCategory%0A%09%5E%28self%20selectedCategories%20includes%3A%20aCategory%29'),
+messageSends: ["includes:", "selectedCategories"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_updateCategoriesList',
+smalltalk.method({
+selector: 'updateCategoriesList',
+category: 'updating',
+fn: function (){
+var self=this;
+smalltalk.send(self['@categoriesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["all"]);smalltalk.send($rec, "_with_", ["All"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectAllCategories", []);})]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_categories", []), "_do_", [(function(each){var li=nil;
+li=smalltalk.send(html, "_li", []);smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_includes_", [each]), "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);return (function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_toggleCategory_", [each]);})]);})(li);})]);})]);
+return self;},
+source: unescape('updateCategoriesList%0A%20%20%20%20categoriesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%20%20%20%20html%20li%20%0A%09%09class%3A%20%27all%27%3B%0A%09%09with%3A%20%27All%27%3B%0A%09%09onClick%3A%20%5Bself%20selectAllCategories%5D.%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20%28self%20selectedCategories%20includes%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20toggleCategory%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "class:", "with:", "onClick:", "selectAllCategories", "li", "do:", "categories", "ifTrue:", "includes:", "selectedCategories", "toggleCategory:"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_updateClassesList',
+smalltalk.method({
+selector: 'updateClassesList',
+category: 'updating',
+fn: function (){
+var self=this;
+smalltalk.send(self['@classesList'], "_contents_", [(function(html){smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedCategories", []), "_isEmpty", []), "_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["all"]);smalltalk.send($rec, "_with_", ["All"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectAllClasses", []);})]);})(smalltalk.send(html, "_li", []));})]);return smalltalk.send(smalltalk.send(self, "_classes", []), "_do_", [(function(each){var li=nil;
+li=smalltalk.send(html, "_li", []);smalltalk.send(smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_includes_", [each]), "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(each, "_name", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_toggleClass_", [each]);})]);})(li);})]);})]);
+return self;},
+source: unescape('updateClassesList%0A%20%20%20%20classesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%28self%20selectedCategories%20isEmpty%29%20ifFalse%3A%20%5B%0A%09%09html%20li%0A%09%09%09class%3A%20%27all%27%3B%0A%09%09%09with%3A%20%27All%27%3B%0A%09%09%09onClick%3A%20%5Bself%20selectAllClasses%5D%5D.%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%09li%20%3A%3D%20html%20li.%0A%09%09%28self%20selectedClasses%20includes%3A%20each%29%20ifTrue%3A%20%5B%0A%09%09%09li%20class%3A%20%27selected%27%5D.%0A%09%09li%0A%09%09%09with%3A%20each%20name%3B%0A%09%09%09onClick%3A%20%5Bself%20toggleClass%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "ifFalse:", "isEmpty", "selectedCategories", "class:", "with:", "onClick:", "selectAllClasses", "li", "do:", "classes", "ifTrue:", "includes:", "selectedClasses", "name", "toggleClass:"],
+referencedClasses: []
+}),
+smalltalk.TestRunner);
+
 smalltalk.addMethod(
 '_updateMethodsList',
 smalltalk.method({
@@ -833,26 +833,6 @@ smalltalk.TestRunner);
 
 
 smalltalk.addClass('TestResult', smalltalk.Object, ['timestamp', 'runs', 'errors', 'failures', 'total'], 'SUnit');
-smalltalk.addMethod(
-'_initialize',
-smalltalk.method({
-selector: 'initialize',
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_initialize", [], smalltalk.Object);
-self['@timestamp']=smalltalk.send(smalltalk.Date, "_now", []);
-self['@runs']=(0);
-self['@errors']=smalltalk.send(smalltalk.Array, "_new", []);
-self['@failures']=smalltalk.send(smalltalk.Array, "_new", []);
-self['@total']=(0);
-return self;},
-source: unescape('initialize%0A%09super%20initialize.%0A%09timestamp%20%3A%3D%20Date%20now.%0A%09runs%20%3A%3D%200.%0A%09errors%20%3A%3D%20Array%20new.%0A%09failures%20%3A%3D%20Array%20new.%0A%09total%20%3A%3D%200'),
-messageSends: ["initialize", "now", "new"],
-referencedClasses: [smalltalk.Date,smalltalk.Array]
-}),
-smalltalk.TestResult);
-
 smalltalk.addMethod(
 '_timestamp',
 smalltalk.method({
@@ -1003,6 +983,26 @@ referencedClasses: []
 }),
 smalltalk.TestResult);
 
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+self['@timestamp']=smalltalk.send(smalltalk.Date, "_now", []);
+self['@runs']=(0);
+self['@errors']=smalltalk.send(smalltalk.Array, "_new", []);
+self['@failures']=smalltalk.send(smalltalk.Array, "_new", []);
+self['@total']=(0);
+return self;},
+source: unescape('initialize%0A%09super%20initialize.%0A%09timestamp%20%3A%3D%20Date%20now.%0A%09runs%20%3A%3D%200.%0A%09errors%20%3A%3D%20Array%20new.%0A%09failures%20%3A%3D%20Array%20new.%0A%09total%20%3A%3D%200'),
+messageSends: ["initialize", "now", "new"],
+referencedClasses: [smalltalk.Date,smalltalk.Array]
+}),
+smalltalk.TestResult);
+
 
 
 smalltalk.addClass('ExampleTest2', smalltalk.TestCase, [], 'SUnit');

+ 9 - 84
st/Canvas.st

@@ -5,7 +5,7 @@ Object subclass: #CanvasRenderingContext
 !CanvasRenderingContext methodsFor: 'drawing arcs'!
 
 arcTo: aPoint radius: aNumber startAngle: aNumber2 endAngle: aNumber3 anticlockwise: aBoolean
-	{'self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean)'} 
+	{'self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean)'}
 !
 
 arcTo: aPoint radius: aNumber
@@ -74,30 +74,20 @@ Object subclass: #HTMLCanvas
 	instanceVariableNames: 'root'
 	category: 'Canvas'!
 
-!HTMLCanvas methodsFor: '*JQuery'!
-
-appendToJQuery: aJQuery
-    aJQuery appendElement: root element
-
-! !
-
 !HTMLCanvas methodsFor: 'accessing'!
 
 root: aTagBrush
     root := aTagBrush
-
 !
 
 root
     ^root
-
 ! !
 
 !HTMLCanvas methodsFor: 'adding'!
 
 with: anObject
     ^self root with: anObject
-
 ! !
 
 !HTMLCanvas methodsFor: 'initialization'!
@@ -105,155 +95,126 @@ with: anObject
 initialize
     super initialize.
     root := TagBrush fromString: 'div' canvas: self
-
 ! !
 
 !HTMLCanvas methodsFor: 'tags'!
 
 newTag: aString
     ^TagBrush fromString: aString canvas: self
-
 !
 
 tag: aString
     ^root addBrush: (self newTag: aString)
-
 !
 
 h1
     ^self tag: 'h1'
-
 !
 
 h2
     ^self tag: 'h2'
-
 !
 
 h3
     ^self tag: 'h3'
-
 !
 
 h4
     ^self tag: 'h4'
-
 !
 
 h5
     ^self tag: 'h5'
-
 !
 
 h6
     ^self tag: 'h6'
-
 !
 
 p
     ^self tag: 'p'
-
 !
 
 div
     ^self tag: 'div'
-
 !
 
 span
     ^self tag: 'span'
-
 !
 
 img
     ^self tag: 'img'
-
 !
 
 ul
     ^self tag: 'ul'
-
 !
 
 ol
     ^self tag: 'ol'
-
 !
 
 li
     ^self tag: 'li'
-
 !
 
 table
     ^self tag: 'table'
-
 !
 
 tr
     ^self tag: 'tr'
-
 !
 
 td 
     ^self tag: 'td'
-
 !
 
 th
     ^self tag: 'th'
-
 !
 
 form
     ^self tag: 'form'
-
 !
 
 input
     ^self tag: 'input'
-
 !
 
 button
     ^self tag: 'button'
-
 !
 
 select
     ^self tag: 'select'
-
 !
 
 option
     ^self tag: 'option'
-
 !
 
 textarea
     ^self tag: 'textarea'
-
 !
 
 a
     ^self tag: 'a'
-
 !
 
 canvas
 	^self tag: 'canvas'
-
 ! !
 
 Object subclass: #TagBrush
-	instanceVariableNames: 'canvas, element'
+	instanceVariableNames: 'canvas element'
 	category: 'Canvas'!
 
 !TagBrush methodsFor: 'accessing'!
 
 element
     ^element
-
 ! !
 
 !TagBrush methodsFor: 'adding'!
@@ -261,28 +222,23 @@ element
 contents: anObject
     self asJQuery empty.
     self append: anObject
-
 !
 
 addBrush: aTagBrush
     self appendChild: aTagBrush element.
     ^aTagBrush
-
 !
 
 with: anObject
     self append: anObject
-
 !
 
 append: anObject
     anObject appendToBrush: self
-
 !
 
 appendToBrush: aTagBrush
     aTagBrush addBrush: self
-
 !
 
 appendBlock: aBlock
@@ -291,108 +247,88 @@ appendBlock: aBlock
     canvas root: self.
     aBlock value: canvas.
     canvas root: root
-
 !
 
 appendChild: anElement
     {'self[''@element''].appendChild(anElement)'}
-
 !
 
 appendString: aString
     self appendChild: (self createTextNodeFor: aString)
-
 ! !
 
 !TagBrush methodsFor: 'attributes'!
 
 at: aString put: aValue
     {'self[''@element''].setAttribute(aString, aValue)'}
-
 !
 
 removeAt: aString
     {'self[''@element''].removeAttribute(aString)'}
-
 !
 
 class: aString
     self at: 'class' put: aString
-
 !
 
 id: aString
     self at: 'id' put: aString
-
 !
 
 src: aString
     self  at: 'src' put: aString
-
 !
 
 href: aString
     self at: 'href' put: aString
-
 !
 
 title: aString
     self at: 'title' put: aString
-
 !
 
 style: aString
     self at: 'style' put: aString
-
 ! !
 
 !TagBrush methodsFor: 'converting'!
 
 asJQuery
 	{'return smalltalk.JQuery._from_(jQuery(self[''@element'']))'}
-
 !
 
 asJQueryDo: aBlock
     aBlock value: self asJQuery
-
 ! !
 
 !TagBrush methodsFor: 'events'!
 
 onKeyDown: aBlock
     self asJQuery on: 'keydown' do: aBlock
-
 !
 
 onKeyPress: aBlock
     self asJQuery on: 'keypress' do: aBlock
-
 !
 
 onKeyUp: aBlock
     self asJQuery on: 'keyup' do: aBlock
-
 !
 
 onFocus: aBlock
     self asJQuery on: 'focus' do: aBlock
-
 !
 
 onBlur: aBlock
     self asJQuery on: 'blur' do: aBlock
-
 !
 
 onChange: aBlock
     self asJQuery on: 'change' do: aBlock
-
 !
 
 onClick: aBlock
     self asJQuery on: 'click' do: aBlock
-
 ! !
 
 !TagBrush methodsFor: 'initialization'!
@@ -400,19 +336,16 @@ onClick: aBlock
 initializeFromString: aString canvas: aCanvas
     element := self createElementFor: aString.
     canvas := aCanvas
-
 ! !
 
 !TagBrush methodsFor: 'private'!
 
 createElementFor: aString
 	{'return document.createElement(String(aString))'}
-
 !
 
 createTextNodeFor: aString
 	{'return document.createTextNode(String(aString))'}
-
 ! !
 
 !TagBrush class methodsFor: 'instance creation'!
@@ -421,7 +354,6 @@ fromString: aString canvas: aCanvas
     ^self new
 	initializeFromString: aString canvas: aCanvas;
 	yourself
-
 ! !
 
 Object subclass: #Widget
@@ -432,29 +364,24 @@ Object subclass: #Widget
 
 root
     ^root
-
 ! !
 
 !Widget methodsFor: 'actions'!
 
 alert: aString
     {'alert(aString)'}
-
 !
 
 confirm: aString
     {'return window.confirm(aString)'}
-
 !
 
 prompt: aString
     ^self prompt: aString default: ''
-
 !
 
 prompt: aString default: anotherString
     {'return window.prompt(aString, anotherString)'}
-
 !
 
 update
@@ -463,20 +390,17 @@ update
     canvas root: self root.
     self root asJQuery empty.
     self renderOn: canvas
-
 ! !
 
 !Widget methodsFor: 'adding'!
 
 appendToBrush: aTagBrush
     self appendToJQuery: aTagBrush asJQuery
-
 !
 
 appendToJQuery: aJQuery
     self render.
     aJQuery append: self root asJQuery
-
 ! !
 
 !Widget methodsFor: 'rendering'!
@@ -486,12 +410,10 @@ render
     canvas := HTMLCanvas new.
     root := canvas root.
     self renderOn: canvas
-
 !
 
 renderOn: html
     self
-
 ! !
 
 TagBrush subclass: #CanvasBrush
@@ -518,18 +440,21 @@ canvas: aCanvas
 		yourself
 ! !
 
-
+!Object methodsFor: '*Canvas'!
 
 appendToBrush: aTagBrush
     aTagBrush append: self asString
+! !
 
-!
+!BlockClosure methodsFor: '*Canvas'!
 
 appendToBrush: aTagBrush
     aTagBrush appendBlock: self
-!
+! !
+
+!String methodsFor: '*Canvas'!
 
 appendToBrush: aTagBrush
     aTagBrush appendString: self
+! !
 
-!

+ 9 - 83
st/Compiler.st

@@ -6,105 +6,88 @@ Object subclass: #Node
 
 nodes
 	^nodes ifNil: [nodes := Array new]
-
 !
 
 addNode: aNode
 	self nodes add: aNode
-
 ! !
 
 !Node methodsFor: 'building'!
 
 nodes: aCollection
 	nodes := aCollection
-
 ! !
 
 !Node methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitNode: self
-
 ! !
 
 Node subclass: #MethodNode
-	instanceVariableNames: 'selector, arguments, source'
+	instanceVariableNames: 'selector arguments source'
 	category: 'Compiler'!
 
 !MethodNode methodsFor: 'accessing'!
 
 selector
 	^selector
-
 !
 
 selector: aString
 	selector := aString
-
 !
 
 arguments
 	^arguments ifNil: [#()]
-
 !
 
 arguments: aCollection
 	arguments := aCollection
-
 !
 
 source
 	^source
-
 !
 
 source: aString
 	source := aString
-
 ! !
 
 !MethodNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitMethodNode: self
-
 ! !
 
 Node subclass: #SendNode
-	instanceVariableNames: 'selector, arguments, receiver'
+	instanceVariableNames: 'selector arguments receiver'
 	category: 'Compiler'!
 
 !SendNode methodsFor: 'accessing'!
 
 selector
 	^selector
-
 !
 
 selector: aString
 	selector := aString
-
 !
 
 arguments
 	^arguments ifNil: [arguments := #()]
-
 !
 
 arguments: aCollection
 	arguments := aCollection
-
 !
 
 receiver
 	^receiver
-
 !
 
 receiver: aNode
 	receiver := aNode
-
 !
 
 valueForReceiver: anObject
@@ -115,7 +98,6 @@ valueForReceiver: anObject
 	    selector: self selector;
 	    arguments: self arguments;
 	    yourself
-
 !
 
 cascadeNodeWithMessages: aCollection
@@ -128,14 +110,12 @@ cascadeNodeWithMessages: aCollection
 	    receiver: self receiver;
 	    nodes: (Array with: first), aCollection;
 	    yourself
-
 ! !
 
 !SendNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitSendNode: self
-
 ! !
 
 Node subclass: #CascadeNode
@@ -146,52 +126,44 @@ Node subclass: #CascadeNode
 
 receiver
 	^receiver
-
 !
 
 receiver: aNode
 	receiver := aNode
-
 ! !
 
 !CascadeNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitCascadeNode: self
-
 ! !
 
 Node subclass: #AssignmentNode
-	instanceVariableNames: 'left, right'
+	instanceVariableNames: 'left right'
 	category: 'Compiler'!
 
 !AssignmentNode methodsFor: 'accessing'!
 
 left
 	^left
-
 !
 
 left: aNode
 	left := aNode
-
 !
 
 right
 	^right
-
 !
 
 right: aNode
 	right := aNode
-
 ! !
 
 !AssignmentNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitAssignmentNode: self
-
 ! !
 
 Node subclass: #BlockNode
@@ -202,19 +174,16 @@ Node subclass: #BlockNode
 
 parameters
 	^parameters ifNil: [parameters := Array new]
-
 !
 
 parameters: aCollection
 	parameters := aCollection
-
 ! !
 
 !BlockNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitBlockNode: self
-
 ! !
 
 Node subclass: #SequenceNode
@@ -225,12 +194,10 @@ Node subclass: #SequenceNode
 
 temps
 	^temps ifNil: [#()]
-
 !
 
 temps: aCollection
 	temps := aCollection
-
 ! !
 
 !SequenceNode methodsFor: 'testing'!
@@ -240,14 +207,12 @@ asBlockSequenceNode
 	    nodes: self nodes;
 	    temps: self temps;
 	    yourself
-
 ! !
 
 !SequenceNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitSequenceNode: self
-
 ! !
 
 SequenceNode subclass: #BlockSequenceNode
@@ -258,7 +223,6 @@ SequenceNode subclass: #BlockSequenceNode
 
 accept: aVisitor
 	aVisitor visitBlockSequenceNode: self
-
 ! !
 
 Node subclass: #ReturnNode
@@ -269,7 +233,6 @@ Node subclass: #ReturnNode
 
 accept: aVisitor
 	aVisitor visitReturnNode: self
-
 ! !
 
 Node subclass: #ValueNode
@@ -280,19 +243,16 @@ Node subclass: #ValueNode
 
 value
 	^value
-
 !
 
 value: anObject
 	value := anObject
-
 ! !
 
 !ValueNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitValueNode: self
-
 ! !
 
 ValueNode subclass: #VariableNode
@@ -303,7 +263,6 @@ ValueNode subclass: #VariableNode
 
 accept: aVisitor
 	aVisitor visitVariableNode: self
-
 ! !
 
 VariableNode subclass: #ClassReferenceNode
@@ -314,7 +273,6 @@ VariableNode subclass: #ClassReferenceNode
 
 accept: aVisitor
 	aVisitor visitClassReferenceNode: self
-
 ! !
 
 Node subclass: #JSStatementNode
@@ -325,19 +283,16 @@ Node subclass: #JSStatementNode
 
 source
 	^source ifNil: ['']
-
 !
 
 source: aString
 	source := aString
-
 ! !
 
 !JSStatementNode methodsFor: 'visiting'!
 
 accept: aVisitor
 	aVisitor visitJSStatementNode: self
-
 ! !
 
 Object subclass: #NodeVisitor
@@ -348,67 +303,54 @@ Object subclass: #NodeVisitor
 
 visit: aNode
 	aNode accept: self
-
 !
 
 visitNode: aNode
-
 !
 
 visitMethodNode: aNode
 	self visitNode: aNode
-
 !
 
 visitSequenceNode: aNode
 	self visitNode: aNode
-
 !
 
 visitBlockSequenceNode: aNode
 	self visitSequenceNode: aNode
-
 !
 
 visitBlockNode: aNode
 	self visitNode: aNode
-
 !
 
 visitReturnNode: aNode
 	self visitNode: aNode
-
 !
 
 visitSendNode: aNode
 	self visitNode: aNode
-
 !
 
 visitCascadeNode: aNode
 	self visitNode: aNode
-
 !
 
 visitValueNode: aNode
 	self visitNode: aNode
-
 !
 
 visitVariableNode: aNode
-
 !
 
 visitAssignmentNode: aNode
 	self visitNode: aNode
-
 !
 
 visitClassReferenceNode: aNode
 	self 
 	    nextPutAll: 'smalltalk.';
 	    nextPutAll: aNode value
-
 !
 
 visitJSStatementNode: aNode
@@ -416,28 +358,24 @@ visitJSStatementNode: aNode
 	    nextPutAll: 'function(){';
 	    nextPutAll: aNode source;
 	    nextPutAll: '})()'
-
 ! !
 
 NodeVisitor subclass: #Compiler
-	instanceVariableNames: 'stream, nestedBlocks, earlyReturn, currentClass, currentSelector, unknownVariables, tempVariables, messageSends, referencedClasses'
+	instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector unknownVariables tempVariables messageSends referencedClasses'
 	category: 'Compiler'!
 
 !Compiler methodsFor: 'accessing'!
 
 parser
 	^SmalltalkParser new
-
 !
 
 currentClass
 	^currentClass
-
 !
 
 currentClass: aClass
 	currentClass := aClass
-
 !
 
 unknownVariables
@@ -472,12 +410,10 @@ classNameFor: aClass
 loadExpression: aString
 	DoIt addCompiledMethod: (self eval: (self compileExpression: aString)).
 	^DoIt new doIt
-
 !
 
 load: aString forClass: aClass
 	^self eval: (self compile: aString forClass: aClass)
-
 !
 
 compile: aString forClass: aClass
@@ -488,7 +424,6 @@ compile: aString forClass: aClass
 compileExpression: aString
 	self currentClass: DoIt.
 	^self compileNode: (self parseExpression: aString)
-
 !
 
 eval: aString
@@ -497,24 +432,20 @@ eval: aString
 
 compile: aString
 	^self compileNode: (self parse: aString)
-
 !
 
 compileNode: aNode
 	stream := '' writeStream.
 	self visit: aNode.
 	^stream contents
-
 !
 
 parse: aString
     ^self parser parse: aString readStream
-
 !
 
 parseExpression: aString
     ^self parse: 'doIt ^[', aString, '] value'
-
 !
 
 recompile: aClass
@@ -539,14 +470,12 @@ initialize
 	tempVariables := #().
 	messageSends := #().
 	classReferenced := #()
-
 ! !
 
 !Compiler methodsFor: 'visiting'!
 
 visit: aNode
 	aNode accept: self
-
 !
 
 visitMethodNode: aNode
@@ -608,7 +537,6 @@ visitBlockNode: aNode
 	stream nextPutAll: '){'.
 	aNode nodes do: [:each | self visit: each].
 	stream nextPutAll: '})'
-
 !
 
 visitSequenceNode: aNode
@@ -619,7 +547,6 @@ visitSequenceNode: aNode
 	    self visit: each.
 	    stream nextPutAll: ';']
 	    separatedBy: [stream lf]
-
 !
 
 visitBlockSequenceNode: aNode
@@ -640,7 +567,6 @@ visitBlockSequenceNode: aNode
 		    self visit: each.
 		    stream nextPutAll: ';']].
 	nestedBlocks := nestedBlocks - 1
-
 !
 
 visitReturnNode: aNode
@@ -698,19 +624,16 @@ visitCascadeNode: aNode
 	stream nextPutAll: '})('.
 	self visit: aNode receiver.
 	stream nextPutAll: ')'
-
 !
 
 visitValueNode: aNode
 	stream nextPutAll: aNode value asJavascript
-
 !
 
 visitAssignmentNode: aNode
 	self visit: aNode left.
 	stream nextPutAll: '='.
 	self visit: aNode right
-
 !
 
 visitClassReferenceNode: aNode
@@ -729,11 +652,14 @@ visitVariableNode: aNode
 			(self knownVariables includes: aNode value) ifFalse: [
 				unknownVariables add: aNode value].
 			stream nextPutAll: aNode value]
-
 !
 
 visitJSStatementNode: aNode
 	stream nextPutAll: (aNode source value replace: '''''' with: '''')
+!
+
+visitFailure: aFailure
+	self error: aFailure asString
 ! !
 
 !Compiler class methodsFor: 'compiling'!
@@ -757,6 +683,6 @@ Object subclass: #DoIt
 
 !DoIt methodsFor: ''!
 
-doIt ^[ChunkExporter new exportCategory: 'Parser' ] value
+doIt ^['abc' trimLeft: 'az'] value
 ! !
 

+ 3 - 7
st/Examples.st

@@ -1,5 +1,5 @@
 Widget subclass: #Counter
-	instanceVariableNames: 'count, header'
+	instanceVariableNames: 'count header'
 	category: 'Examples'!
 
 !Counter methodsFor: 'actions'!
@@ -19,7 +19,6 @@ decrease
 initialize
     super initialize.
     count := 0
-
 ! !
 
 !Counter methodsFor: 'rendering'!
@@ -34,11 +33,10 @@ renderOn: html
     html button
 	with: '--';
 	onClick: [self decrease]
-
 ! !
 
 Widget subclass: #Tetris
-	instanceVariableNames: 'renderingContext, timer, speed, score, rows, movingPiece'
+	instanceVariableNames: 'renderingContext timer speed score rows movingPiece'
 	category: 'Examples'!
 
 !Tetris methodsFor: 'accessing'!
@@ -57,7 +55,6 @@ squares
 
 gluePiece: aPiece
 	aPiece glueOn: self
-	
 !
 
 rows
@@ -83,7 +80,6 @@ nextStep
 		ifTrue: [movingPiece position: movingPiece position + (0@1)]
 		ifFalse: [self newPiece].
 	self redraw
-	
 !
 
 redraw
@@ -195,7 +191,7 @@ squares
 ! !
 
 Widget subclass: #TetrisPiece
-	instanceVariableNames: 'rotation, position'
+	instanceVariableNames: 'rotation position'
 	category: 'Examples'!
 
 !TetrisPiece methodsFor: 'accessing'!

+ 21 - 123
st/IDE.st

@@ -1,34 +1,29 @@
 Widget subclass: #TabManager
-	instanceVariableNames: 'selectedTab, tabs, opened'
+	instanceVariableNames: 'selectedTab tabs opened'
 	category: 'IDE'!
 
 !TabManager methodsFor: 'accessing'!
 
 tabs
     ^tabs ifNil: [tabs := Array new]
-
 ! !
 
 !TabManager methodsFor: 'actions'!
 
 updateBodyMargin
     self setBodyMargin: '#jtalk' asJQuery height + 27
-
 !
 
 updatePosition
     {'jQuery(''#jtalk'').css(''top'', '''''').css(''bottom'', ''27px'');'}
-
 !
 
 removeBodyMargin
     self setBodyMargin: 0
-
 !
 
 setBodyMargin: anInteger
     '.jtalkBody' asJQuery cssAt: 'margin-bottom' put: anInteger asString, 'px'
-
 !
 
 onResize: aBlock
@@ -37,12 +32,10 @@ onResize: aBlock
 	resize: aBlock,
 	minHeight: 230
 });'}
-
 !
 
 onWindowResize: aBlock
     {'jQuery(window).resize(aBlock)'}
-
 !
 
 open
@@ -53,7 +46,6 @@ open
 	self updateBodyMargin.
 	selectedTab root asJQuery show.
 	opened := true]
-
 !
 
 close
@@ -63,12 +55,10 @@ close
 	self removeBodyMargin.
 	'body' asJQuery removeClass: 'jtalkBody'.
 	opened := false]
-
 !
 
 newBrowserTab
     Browser open
-
 !
 
 selectTab: aWidget
@@ -78,7 +68,6 @@ selectTab: aWidget
 	each root asJQuery hide].
     aWidget root asJQuery show.
     self update
-
 !
 
 closeTab: aWidget
@@ -86,7 +75,6 @@ closeTab: aWidget
     self selectTab: self tabs last.
     aWidget root asJQuery remove.
     self update
-
 ! !
 
 !TabManager methodsFor: 'adding/Removing'!
@@ -95,13 +83,11 @@ addTab: aWidget
     self tabs add: aWidget.
     '#jtalk' asJQuery append: aWidget.
     aWidget root asJQuery hide
-
 !
 
 removeTab: aWidget
     self tabs remove: aWidget.
     self update
-
 ! !
 
 !TabManager methodsFor: 'initialization'!
@@ -120,7 +106,6 @@ initialize
     self 
 	onResize: [self updateBodyMargin; updatePosition];
 	onWindowResize: [self updatePosition]
-
 ! !
 
 !TabManager methodsFor: 'rendering'!
@@ -139,7 +124,6 @@ renderOn: html
 		class: 'newtab';
 		with: ' + ';
 		onClick: [self newBrowserTab]]
-
 !
 
 renderTabFor: aWidget on: html
@@ -156,7 +140,6 @@ renderTabFor: aWidget on: html
 		class: 'close';
 		with: 'x';
 		onClick: [self closeTab: aWidget]]]
-
 ! !
 
 TabManager class instanceVariableNames: 'current'!
@@ -165,12 +148,10 @@ TabManager class instanceVariableNames: 'current'!
 
 current
     ^current ifNil: [current := super new]
-
 !
 
 new
     self shouldNotImplement
-
 ! !
 
 Widget subclass: #TabWidget
@@ -181,7 +162,6 @@ Widget subclass: #TabWidget
 
 label
     self subclassResponsibility
-
 ! !
 
 !TabWidget methodsFor: 'actions'!
@@ -190,7 +170,6 @@ open
     TabManager current
 	addTab: self;
 	selectTab: self
-
 ! !
 
 !TabWidget methodsFor: 'rendering'!
@@ -205,29 +184,24 @@ renderOn: html
 	    html div
 		class: 'jt_buttons';
 		with: [self renderButtonsOn: html]]
-
 !
 
 renderBoxOn: html
-
 !
 
 renderButtonsOn: html
-
 ! !
 
 !TabWidget methodsFor: 'testing'!
 
 canBeClosed
     ^false
-
 ! !
 
 !TabWidget class methodsFor: 'instance creation'!
 
 open
     ^self new open
-
 ! !
 
 TabWidget subclass: #Workspace
@@ -238,32 +212,26 @@ TabWidget subclass: #Workspace
 
 label
     ^'[Workspace]'
-
 !
 
 selection
     {'return document.selection'}
-
 !
 
 selectionStart
     {'return jQuery(''.jt_workspace'')[0].selectionStart'}
-
 !
 
 selectionEnd
     {'return jQuery(''.jt_workspace'')[0].selectionEnd'}
-
 !
 
 selectionStart: anInteger
     {'jQuery(''.jt_workspace'')[0].selectionStart = anInteger'}
-
 !
 
 selectionEnd: anInteger
     {'jQuery(''.jt_workspace'')[0].selectionEnd = anInteger'}
-
 !
 
 currentLine
@@ -276,7 +244,6 @@ currentLine
 	endLine >= self selectionStart ifTrue: [
 	    self selectionEnd: endLine.
 	    ^each]]
-
 ! !
 
 !Workspace methodsFor: 'actions'!
@@ -299,12 +266,10 @@ handleKeyDown: anEvent
 			return false;
 		}
 	}'}
-
 !
 
 clearWorkspace
     textarea asJQuery val: ''
-
 !
 
 doIt
@@ -319,7 +284,6 @@ doIt
 
 printIt
     self print: self doIt printString
-
 !
 
 print: aString
@@ -331,7 +295,6 @@ print: aString
 	(textarea asJQuery val copyFrom: start + 1 to: textarea asJQuery val size)).
     self selectionStart: start.
     self selectionEnd: start + aString size + 2
-
 !
 
 eval: aString
@@ -341,12 +304,10 @@ eval: aString
     node isParseFailure ifTrue: [
 	^self alert: node reason, ', position: ', node position].
     ^compiler loadExpression: aString
-
 !
 
 inspectIt
     self doIt inspect
-
 ! !
 
 !Workspace methodsFor: 'rendering'!
@@ -358,7 +319,6 @@ renderBoxOn: html
     textarea 
 	class: 'jt_workspace';
 	at: 'spellcheck' put: 'false'
-
 !
 
 renderButtonsOn: html
@@ -377,7 +337,6 @@ renderButtonsOn: html
     html button
 	with: 'Clear workspace';
 	onClick: [self clearWorkspace]
-
 ! !
 
 TabWidget subclass: #Transcript
@@ -388,25 +347,20 @@ TabWidget subclass: #Transcript
 
 label
     ^'[Transcript]'
-
 ! !
 
 !Transcript methodsFor: 'actions'!
 
 show: anObject
     textarea asJQuery val: textarea asJQuery val, anObject asString.
-
-
 !
 
 cr
     textarea asJQuery val: textarea asJQuery val, String cr.
-
 !
 
 clear
     textarea asJQuery val: ''
-
 ! !
 
 !Transcript methodsFor: 'rendering'!
@@ -417,14 +371,12 @@ renderBoxOn: html
     textarea 
 	class: 'jt_transcript';
 	at: 'spellcheck' put: 'false'
-
 !
 
 renderButtonsOn: html
     html button
 	with: 'Clear transcript';
 	onClick: [self clear]
-
 ! !
 
 Transcript class instanceVariableNames: 'current'!
@@ -433,38 +385,32 @@ Transcript class instanceVariableNames: 'current'!
 
 open
     self current open
-
 !
 
 new
     self shouldNotImplement
-
 !
 
 current
     ^current ifNil: [current := super new]
-
 ! !
 
 !Transcript class methodsFor: 'printing'!
 
 show: anObject
     self current show: anObject
-
 !
 
 cr
     self current show: String cr
-
 !
 
 clear
     self current clear
-
 ! !
 
 TabWidget subclass: #Browser
-	instanceVariableNames: 'selectedCategory, selectedClass, selectedProtocol, selectedMethod, commitButton, categoriesList, classesList, protocolsList, methodsList, sourceTextarea, tabsList, selectedTab, saveButton, classButtons, methodButtons, unsavedChanges'
+	instanceVariableNames: 'selectedCategory selectedClass selectedProtocol selectedMethod commitButton categoriesList classesList protocolsList methodsList sourceTextarea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges'
 	category: 'IDE'!
 
 !Browser methodsFor: 'accessing'!
@@ -473,7 +419,6 @@ label
     ^selectedClass 
 	ifNil: ['Browser (nil)']
 	ifNotNil: [selectedClass name]
-
 !
 
 categories
@@ -483,14 +428,12 @@ categories
 	(categories includes: each category) ifFalse: [
 	    categories add: each category]].
     ^categories sort
-
 !
 
 classes
     ^(Smalltalk current classes 
 	select: [:each | each category = selectedCategory])
 	sort: [:a :b | a name > b name]
-
 !
 
 protocols
@@ -521,7 +464,6 @@ methods
 	ifNotNil: [
 	    klass methodDictionary values select: [:each |
 		each category = selectedProtocol]]) sort: [:a :b | a selector > b selector]
-
 !
 
 source
@@ -532,14 +474,12 @@ source
     ^selectedClass
 	ifNil: ['']
 	ifNotNil: [self classCommentSource]
-
 !
 
 methodSource
     ^selectedMethod
 	ifNil: [self dummyMethodSource]
 	ifNotNil: [selectedMethod source]
-
 !
 
 dummyMethodSource
@@ -548,14 +488,12 @@ dummyMethodSource
 
 	| temporary variable names |
 	statements'
-
 !
 
 declarationSource
     ^selectedTab = #instance
 	ifTrue: [self classDeclarationSource]
 	ifFalse: [self metaclassDeclarationSource]
-
 !
 
 classDeclarationSource
@@ -577,7 +515,6 @@ classDeclarationSource
 	    nextPutAll: selectedClass category;
 	    nextPutAll: ''''].
     ^stream contents
-
 !
 
 metaclassDeclarationSource
@@ -593,12 +530,10 @@ metaclassDeclarationSource
 	    separatedBy: [stream nextPutAll: ' '].
 	stream nextPutAll: ''''].
     ^stream contents
-
 !
 
 classCommentSource
     ^selectedClass comment
-
 ! !
 
 !Browser methodsFor: 'actions'!
@@ -606,34 +541,28 @@ classCommentSource
 enableSaveButton
     saveButton removeAt: 'disabled'.
     unsavedChanges := true
-
 !
 
 disableSaveButton
     saveButton ifNotNil: [
 	saveButton at: 'disabled' put: true].
     unsavedChanges := false
-
 !
 
 hideClassButtons
     classButtons asJQuery hide
-
 !
 
 showClassButtons
     classButtons asJQuery show
-
 !
 
 hideMethodButtons
     methodButtons asJQuery hide
-
 !
 
 showMethodButtons
     methodButtons asJQuery show
-
 !
 
 compile
@@ -644,19 +573,16 @@ compile
     (selectedProtocol notNil or: [selectedMethod notNil])
 	ifFalse: [self compileDefinition]
 	ifTrue: [self compileMethodDefinition]
-
 !
 
 compileClassComment
     selectedClass comment: sourceTextarea asJQuery val
-
 !
 
 compileMethodDefinition
     selectedTab = #instance
 	ifTrue: [self compileMethodDefinitionFor: selectedClass]
 	ifFalse: [self compileMethodDefinitionFor: selectedClass class]
-
 !
 
 compileMethodDefinitionFor: aClass
@@ -677,7 +603,6 @@ compileMethodDefinitionFor: aClass
     aClass addCompiledMethod: method.
     self updateMethodsList.
     self selectMethod: method
-
 !
 
 compileDefinition
@@ -686,7 +611,6 @@ compileDefinition
     self 
 	updateCategoriesList;
 	updateClassesList
-
 !
 
 commitCategory
@@ -694,21 +618,19 @@ commitCategory
 	(Ajax url: self class commitPathJs, '/', selectedCategory, '.js')
 	    at: 'type' put: 'PUT';
 	    at: 'data' put: (Exporter new exportCategory: selectedCategory);
-	    at: 'error' put: [self alert: 'Commit failed!'];
+	    at: 'error' put: [self alert: 'Commit failed!!'];
 	    send.
 	(Ajax url: self class commitPathSt, '/', selectedCategory, '.st')
 	    at: 'type' put: 'PUT';
 	    at: 'data' put: (ChunkExporter new exportCategory: selectedCategory);
-	    at: 'error' put: [self alert: 'Commit failed!'];
+	    at: 'error' put: [self alert: 'Commit failed!!'];
 	    send]
-
 !
 
 cancelChanges
     ^unsavedChanges 
 	ifTrue: [self confirm: 'Cancel changes?']
 	ifFalse: [true]
-
 !
 
 removeClass
@@ -716,7 +638,6 @@ removeClass
 	ifTrue: [
 	    Smalltalk current basicDelete: selectedClass name.
 	    self selectClass: nil]
-
 !
 
 removeMethod
@@ -727,7 +648,6 @@ removeMethod
 			ifTrue: [selectedClass removeCompiledMethod: selectedMethod]
 			ifFalse: [selectedClass class removeCompiledMethod: selectedMethod].
 		self selectMethod: nil]]
-
 !
 
 setMethodProtocol: aString
@@ -742,7 +662,6 @@ setMethodProtocol: aString
 		    updateProtocolsList;
 		    updateMethodsList;
 		    updateSourceAndButtons]]
-
 !
 
 addNewProtocol
@@ -751,7 +670,6 @@ addNewProtocol
     newProtocol notEmpty ifTrue: [
 	selectedMethod category: newProtocol.
 	self setMethodProtocol: newProtocol]
-
 !
 
 selectCategory: aCategory
@@ -764,7 +682,6 @@ selectCategory: aCategory
 	    updateProtocolsList;
 	    updateMethodsList;
 	    updateSourceAndButtons]
-
 !
 
 selectClass: aClass
@@ -776,7 +693,6 @@ selectClass: aClass
 	    updateProtocolsList;
 	    updateMethodsList;
 	    updateSourceAndButtons]
-
 !
 
 selectProtocol: aString
@@ -787,7 +703,6 @@ selectProtocol: aString
 	    updateProtocolsList;
 	    updateMethodsList;
 	    updateSourceAndButtons]
-
 !
 
 selectMethod: aMethod
@@ -797,7 +712,6 @@ selectMethod: aMethod
 	    updateProtocolsList;
 	    updateMethodsList;
 	    updateSourceAndButtons]
-
 !
 
 selectTab: aString
@@ -805,7 +719,6 @@ selectTab: aString
 	selectedTab := aString.
 	self selectProtocol: nil.
 	self updateTabsList]
-
 !
 
 renameClass
@@ -816,7 +729,6 @@ renameClass
 	self 
 		updateClassesList;
 		updateSourceAndButtons]
-
 !
 
 addInstanceVariableNamed: aString toClass: aClass
@@ -838,7 +750,6 @@ initialize
     super initialize.
     selectedTab := #instance.
     unsavedChanges := false
-
 ! !
 
 !Browser methodsFor: 'rendering'!
@@ -848,7 +759,6 @@ renderBoxOn: html
 	renderTopPanelOn: html;
 	renderTabsOn: html;
 	renderBottomPanelOn: html
-
 !
 
 renderTopPanelOn: html
@@ -870,13 +780,11 @@ renderTopPanelOn: html
 		updateProtocolsList;
 		updateMethodsList.
 	    html div class: 'jt_clear']
-
 !
 
 renderTabsOn: html
     tabsList := html ul class: 'jt_tabs'.
     self updateTabsList.
-
 !
 
 renderBottomPanelOn: html
@@ -888,7 +796,6 @@ renderBottomPanelOn: html
 		class: 'source';
 		at: 'spellcheck' put: 'false'.
 	    sourceTextarea asJQuery call: 'tabby']
-
 !
 
 renderButtonsOn: html
@@ -899,14 +806,12 @@ renderButtonsOn: html
     methodButtons := html span.
     classButtons := html span.
     self updateSourceAndButtons
-
 ! !
 
 !Browser methodsFor: 'testing'!
 
 canBeClosed
     ^true
-
 ! !
 
 !Browser methodsFor: 'updating'!
@@ -923,7 +828,6 @@ updateCategoriesList
 	    li
 		with: label;
 		onClick: [self selectCategory: each]]]
-
 !
 
 updateClassesList
@@ -936,7 +840,6 @@ updateClassesList
 	    li
 		with: each name;
 		onClick: [self selectClass: each]]]
-
 !
 
 updateProtocolsList
@@ -948,7 +851,6 @@ updateProtocolsList
 	    li 
 		with: each;
 		onClick: [self selectProtocol: each]]]
-
 !
 
 updateMethodsList
@@ -960,7 +862,6 @@ updateMethodsList
 	    li
 		with: each selector;
 		onClick: [self selectMethod: each]]]
-
 !
 
 updateTabsList
@@ -980,7 +881,6 @@ updateTabsList
 	li
 	    with: 'Comment';
 	    onClick: [self selectTab: #comment]]
-
 !
 
 updateSourceAndButtons
@@ -1032,7 +932,6 @@ updateSourceAndButtons
 	    		self hideClassButtons.
 	    		self showMethodButtons].
     	sourceTextarea asJQuery val: self source
-
 ! !
 
 !Browser class methodsFor: 'accessing'!
@@ -1052,16 +951,14 @@ openOn: aClass
 	open;
 	selectCategory: aClass category;
 	selectClass: aClass
-
 !
 
 open
     self new open
-
 ! !
 
 TabWidget subclass: #Inspector
-	instanceVariableNames: 'label, variables, object, selectedVariable, variablesList, valueTextarea, workspaceTextarea, diveButton'
+	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea workspaceTextarea diveButton'
 	category: 'IDE'!
 
 !Inspector methodsFor: 'accessing'!
@@ -1127,7 +1024,6 @@ renderTopPanelOn: html
 		updateVariablesList;
 		updateValueTextarea.
 	    html div class: 'jt_clear']
-
 !
 
 renderBottomPanelOn: html
@@ -1138,7 +1034,6 @@ renderBottomPanelOn: html
 		class: 'source';
 		at: 'spellcheck' put: 'false'.
 	    workspaceTextarea asJQuery call: 'tabby']
-
 !
 
 renderButtonsOn: html
@@ -1149,7 +1044,6 @@ renderButtonsOn: html
 		with: 'Dive'; 
 		onClick: [self dive].
 	self updateButtons
-	
 ! !
 
 !Inspector methodsFor: 'testing'!
@@ -1189,7 +1083,6 @@ updateButtons
 	(self selectedVariable notNil and: [(self variables at: self selectedVariable) notNil])
 		ifFalse: [diveButton at: 'disabled' put: true] 
 		ifTrue: [diveButton removeAt: 'disabled']
-		
 ! !
 
 !Inspector class methodsFor: 'instance creation'!
@@ -1201,7 +1094,7 @@ on: anObject
 ! !
 
 TabWidget subclass: #ReferencesBrowser
-	instanceVariableNames: 'implementors, senders, implementorsList, input, timer, selector, sendersList, referencedClasses, referencedClassesList'
+	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList'
 	category: 'IDE'!
 
 !ReferencesBrowser methodsFor: 'accessing'!
@@ -1377,7 +1270,7 @@ search: aString
 		open
 ! !
 
-
+!Object methodsFor: '*IDE'!
 
 inspect
 	Inspector new 
@@ -1394,9 +1287,9 @@ inspectOn: anInspector
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
-	
-	
-!
+! !
+
+!Date methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
@@ -1412,9 +1305,9 @@ inspectOn: anInspector
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
-	
-	
-!
+! !
+
+!Collection methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
@@ -1425,7 +1318,9 @@ inspectOn: anInspector
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
-!
+! !
+
+!String methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| label |
@@ -1434,7 +1329,9 @@ inspectOn: anInspector
 		ifTrue: [label := (self printString copyFrom: 1 to: 30), '...''']
 		ifFalse: [label := self printString]. 
 	anInspector setLabel: label
-!
+! !
+
+!Dictionary methodsFor: '*IDE'!
 
 inspectOn: anInspector
 	| variables |
@@ -1446,4 +1343,5 @@ inspectOn: anInspector
 	anInspector 
 		setLabel: self printString;
 		setVariables: variables
-!
+! !
+

+ 10 - 51
st/JQuery.st

@@ -7,25 +7,21 @@ Object subclass: #JQuery
 append: anObject
     "Append anObject at the end of the element."
     anObject appendToJQuery: self
-
 !
 
 appendElement: anElement
     "Append anElement at the end of the element.
      Dont't call this method directly, use #append: instead"
     self call: 'append' withArgument: anElement
-
 !
 
 appendToJQuery: aJQuery
     aJQuery appendElement: jquery
-
 !
 
 contents: anObject
     self empty.
     self append: anObject
-
 !
 
 empty
@@ -37,24 +33,20 @@ empty
 removeAttribute: aString
     "Remove an attribute from each element in the set of matched elements."
     ^self call: 'removeAttribute' withArgument: aString
-
 !
 
 attr: aString
     "Get the value of an attribute for the first element in the set of matched elements."
     ^self call: 'attr' withArgument: aString
-
 !
 
 val
     "Get the current value of the first element in the set of matched elements."
     ^self call: 'val'
-
 !
 
 val: aString
     self call: 'val' withArgument: aString
-
 ! !
 
 !JQuery methodsFor: 'css'!
@@ -65,158 +57,131 @@ cssAt: aString
 
 cssAt: aString put: anotherString
     {'self[''@jquery''].css(aString, anotherString)'}
-
 !
 
 addClass: aString
     "Adds the specified class(es) to each of the set of matched elements."
     self call: 'addClass' withArgument: aString
-
 !
 
 removeClass: aString
     "Remove a single class, multiple classes, or all classes from each element in the set of matched elements."
     self call: 'removeClass' withArgument: aString
-
 !
 
 toggleClass: aString
     "Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument."
     self call: 'toggleClass' withArgument: aString
-
 !
 
 height 
     "Get the current computed height for the first element in the set of matched elements."
     ^self call: 'height'
-
 !
 
 height: anInteger
     self call: 'height' withArgument: anInteger
-
 !
 
 width: anInteger
     self call: 'width' withArgument: anInteger
-
 !
 
 width
     "Get the current computed width for the first element in the set of matched elements."
     ^self call: 'width'
-
 !
 
 innerHeight
     "Get the current computed height for the first element in the set of matched elements, including padding but not border."
     ^self call: 'innerHeight'
-
 !
 
 innerWidth
     "Get the current computed width for the first element in the set of matched elements, including padding but not border."
     ^self call: 'innerWidth'
-
 !
 
 outerHeight
     "Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin."
     ^self call: 'outerHeight'
-
 !
 
 outerWidth
     "Get the current computed width for the first element in the set of matched elements, including padding and border."
     ^self call: 'outerWidth'
-
 !
 
 top
     "Get the current y coordinate of the first element in the set of matched elements, relative to the offset parent."
     ^(self call: 'position') basicAt: 'top'
-
 !
 
 left
     "Get the current x coordinate of the first element in the set of matched elements, relative to the offset parent."
     ^(self call: 'position') basicAt: 'left'
-
 !
 
 offsetLeft
     "Get the current coordinates of the first element in the set of matched elements, relative to the document."
     ^(self call: 'offset') basicAt: 'left'
-
 !
 
 offsetTop
     "Get the current coordinates of the first element in the set of matched elements, relative to the document."
     ^(self call: 'offset') basicAt: 'top'
-
 !
 
 scrollLeft
     "Get the current horizontal position of the scroll bar for the first element in the set of matched elements."
     ^self call: 'scrollLeft'
-
 !
 
 scrollTop
     "Get the current vertical position of the scroll bar for the first element in the set of matched elements."
     ^self call: 'scrollTop'
-
 !
 
 scrollLeft: anInteger
     self call: 'scrollLeft' withArgument: anInteger
-
 !
 
 scrollTop: anInteger
     self call: 'scrollTop' withArgument: anInteger
-
 ! !
 
 !JQuery methodsFor: 'events'!
 
 focus
     self call: 'focus'
-
 !
 
 show
     self call: 'show'
-
 !
 
 hide
     self call: 'hide'
-
 !
 
 remove
     self call: 'remove'
-
 !
 
 on: anEventString do: aBlock
     "Attach aBlock for anEventString on the element"
     {'self[''@jquery''].bind(anEventString, function(e){aBlock(e, self)})'}
-
 !
 
 removeEvents: aString
     "Unbind all handlers attached to the event aString"
     self call: 'unbind' withArgument: aString
-
 ! !
 
 !JQuery methodsFor: 'initialization'!
 
 initializeWithJQueryObject: anObject
     jquery := anObject
-
 ! !
 
 !JQuery methodsFor: 'private'!
@@ -234,7 +199,6 @@ call: aString withArgument: anObject
 hasClass: aString
     "Determine whether any of the matched elements are assigned the given class."
     ^self call: 'hasClass' withArgument: aString
-
 ! !
 
 !JQuery class methodsFor: 'instance creation'!
@@ -243,14 +207,12 @@ fromString: aString
     | newJQuery |
     {'newJQuery = jQuery(String(aString))'}.
     ^self from: newJQuery
-
 !
 
 from: anObject
     ^self new
 	initializeWithJQueryObject: anObject;
 	yourself
-
 !
 
 window
@@ -269,35 +231,33 @@ Object subclass: #Ajax
 	instanceVariableNames: 'settings'
 	category: 'JQuery'!
 !Ajax commentStamp!
-instance%20variable%20names%3A%0A-%20settings%20%20A%20set%20of%20key/value%20pairs%20that%20configure%20the%20Ajax%20request.%20All%20settings%20are%20optional.%0A%0AFull%20list%20of%20settings%20options%20at%20http%3A//api.jquery.com/jQuery.ajax/%0A!
+instance variable names:
+- settings  A set of key/value pairs that configure the Ajax request. All settings are optional.
+
+Full list of settings options at http://api.jquery.com/jQuery.ajax/!
 
 !Ajax methodsFor: 'accessing'!
 
 at: aKey
     ^settings at: aKey ifAbsent: [nil]
-
 !
 
 at: aKey put: aValue
     settings at: aKey put: aValue
-
 !
 
 url
     ^self at: 'url'
-
 !
 
 url: aString
     self at: 'url' put: aString
-
 ! !
 
 !Ajax methodsFor: 'actions'!
 
 send
     {'jQuery.ajax(self[''@settings''])'}
-
 ! !
 
 !Ajax methodsFor: 'initialization'!
@@ -305,7 +265,6 @@ send
 initialize
     super initialize.
     settings := Dictionary new
-
 ! !
 
 !Ajax class methodsFor: 'instance creation'!
@@ -314,30 +273,30 @@ url: aString
     ^self new
 	url: aString;
 	yourself
-
 ! !
 
-
+!BlockClosure methodsFor: '*JQuery'!
 
 appendToJQuery: aJQuery
 	| canvas |
 	canvas := HTMLCanvas new.
 	self value: canvas.
 	aJQuery append: canvas
+! !
 
-!
+!String methodsFor: '*JQuery'!
 
 asJQuery
     ^JQuery fromString: self
-
 !
 
 appendToJQuery: aJQuery
     {'aJQuery._appendElement_(String(self))'}
+! !
 
-!
+!HTMLCanvas methodsFor: '*JQuery'!
 
 appendToJQuery: aJQuery
     aJQuery appendElement: root element
+! !
 
-!

文件差异内容过多而无法显示
+ 15 - 246
st/Kernel.st


+ 91 - 104
st/Parser.st

@@ -6,61 +6,50 @@ Object subclass: #PPParser
 
 memo
 	^memo
-
 ! !
 
 !PPParser methodsFor: 'initialization'!
 
 initialize
 	memo := Dictionary new
-
 ! !
 
 !PPParser methodsFor: 'operations'!
 
 flatten
 	^PPFlattenParser on: self
-
 !
 
 withSource
 	^PPSourceParser on: self
-
 !
 
 ==> aBlock
 	^PPActionParser on: self block: aBlock
-
 !
 
 , aParser
 	^PPSequenceParser with: self with: aParser
-
 !
 
 / aParser
 	^PPChoiceParser with: self with: aParser
-
 !
 
 plus
 	^PPRepeatingParser on: self min: 1
-
 !
 
 star
 	^PPRepeatingParser on: self min: 0
-
 !
 
 not
 	^PPNotParser on: self
-
 !
 
 optional
 	^self / PPEpsilonParser new
-
 !
 
 memoizedParse: aStream
@@ -75,14 +64,12 @@ memoizedParse: aStream
 		end := aStream position.
 		self memo at: start put: (Array with: node with: end).
 		node]
-
 ! !
 
 !PPParser methodsFor: 'parsing'!
 
 parse: aStream
 	self subclassResponsibility
-
 !
 
 parseAll: aStream
@@ -91,7 +78,6 @@ parseAll: aStream
 	^result isParseFailure 
 	    ifTrue: [self error: (result messageFor: aStream contents)]
 	    ifFalse: [result first]
-
 ! !
 
 PPParser subclass: #PPEOFParser
@@ -103,9 +89,8 @@ PPParser subclass: #PPEOFParser
 parse: aStream
 	^aStream atEnd 
 	    ifFalse: [
-		PPFailure new reason: 'EOF expected' at: aStream position]
+		PPFailure new reason: aStream contents, String lf, '---------------', String lf, 'EOF expected' at: aStream position]
 	    ifTrue: [nil]
-
 ! !
 
 PPParser subclass: #PPAnyParser
@@ -119,7 +104,6 @@ parse: aStream
 	    ifTrue: [PPFailure new
 			 reason: 'did not expect EOF' at: aStream position]
 	    ifFalse: [aStream next]
-
 ! !
 
 PPParser subclass: #PPEpsilonParser
@@ -130,7 +114,6 @@ PPParser subclass: #PPEpsilonParser
 
 parse: aStream
 	^nil
-
 ! !
 
 PPParser subclass: #PPStringParser
@@ -141,12 +124,10 @@ PPParser subclass: #PPStringParser
 
 string
 	^string
-
 !
 
 string: aString
 	string := aString
-
 ! !
 
 !PPStringParser methodsFor: 'parsing'!
@@ -160,7 +141,6 @@ parse: aStream
 	    ifFalse: [
 		aStream position: position.
 		PPFailure new reason: 'Expected ', self string, ' but got ', (result at: position) printString; yourself]
-
 ! !
 
 PPParser subclass: #PPCharacterParser
@@ -171,7 +151,6 @@ PPParser subclass: #PPCharacterParser
 
 string: aString
 	regexp := RegularExpression fromString: '[', aString, ']'
-
 ! !
 
 !PPCharacterParser methodsFor: 'parsing'!
@@ -180,14 +159,12 @@ parse: aStream
 	^(aStream peek notNil and: [self match: aStream peek])
 	    ifTrue: [aStream next]
 	    ifFalse: [PPFailure new reason: 'Could not match' at: aStream position]
-
 ! !
 
 !PPCharacterParser methodsFor: 'private'!
 
 match: aString
 	^aString match: regexp
-
 ! !
 
 PPParser subclass: #PPListParser
@@ -198,19 +175,16 @@ PPParser subclass: #PPListParser
 
 parsers
 	^parsers ifNil: [#()]
-
 !
 
 parsers: aCollection
 	parsers := aCollection
-
 ! !
 
 !PPListParser methodsFor: 'copying'!
 
 copyWith: aParser
 	^self class withAll: (self parsers copyWith: aParser)
-
 ! !
 
 !PPListParser class methodsFor: 'instance creation'!
@@ -219,12 +193,10 @@ withAll: aCollection
 	    ^self new
 		parsers: aCollection;
 		yourself
-
 !
 
 with: aParser with: anotherParser
 	    ^self withAll: (Array with: aParser with: anotherParser)
-
 ! !
 
 PPListParser subclass: #PPSequenceParser
@@ -235,7 +207,6 @@ PPListParser subclass: #PPSequenceParser
 
 , aRule
 	^self copyWith: aRule
-
 ! !
 
 !PPSequenceParser methodsFor: 'parsing'!
@@ -253,7 +224,6 @@ parse: aStream
 	^element isParseFailure
 	    ifFalse: [elements]
 	    ifTrue: [aStream position: start. element]
-
 ! !
 
 PPListParser subclass: #PPChoiceParser
@@ -264,7 +234,6 @@ PPListParser subclass: #PPChoiceParser
 
 / aRule
 	^self copyWith: aRule
-
 ! !
 
 !PPChoiceParser methodsFor: 'parsing'!
@@ -277,7 +246,6 @@ parse: aStream
 		result isParseFailure not]
 	    ifNone: [].
 	^result
-
 ! !
 
 PPParser subclass: #PPDelegateParser
@@ -288,19 +256,16 @@ PPParser subclass: #PPDelegateParser
 
 parser
 	^parser
-
 !
 
 parser: aParser
 	parser := aParser
-
 ! !
 
 !PPDelegateParser methodsFor: 'parsing'!
 
 parse: aStream
 	^self parser memoizedParse: aStream
-
 ! !
 
 !PPDelegateParser class methodsFor: 'instance creation'!
@@ -309,7 +274,6 @@ on: aParser
 	    ^self new
 		parser: aParser;
 		yourself
-
 ! !
 
 PPDelegateParser subclass: #PPAndParser
@@ -320,7 +284,6 @@ PPDelegateParser subclass: #PPAndParser
 
 parse: aStream
 	^self basicParse: aStream
-
 !
 
 basicParse: aStream
@@ -329,7 +292,6 @@ basicParse: aStream
 	element := self parser memoizedParse: aStream.
 	aStream position: position.
 	^element
-
 ! !
 
 PPAndParser subclass: #PPNotParser
@@ -344,7 +306,6 @@ parse: aStream
 	^element isParseFailure 
 	    ifTrue: [nil]
 	    ifFalse: [PPFailure reason: element at: aStream position]
-
 ! !
 
 PPDelegateParser subclass: #PPActionParser
@@ -355,12 +316,10 @@ PPDelegateParser subclass: #PPActionParser
 
 block
 	^block
-
 !
 
 block: aBlock
 	block := aBlock
-
 ! !
 
 !PPActionParser methodsFor: 'parsing'!
@@ -371,7 +330,6 @@ parse: aStream
 	^element isParseFailure
 	    ifFalse: [self block value: element]
 	    ifTrue: [element]
-
 ! !
 
 !PPActionParser class methodsFor: 'instance creation'!
@@ -381,7 +339,6 @@ on: aParser block: aBlock
 		parser: aParser;
 		block: aBlock;
 		yourself
-
 ! !
 
 PPDelegateParser subclass: #PPFlattenParser
@@ -399,7 +356,6 @@ parse: aStream
 	    ifFalse: [aStream collection 
 		copyFrom: start + 1 
 		to: aStream position]
-
 ! !
 
 PPDelegateParser subclass: #PPSourceParser
@@ -416,7 +372,6 @@ parse: aStream
 		ifTrue: [element]
 		ifFalse: [result := aStream collection copyFrom: start + 1 to: aStream position.
 			Array with: element with: result].
-
 ! !
 
 PPDelegateParser subclass: #PPRepeatingParser
@@ -427,12 +382,10 @@ PPDelegateParser subclass: #PPRepeatingParser
 
 min
 	^min
-
 !
 
 min: aNumber
 	min := aNumber
-
 ! !
 
 !PPRepeatingParser methodsFor: 'parsing'!
@@ -455,7 +408,6 @@ parse: aStream
 				ifFalse: [elements addLast: element]].
 				elements]
 		ifNotNil: [failure].
-
 ! !
 
 !PPRepeatingParser class methodsFor: 'instance creation'!
@@ -465,47 +417,48 @@ on: aParser min: aNumber
 		parser: aParser;
 		min: aNumber;
 		yourself
-
 ! !
 
 Object subclass: #PPFailure
-	instanceVariableNames: 'position, reason'
+	instanceVariableNames: 'position reason'
 	category: 'Parser'!
 
 !PPFailure methodsFor: 'accessing'!
 
 position
 	^position ifNil: [0]
-
 !
 
 position: aNumber
 	position := aNumber
-
 !
 
 reason
 	^reason ifNil: ['']
-
 !
 
 reason: aString
 	reason := aString
-
 !
 
 reason: aString at: anInteger
 	self 
 	    reason: aString; 
 	    position: anInteger
+!
 
+accept: aVisitor
+	aVisitor visitFailure: self
 ! !
 
 !PPFailure methodsFor: 'testing'!
 
 isParseFailure
 	^true
+!
 
+asString
+	^reason, ' at ', position asString
 ! !
 
 !PPFailure class methodsFor: 'instance creation'!
@@ -514,7 +467,6 @@ reason: aString at: anInteger
 	    ^self new
 		reason: aString at: anInteger;
 		yourself
-
 ! !
 
 Object subclass: #SmalltalkParser
@@ -686,14 +638,12 @@ parser
 		    yourself].
 	
 	^method, PPEOFParser new ==> [:node | node first]
-
 ! !
 
 !SmalltalkParser methodsFor: 'parsing'!
 
 parse: aStream
 	^self parser parse: aStream
-
 ! !
 
 !SmalltalkParser class methodsFor: 'instance creation'!
@@ -701,7 +651,6 @@ parse: aStream
 parse: aStream
 	    ^self new
 		parse: aStream
-
 ! !
 
 Object subclass: #Chunk
@@ -712,24 +661,20 @@ Object subclass: #Chunk
 
 contents
 	^contents ifNil: ['']
-
 !
 
 contents: aString
 	contents := aString
-
 ! !
 
 !Chunk methodsFor: 'testing'!
 
 isEmptyChunk
 	^false
-
 !
 
 isInstructionChunk
 	^false
-
 ! !
 
 Chunk subclass: #InstructionChunk
@@ -740,7 +685,6 @@ Chunk subclass: #InstructionChunk
 
 isInstructionChunk
 	^true
-
 ! !
 
 Chunk subclass: #EmptyChunk
@@ -751,20 +695,18 @@ Chunk subclass: #EmptyChunk
 
 isEmptyChunk
 	^true
-
 ! !
 
 Object subclass: #ChunkParser
-	instanceVariableNames: 'parser, separator, eof, ws, chunk, emptyChunk, instructionChunk'
+	instanceVariableNames: 'parser separator eof ws chunk emptyChunk instructionChunk'
 	category: 'Parser'!
 
 !ChunkParser methodsFor: ''!
 
 instructionChunk
 	^instructionChunk ifNil: [
-	    instructionChunk := self ws, '!' asParser, self chunk
+	    instructionChunk := self ws, '!!' asParser, self chunk
 	    ==> [:node | InstructionChunk new contents: node last contents]]
-
 ! !
 
 !ChunkParser methodsFor: 'accessing'!
@@ -772,32 +714,27 @@ instructionChunk
 parser
 	^parser ifNil: [
 	    parser := self instructionChunk / self emptyChunk / self chunk / self eof]
-
 !
 
 eof
 	^eof ifNil: [eof := self ws, PPEOFParser new ==> [:node | nil]]
-
 !
 
 separator
 	^separator ifNil: [separator := (String cr, String space, String lf, String tab) asChoiceParser]
-
 !
 
 ws
 	^ws ifNil: [ws := self separator star]
-
 !
 
 chunk
-	^chunk ifNil: [chunk := self ws, ('!!' asParser / ('!' asParser not, PPAnyParser new)) plus flatten, '!' asParser ==> [:node | Chunk new contents: (node second replace: '!!' with: '!')]]
-
+	^chunk ifNil: [chunk := self ws, ('!!!!' asParser / ('!!' asParser not, PPAnyParser new)) plus flatten, '!!' asParser
+		==> [:node | Chunk new contents: (node second replace: '!!!!' with: '!!') trimBoth]]
 !
 
 emptyChunk
-	^emptyChunk ifNil: [emptyChunk := self separator plus, '!' asParser, self ws ==> [:node | EmptyChunk new]]
-
+	^emptyChunk ifNil: [emptyChunk := self separator plus, '!!' asParser, self ws ==> [:node | EmptyChunk new]]
 ! !
 
 Object subclass: #Importer
@@ -808,7 +745,6 @@ Object subclass: #Importer
 
 chunkParser
 	^chunkParser ifNil: [chunkParser := ChunkParser new parser]
-
 ! !
 
 !Importer methodsFor: 'fileIn'!
@@ -823,7 +759,6 @@ import: aStream
 					 scanFrom: aStream]
 		    ifFalse: [Compiler new loadExpression: nextChunk contents].
 		self import: aStream]]
-
 ! !
 
 Object subclass: #Exporter
@@ -850,7 +785,6 @@ export: aClass
 	self exportMetaDefinitionOf: aClass on: stream.
 	self exportMethodsOf: aClass class on: stream.
 	^stream contents
-
 ! !
 
 !Exporter methodsFor: 'private'!
@@ -876,7 +810,6 @@ exportDefinitionOf: aClass on: aStream
 		nextPutAll: '.comment=';
 		nextPutAll: 'unescape(''', aClass comment escaped, ''')'].
 	aStream lf
-
 !
 
 exportMetaDefinitionOf: aClass on: aStream
@@ -888,7 +821,6 @@ exportMetaDefinitionOf: aClass on: aStream
 		do: [:each | aStream nextPutAll: '''', each, '''']
 		separatedBy: [aStream nextPutAll: ','].
 	    aStream nextPutAll: '];', String lf]
-
 !
 
 exportMethodsOf: aClass on: aStream
@@ -905,7 +837,6 @@ classNameFor: aClass
 		aClass isNil
 		    ifTrue: ['nil']
 		    ifFalse: [aClass name]]
-
 !
 
 exportMethod: aMethod of: aClass on: aStream
@@ -929,7 +860,6 @@ exportMethod: aMethod of: aClass on: aStream
 		nextPutAll: ');';lf;lf
 !
 
-
 exportCategoryExtensions: aString on: aStream
 	Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |
 		each methodDictionary values do: [:method |
@@ -952,38 +882,32 @@ exportDefinitionOf: aClass on: aStream
 	    nextPutAll: '	instanceVariableNames: '''.
 	aClass instanceVariableNames 
 	    do: [:each | aStream nextPutAll: each]
-	    separatedBy: [aStream nextPutAll: ', '].
+	    separatedBy: [aStream nextPutAll: ' '].
 	aStream	
 	    nextPutAll: ''''; lf;
-	    nextPutAll: '	category: ''', aClass category, '''!'; lf.
+	    nextPutAll: '	category: ''', aClass category, '''!!'; lf.
  	aClass comment notEmpty ifTrue: [
 	    aStream 
-		nextPutAll: '!', (self classNameFor: aClass), ' commentStamp!';lf;
-		nextPutAll: aClass comment escaped, '!';lf].
+		nextPutAll: '!!', (self classNameFor: aClass), ' commentStamp!!';lf;
+		nextPutAll: (self chunkEscape: aClass comment), '!!';lf].
 	aStream lf
-
 !
 
 exportMethod: aMethod of: aClass on: aStream
 	aStream 
-		lf; lf; nextPutAll: aMethod source; lf;
-		nextPutAll: '!'
+		lf; lf; nextPutAll: (self chunkEscape: aMethod source); lf;
+		nextPutAll: '!!'
 !
 
 exportMethodsOf: aClass on: aStream
 
-    | methodsByCategory |
-    methodsByCategory := Dictionary new.
-    aClass methodDictionary values do: [:m |
-	(methodsByCategory at: m category ifAbsentPut: [Array new])
- 		add: m]. 
-    aClass protocols do: [:category |       
-	aStream
-		nextPutAll: '!', (self classNameFor: aClass);
-		nextPutAll: ' methodsFor: ''', category, '''!'.
-    	(methodsByCategory at: category) do: [:each |
-		self exportMethod: each of: aClass on: aStream].
-	aStream nextPutAll: ' !'; lf; lf]
+   aClass protocolsDo: [:category :methods |
+	(category match: '^\*') ifFalse: [ 
+		self
+			exportMethods: methods
+			category: category
+			of: aClass
+			on: aStream]]
 !
 
 exportMetaDefinitionOf: aClass on: aStream
@@ -994,9 +918,9 @@ exportMetaDefinitionOf: aClass on: aStream
 		    nextPutAll: ' instanceVariableNames: '''.
 		aClass class instanceVariableNames 
 		    do: [:each | aStream nextPutAll: each]
-		    separatedBy: [aStream nextPutAll: ', '].
+		    separatedBy: [aStream nextPutAll: ' '].
 		aStream	
-		    nextPutAll: '''!'; lf; lf]
+		    nextPutAll: '''!!'; lf; lf]
 !
 
 classNameFor: aClass
@@ -1006,5 +930,68 @@ classNameFor: aClass
 		aClass isNil
 		    ifTrue: ['nil']
 		    ifFalse: [aClass name]]
+!
+
+chunkEscape: aString
+	"Replace all occurrences of !! with !!!! and trim at both ends."
+
+	^(aString replace: '!!' with: '!!!!') trimBoth
+!
+
+exportCategoryExtensions: aString on: aStream
+	"We need to override this one too since we need to group
+	all methods in a given protocol under a leading methodsFor: chunk
+	for that class."
+
+	Smalltalk current classes, (Smalltalk current classes collect: [:each | each class]) do: [:each |
+		each protocolsDo: [:category :methods |
+			category = ('*', aString) ifTrue: [
+				self exportMethods: methods category: category of: each on: aStream]]]
+!
+
+exportMethods: methods category: category of: aClass on: aStream
+
+	aStream
+		nextPutAll: '!!', (self classNameFor: aClass);
+		nextPutAll: ' methodsFor: ''', category, '''!!'.
+    	methods do: [:each |
+		self exportMethod: each of: aClass on: aStream].
+	aStream nextPutAll: ' !!'; lf; lf
+! !
+
+Exporter subclass: #StrippedExporter
+	instanceVariableNames: ''
+	category: 'Parser'!
+
+!StrippedExporter methodsFor: 'private'!
+
+exportDefinitionOf: aClass on: aStream
+	aStream 
+	    nextPutAll: 'smalltalk.addClass(';
+	    nextPutAll: '''', (self classNameFor: aClass), ''', ';
+	    nextPutAll: 'smalltalk.', (self classNameFor: aClass superclass);
+	    nextPutAll: ', ['.
+	aClass instanceVariableNames 
+	    do: [:each | aStream nextPutAll: '''', each, '''']
+	    separatedBy: [aStream nextPutAll: ', '].
+	aStream	
+	    nextPutAll: '], ''';
+	    nextPutAll: aClass category, '''';
+	    nextPutAll: ');'.
+	aStream lf
+!
+
+exportMethod: aMethod of: aClass on: aStream
+	aStream 
+		nextPutAll: 'smalltalk.addMethod(';lf;
+		nextPutAll: '''', aMethod selector asSelector, ''',';lf;
+		nextPutAll: 'smalltalk.method({';lf;
+		nextPutAll: 'selector: ''', aMethod selector, ''',';lf;
+		nextPutAll: 'category: ''', aMethod category, ''',';lf;
+		nextPutAll: 'fn: ', aMethod fn compiledSource, ',';lf;
+		nextPutAll: ']';lf;
+		nextPutAll: '}),';lf;
+		nextPutAll: 'smalltalk.', (self classNameFor: aClass);
+		nextPutAll: ');';lf;lf
 ! !
 

+ 3 - 7
st/SUnit.st

@@ -76,7 +76,6 @@ TestCase subclass: #ExampleTest
 
 testFailure
 	self deny: true
-	
 !
 
 testPasses
@@ -88,7 +87,7 @@ testError
 ! !
 
 TabWidget subclass: #ProgressBar
-	instanceVariableNames: 'percent, progressDiv'
+	instanceVariableNames: 'percent progressDiv'
 	category: 'SUnit'!
 
 !ProgressBar methodsFor: 'accessing'!
@@ -124,14 +123,13 @@ Error subclass: #TestFailure
 	category: 'SUnit'!
 
 TabWidget subclass: #TestRunner
-	instanceVariableNames: 'selectedCategories, categoriesList, selectedClasses, classesList, selectedMethods, progressBar, methodsList, result, statusDiv'
+	instanceVariableNames: 'selectedCategories categoriesList selectedClasses classesList selectedMethods progressBar methodsList result statusDiv'
 	category: 'SUnit'!
 
 !TestRunner methodsFor: 'accessing'!
 
 label
     ^'[Test runner]'
-
 !
 
 categories
@@ -274,7 +272,6 @@ renderButtonsOn: html
     html button
 	with: 'Run selected';
 	onClick: [self run: (self selectedClasses collect: [:each | each new])]
-
 !
 
 renderCategoriesOn: html
@@ -313,7 +310,6 @@ renderErrorsOn: html
 
 canBeClosed
     ^true
-
 !
 
 isSelectedClass: aClass
@@ -370,7 +366,7 @@ updateStatusDiv
 ! !
 
 Object subclass: #TestResult
-	instanceVariableNames: 'timestamp, runs, errors, failures, total'
+	instanceVariableNames: 'timestamp runs errors failures total'
 	category: 'SUnit'!
 
 !TestResult methodsFor: 'accessing'!

部分文件因为文件数量过多而无法显示