Browse Source

- (almost) Working debugger
- Better inspector
- Removed Canvas bindings
- Partly rewrote SUnit to handle debugging
- Recompiled all .st files to reflect changes in boot.js

Nicolas Petton 12 năm trước cách đây
mục cha
commit
797954d0e4
22 tập tin đã thay đổi với 1653 bổ sung1024 xóa
  1. 112 10
      css/jtalk.css
  2. 0 66
      css/sunit.css
  3. 7 7
      js/Benchfib.deploy.js
  4. 0 204
      js/Canvas.deploy.js
  5. 88 279
      js/Canvas.js
  6. 6 4
      js/Compiler.deploy.js
  7. 120 13
      js/Compiler.js
  8. 51 1
      js/Examples.js
  9. 316 60
      js/IDE.deploy.js
  10. 118 6
      js/IDE.js
  11. 74 0
      js/JQuery.js
  12. 12 12
      js/Kernel.deploy.js
  13. 140 23
      js/Kernel.js
  14. 96 48
      js/SUnit.deploy.js
  15. 164 72
      js/SUnit.js
  16. 30 13
      js/boot.js
  17. 0 1
      js/jtalk.js
  18. 0 96
      st/Canvas.st
  19. 20 4
      st/Compiler.st
  20. 248 70
      st/IDE.st
  21. 5 6
      st/Kernel.st
  22. 46 29
      st/SUnit.st

+ 112 - 10
css/jtalk.css

@@ -278,12 +278,6 @@ body.jtalkBody {
     line-height: 18px;
 }
 
-/* .jtalkTool .jt_tabs li:hover { */
-/*     background: #08c; */
-/*     color: white; */
-/*     border-color: #08c; */
-/* } */
-
 .jtalkTool .jt_tabs li.selected,
 .jtalkTool .jt_tabs li.selected:hover {
     background: white;
@@ -306,7 +300,7 @@ body.jtalkBody {
     height: 100%;
 }
 
-/* Debugger */
+/* Debugger & inspector */
 
 .jtalkTool .jt_box .label {
 	width: 98%;
@@ -318,13 +312,47 @@ body.jtalkBody {
 	color: red;
 }
 
+.jtalkTool .jt_box .jt_column.debugger {
+    top: 175px;
+}
+
 .jtalkTool .jt_box .jt_column.debugger.contexts {
-    width: 100%;
     top: 30px;
-    
+    width: 100%;
 }
 
-/***** IDE - ReferencesBrowser ******/
+.jtalkTool .jt_sourceCode.debugger {
+    width: 60%;
+}
+
+.jtalkTool .jt_box .jt_column.debugger.variables {
+    width: 10%;
+    left: 61%;
+    bottom: 0;
+    position: absolute;
+    height: auto;
+}
+
+.jtalkTool .jt_box .jt_column.debugger.inspector {
+    width: 28%;
+    left: 72%;
+    bottom: 0;
+    position: absolute;
+    height: auto;
+}
+
+.jtalkTool .jt_button.debugger.inspect {
+    position: absolute;
+    left: 61%;
+}
+
+.jtalkTool .jt_buttons.inspector {
+    position: absolute;
+    top: 140px;
+}
+
+
+/* ReferencesBrowser */
 
 .jtalkTool .jt_box .implementors {
 	width: 100%
@@ -365,3 +393,77 @@ body.jtalkBody {
 .jtalkTool .classes .commented {
 		color: #33337F;
 }
+
+
+/* SUnit TestRunner  */
+
+.jtalkTool .jt_column.sunit.categories,
+.jtalkTool .jt_column.sunit.classes {
+	height: 100%
+}
+
+.jtalkTool .jt_column.sunit.classes li.all,
+.jtalkTool .jt_column.sunit.categories li.all {
+	background: #e3e3e3;
+	font-weight: bold
+}
+
+.jtalkTool .jt_column.sunit.classes li.all:hover ,
+.jtalkTool .jt_column.sunit.categories li.all:hover {
+	background: #0088CC;
+	font-weight: bold
+}
+
+.jtalkTool .sunit.status {
+	position: absolute;
+	left: 50.4%;
+	width: 49%;
+	background: white;
+	border: 1px solid #a8a8a8;
+	height: 40px
+}
+
+
+.jtalkTool .sunit.status.success {
+	background: #43d443;
+}
+
+
+.jtalkTool .sunit.status.failure {
+	background: #ecd443;
+}
+
+
+.jtalkTool .sunit.status.error {
+	background: #e56f3b;
+}
+
+.jtalkTool .progress_bar {
+	position: absolute;
+	left: 50.4%;
+	width: 49%;
+	top: 50px;
+	border: 1px solid #a8a8a8;
+	background: white;
+	min-height: 20px
+}
+
+.jtalkTool .progress_bar div {
+	background: #0088CC;
+	min-height: 20px;
+}
+
+.jtalkTool .jt_column.sunit.methods {
+	left: 50.4%;
+	height: auto;
+        width: 49%;
+        top: 80px;
+        bottom: 0;
+}
+
+.jtalkTool .jt_column.sunit.methods .errors {
+    color: red;
+}
+
+.jtalkTool .jt_column.sunit.methods ul {padding: 0; margin: 0}
+

+ 0 - 66
css/sunit.css

@@ -1,66 +0,0 @@
-.jtalkTool .jt_column.sunit.categories,
-.jtalkTool .jt_column.sunit.classes {
-	height: 100%
-}
-
-.jtalkTool .jt_column.sunit.classes li.all,
-.jtalkTool .jt_column.sunit.categories li.all {
-	background: #e3e3e3;
-	font-weight: bold
-}
-
-.jtalkTool .jt_column.sunit.classes li.all:hover ,
-.jtalkTool .jt_column.sunit.categories li.all:hover {
-	background: #0088CC;
-	font-weight: bold
-}
-
-.jtalkTool .sunit.status {
-	position: absolute;
-	left: 50.4%;
-	width: 49%;
-	background: white;
-	border: 1px solid #a8a8a8;
-	height: 40px
-}
-
-
-.jtalkTool .sunit.status.success {
-	background: #43d443;
-}
-
-
-.jtalkTool .sunit.status.failure {
-	background: #ecd443;
-}
-
-
-.jtalkTool .sunit.status.error {
-	background: #e56f3b;
-}
-
-.jtalkTool .progress_bar {
-	position: absolute;
-	left: 50.4%;
-	width: 49%;
-	top: 50px;
-	border: 1px solid #a8a8a8;
-	background: white;
-	min-height: 20px
-}
-
-.jtalkTool .progress_bar div {
-	background: #0088CC;
-	min-height: 20px;
-}
-
-.jtalkTool .jt_column.sunit.methods {
-	left: 50.4%;
-	height: auto;
-        width: 49%;
-        top: 80px;
-        bottom: 0;
-}
-
-.jtalkTool .jt_column.sunit.methods ul {padding: 0; margin: 0}
-

+ 7 - 7
js/Benchfib.deploy.js

@@ -8,7 +8,7 @@ fn: function (){
 var self=this;
 var result=nil;
 result=smalltalk.send((0), "_tinyBenchmarks", []);
-smalltalk.send(console, "_log_", [(typeof ($receiver = unescape("0%20tinyBenchmarks%20%3D%3E%20")) === 'string') ? [$receiver, result].join("") : smalltalk.send($receiver, "__comma", [result])]);
+smalltalk.send((typeof console == 'undefined' ? nil : console), "_log_", [smalltalk.send(unescape("0%20tinyBenchmarks%20%3D%3E%20"), "__comma", [result])]);
 return self;}
 }),
 smalltalk.Benchfib.klass);
@@ -37,7 +37,7 @@ var prime=nil;
 var k=nil;
 var count=nil;
 size=(8190);
-smalltalk.send((1), "_to_do_", [self, (function(iter){count=(0);flags=smalltalk.send(smalltalk.Array, "_new", []);smalltalk.send(size, "_timesRepeat_", [(function(){return smalltalk.send(flags, "_add_", [true]);})]);return smalltalk.send((1), "_to_do_", [size, (function(i){return (($receiver = smalltalk.send(flags, "_at_", [i])).klass === smalltalk.Boolean) ? ($receiver ? (function(){prime=(($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);k=(($receiver = i).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);(function(){while((function(){return (($receiver = k).klass === smalltalk.Number) ? $receiver <=size : smalltalk.send($receiver, "__lt_eq", [size]);})()) {(function(){smalltalk.send(flags, "_at_put_", [k, false]);return k=(($receiver = k).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);})()}})();return count=(($receiver = count).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){prime=(($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);k=(($receiver = i).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);(function(){while((function(){return (($receiver = k).klass === smalltalk.Number) ? $receiver <=size : smalltalk.send($receiver, "__lt_eq", [size]);})()) {(function(){smalltalk.send(flags, "_at_put_", [k, false]);return k=(($receiver = k).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);})()}})();return count=(($receiver = count).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})]);})]);})]);
+smalltalk.send((1), "_to_do_", [self, (function(iter){count=(0);flags=smalltalk.send((smalltalk.Array || Array), "_new", []);smalltalk.send(size, "_timesRepeat_", [(function(){return smalltalk.send(flags, "_add_", [true]);})]);return smalltalk.send((1), "_to_do_", [size, (function(i){return (($receiver = smalltalk.send(flags, "_at_", [i])).klass === smalltalk.Boolean) ? ($receiver ? (function(){prime=(($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);k=(($receiver = i).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);(function(){while((function(){return (($receiver = k).klass === smalltalk.Number) ? $receiver <=size : smalltalk.send($receiver, "__lt_eq", [size]);})()) {(function(){smalltalk.send(flags, "_at_put_", [k, false]);return k=(($receiver = k).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);})()}})();return count=(($receiver = count).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){prime=(($receiver = i).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);k=(($receiver = i).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);(function(){while((function(){return (($receiver = k).klass === smalltalk.Number) ? $receiver <=size : smalltalk.send($receiver, "__lt_eq", [size]);})()) {(function(){smalltalk.send(flags, "_at_put_", [k, false]);return k=(($receiver = k).klass === smalltalk.Number) ? $receiver +prime : smalltalk.send($receiver, "__plus", [prime]);})()}})();return count=(($receiver = count).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})]);})]);})]);
 return count;
 return self;}
 }),
@@ -55,9 +55,9 @@ var r=nil;
 var n1=nil;
 var n2=nil;
 n1=(1);
-(function(){while((function(){t1=smalltalk.send(smalltalk.Date, "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]);return (($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n1=(($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)]);})()}})();
+(function(){while((function(){t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_benchmark", []);})]);return (($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n1=(($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)]);})()}})();
 n2=(16);
-(function(){while((function(){t2=smalltalk.send(smalltalk.Date, "_millisecondsToRun_", [(function(){return r=smalltalk.send(n2, "_benchFib", []);})]);return (($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n2=(($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})()}})();
+(function(){while((function(){t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return r=smalltalk.send(n2, "_benchFib", []);})]);return (($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n2=(($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})()}})();
 return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((($receiver = (($receiver = (($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)])).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)])).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1]), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send((($receiver = (($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)])).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2]), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
 return self;}
 }),
@@ -121,10 +121,10 @@ var r=nil;
 var n1=nil;
 var n2=nil;
 n1=(1);
-smalltalk.send((function(){t1=smalltalk.send(smalltalk.Date, "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_jsbenchmark", []);})]);return smalltalk.send(t1, "__lt", [(1000)]);}), "_whileTrue_", [(function(){return n1=smalltalk.send(n1, "__star", [(2)]);})]);
+(function(){while((function(){t1=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return smalltalk.send(n1, "_jsbenchmark", []);})]);return (($receiver = t1).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n1=(($receiver = n1).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)]);})()}})();
 n2=(28);
-smalltalk.send((function(){t2=smalltalk.send(smalltalk.Date, "_millisecondsToRun_", [(function(){return r=smalltalk.send(n2, "_jsbenchFib", []);})]);return smalltalk.send(t2, "__lt", [(1000)]);}), "_whileTrue_", [(function(){return n2=smalltalk.send(n2, "__plus", [(1)]);})]);
-return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(n1, "__star", [(500000)]), "__star", [(1000)]), "__slash", [t1]), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(r, "__star", [(1000)]), "__slash", [t2]), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
+(function(){while((function(){t2=smalltalk.send((smalltalk.Date || Date), "_millisecondsToRun_", [(function(){return r=smalltalk.send(n2, "_jsbenchFib", []);})]);return (($receiver = t2).klass === smalltalk.Number) ? $receiver <(1000) : smalltalk.send($receiver, "__lt", [(1000)]);})()) {(function(){return n2=(($receiver = n2).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);})()}})();
+return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((($receiver = (($receiver = (($receiver = n1).klass === smalltalk.Number) ? $receiver *(500000) : smalltalk.send($receiver, "__star", [(500000)])).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)])).klass === smalltalk.Number) ? $receiver /t1 : smalltalk.send($receiver, "__slash", [t1]), "_printString", []), "__comma", [unescape("%20bytecodes/sec%3B%20")]), "__comma", [smalltalk.send((($receiver = (($receiver = r).klass === smalltalk.Number) ? $receiver *(1000) : smalltalk.send($receiver, "__star", [(1000)])).klass === smalltalk.Number) ? $receiver /t2 : smalltalk.send($receiver, "__slash", [t2]), "_printString", [])]), "__comma", [unescape("%20sends/sec")]);
 return self;}
 }),
 smalltalk.Number);

+ 0 - 204
js/Canvas.deploy.js

@@ -1,171 +1,3 @@
-smalltalk.addClass('CanvasRenderingContext', smalltalk.Object, [], 'Canvas');
-smalltalk.addMethod(
-'_arcTo_radius_startAngle_endAngle_anticlockwise_',
-smalltalk.method({
-selector: 'arcTo:radius:startAngle:endAngle:anticlockwise:',
-fn: function (aPoint, aNumber, aNumber2, aNumber3, aBoolean){
-var self=this;
-self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean);
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_arcTo_radius_',
-smalltalk.method({
-selector: 'arcTo:radius:',
-fn: function (aPoint, aNumber){
-var self=this;
-smalltalk.send(self, "_arcTo_radius_startAngle_endAngle_anticlockwise_", [aPoint, aNumber, (0), (($receiver = smalltalk.send((smalltalk.Number || Number), "_pi", [])).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)]), false]);
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fillStyle_',
-smalltalk.method({
-selector: 'fillStyle:',
-fn: function (aString){
-var self=this;
-self.fillStyle = String(aString);
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_beginPath',
-smalltalk.method({
-selector: 'beginPath',
-fn: function (){
-var self=this;
-self.beginPath();
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_closePath',
-smalltalk.method({
-selector: 'closePath',
-fn: function (){
-var self=this;
-self.closePath();
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fill',
-smalltalk.method({
-selector: 'fill',
-fn: function (){
-var self=this;
-self.fill();
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_stroke',
-smalltalk.method({
-selector: 'stroke',
-fn: function (){
-var self=this;
-self.stroke();
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_moveTo_',
-smalltalk.method({
-selector: 'moveTo:',
-fn: function (aPoint){
-var self=this;
-self.moveTo(aPoint._x(), aPoint._y());
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_lineTo_',
-smalltalk.method({
-selector: 'lineTo:',
-fn: function (aPoint){
-var self=this;
-self.lineTo(aPoint._x(), aPoint._y());
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_strokeStyle_',
-smalltalk.method({
-selector: 'strokeStyle:',
-fn: function (aString){
-var self=this;
-self.strokeStyle = String(aString);
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_lineWidth_',
-smalltalk.method({
-selector: 'lineWidth:',
-fn: function (aNumber){
-var self=this;
-self.lineWidth = aNumber;
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fillRectFrom_to_',
-smalltalk.method({
-selector: 'fillRectFrom:to:',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_strokeRectFrom_to_',
-smalltalk.method({
-selector: 'strokeRectFrom:to:',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.strokeRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_clearRectFrom_to_',
-smalltalk.method({
-selector: 'clearRectFrom:to:',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;}
-}),
-smalltalk.CanvasRenderingContext);
-
-
-smalltalk.addMethod(
-'_tagBrush_',
-smalltalk.method({
-selector: 'tagBrush:',
-fn: function (aTagBrush){
-var self=this;
-return aTagBrush._element().getContext('2d');
-return self;}
-}),
-smalltalk.CanvasRenderingContext.klass);
-
-
 smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
 '_root_',
@@ -1090,42 +922,6 @@ smalltalk.Widget);
 
 
 
-smalltalk.addClass('CanvasBrush', smalltalk.TagBrush, [], 'Canvas');
-smalltalk.addMethod(
-'_initializeWithCanvas_',
-smalltalk.method({
-selector: 'initializeWithCanvas:',
-fn: function (aCanvas){
-var self=this;
-self['@canvas']=aCanvas;
-return self;}
-}),
-smalltalk.CanvasBrush);
-
-smalltalk.addMethod(
-'_createElement',
-smalltalk.method({
-selector: 'createElement',
-fn: function (){
-var self=this;
-return document.createElement('canvas');
-return self;}
-}),
-smalltalk.CanvasBrush);
-
-
-smalltalk.addMethod(
-'_canvas_',
-smalltalk.method({
-selector: 'canvas:',
-fn: function (aCanvas){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeWithCanvas_", [aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;}
-}),
-smalltalk.CanvasBrush.klass);
-
-
 smalltalk.addMethod(
 '_appendToBrush_',
 smalltalk.method({

+ 88 - 279
js/Canvas.js

@@ -1,231 +1,3 @@
-smalltalk.addClass('CanvasRenderingContext', smalltalk.Object, [], 'Canvas');
-smalltalk.addMethod(
-'_arcTo_radius_startAngle_endAngle_anticlockwise_',
-smalltalk.method({
-selector: 'arcTo:radius:startAngle:endAngle:anticlockwise:',
-category: 'drawing arcs',
-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%3Cself.arc%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20aNumber%2C%20aNumber2%2C%20aNumber3%2C%20aBoolean%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_arcTo_radius_',
-smalltalk.method({
-selector: 'arcTo:radius:',
-category: 'drawing arcs',
-fn: function (aPoint, aNumber){
-var self=this;
-smalltalk.send(self, "_arcTo_radius_startAngle_endAngle_anticlockwise_", [aPoint, aNumber, (0), (($receiver = smalltalk.send((smalltalk.Number || Number), "_pi", [])).klass === smalltalk.Number) ? $receiver *(2) : smalltalk.send($receiver, "__star", [(2)]), false]);
-return self;},
-source: unescape('arcTo%3A%20aPoint%20radius%3A%20aNumber%0A%09self%20arcTo%3A%20aPoint%20radius%3A%20aNumber%20startAngle%3A%200%20endAngle%3A%20Number%20pi%20*%202%20anticlockwise%3A%20false'),
-messageSends: ["arcTo:radius:startAngle:endAngle:anticlockwise:", unescape("*"), "pi"],
-referencedClasses: [smalltalk.Number]
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fillStyle_',
-smalltalk.method({
-selector: 'fillStyle:',
-category: 'drawing paths',
-fn: function (aString){
-var self=this;
-self.fillStyle = String(aString);
-return self;},
-source: unescape('fillStyle%3A%20aString%0A%09%3Cself.fillStyle%20%3D%20String%28aString%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_beginPath',
-smalltalk.method({
-selector: 'beginPath',
-category: 'drawing paths',
-fn: function (){
-var self=this;
-self.beginPath();
-return self;},
-source: unescape('beginPath%0A%09%3Cself.beginPath%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_closePath',
-smalltalk.method({
-selector: 'closePath',
-category: 'drawing paths',
-fn: function (){
-var self=this;
-self.closePath();
-return self;},
-source: unescape('closePath%0A%09%3Cself.closePath%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fill',
-smalltalk.method({
-selector: 'fill',
-category: 'drawing paths',
-fn: function (){
-var self=this;
-self.fill();
-return self;},
-source: unescape('fill%0A%09%3Cself.fill%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_stroke',
-smalltalk.method({
-selector: 'stroke',
-category: 'drawing paths',
-fn: function (){
-var self=this;
-self.stroke();
-return self;},
-source: unescape('stroke%0A%09%3Cself.stroke%28%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_moveTo_',
-smalltalk.method({
-selector: 'moveTo:',
-category: 'drawing paths',
-fn: function (aPoint){
-var self=this;
-self.moveTo(aPoint._x(), aPoint._y());
-return self;},
-source: unescape('moveTo%3A%20aPoint%0A%09%3Cself.moveTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_lineTo_',
-smalltalk.method({
-selector: 'lineTo:',
-category: 'drawing paths',
-fn: function (aPoint){
-var self=this;
-self.lineTo(aPoint._x(), aPoint._y());
-return self;},
-source: unescape('lineTo%3A%20aPoint%0A%09%3Cself.lineTo%28aPoint._x%28%29%2C%20aPoint._y%28%29%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_strokeStyle_',
-smalltalk.method({
-selector: 'strokeStyle:',
-category: 'drawing paths',
-fn: function (aString){
-var self=this;
-self.strokeStyle = String(aString);
-return self;},
-source: unescape('strokeStyle%3A%20aString%0A%09%3Cself.strokeStyle%20%3D%20String%28aString%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_lineWidth_',
-smalltalk.method({
-selector: 'lineWidth:',
-category: 'drawing paths',
-fn: function (aNumber){
-var self=this;
-self.lineWidth = aNumber;
-return self;},
-source: unescape('lineWidth%3A%20aNumber%0A%09%3Cself.lineWidth%20%3D%20aNumber%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_fillRectFrom_to_',
-smalltalk.method({
-selector: 'fillRectFrom:to:',
-category: 'drawing rectangles',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;},
-source: unescape('fillRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_strokeRectFrom_to_',
-smalltalk.method({
-selector: 'strokeRectFrom:to:',
-category: 'drawing rectangles',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.strokeRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;},
-source: unescape('strokeRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.strokeRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-smalltalk.addMethod(
-'_clearRectFrom_to_',
-smalltalk.method({
-selector: 'clearRectFrom:to:',
-category: 'drawing rectangles',
-fn: function (aPoint, anotherPoint){
-var self=this;
-self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y());
-return self;},
-source: unescape('clearRectFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09%3Cself.fillRect%28aPoint._x%28%29%2C%20aPoint._y%28%29%2C%20anotherPoint._x%28%29%2C%20anotherPoint._y%28%29%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext);
-
-
-smalltalk.addMethod(
-'_tagBrush_',
-smalltalk.method({
-selector: 'tagBrush:',
-category: 'instance creation',
-fn: function (aTagBrush){
-var self=this;
-return aTagBrush._element().getContext('2d');
-return self;},
-source: unescape('tagBrush%3A%20aTagBrush%0A%09%3Creturn%20aTagBrush._element%28%29.getContext%28%272d%27%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasRenderingContext.klass);
-
-
 smalltalk.addClass('HTMLCanvas', smalltalk.Object, ['root'], 'Canvas');
 smalltalk.addMethod(
 '_root_',
@@ -236,6 +8,7 @@ fn: function (aTagBrush){
 var self=this;
 self['@root']=aTagBrush;
 return self;},
+args: ["aTagBrush"],
 source: unescape('root%3A%20aTagBrush%0A%20%20%20%20root%20%3A%3D%20aTagBrush'),
 messageSends: [],
 referencedClasses: []
@@ -251,6 +24,7 @@ fn: function (){
 var self=this;
 return self['@root'];
 return self;},
+args: [],
 source: unescape('root%0A%20%20%20%20%5Eroot'),
 messageSends: [],
 referencedClasses: []
@@ -266,6 +40,7 @@ fn: function (anObject){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_root", []), "_with_", [anObject]);
 return self;},
+args: ["anObject"],
 source: unescape('with%3A%20anObject%0A%20%20%20%20%5Eself%20root%20with%3A%20anObject'),
 messageSends: ["with:", "root"],
 referencedClasses: []
@@ -282,9 +57,10 @@ var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 (($receiver = self['@root']) == nil || $receiver == undefined) ? (function(){return self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", ["div", self]);})() : $receiver;
 return self;},
+args: [],
 source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20root%20ifNil%3A%20%5Broot%20%3A%3D%20TagBrush%20fromString%3A%20%27div%27%20canvas%3A%20self%5D'),
 messageSends: ["initialize", "ifNil:", "fromString:canvas:"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.HTMLCanvas);
 
@@ -297,9 +73,10 @@ fn: function (aJQuery){
 var self=this;
 self['@root']=smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromJQuery_canvas_", [aJQuery, self]);
 return self;},
+args: ["aJQuery"],
 source: unescape('initializeFromJQuery%3A%20aJQuery%0A%20%20%20%20root%20%3A%3D%20TagBrush%20fromJQuery%3A%20aJQuery%20canvas%3A%20self'),
 messageSends: ["fromJQuery:canvas:"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.HTMLCanvas);
 
@@ -312,9 +89,10 @@ fn: function (aString){
 var self=this;
 return smalltalk.send((smalltalk.TagBrush || TagBrush), "_fromString_canvas_", [aString, self]);
 return self;},
+args: ["aString"],
 source: unescape('newTag%3A%20aString%0A%20%20%20%20%5ETagBrush%20fromString%3A%20aString%20canvas%3A%20self'),
 messageSends: ["fromString:canvas:"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.HTMLCanvas);
 
@@ -327,6 +105,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self['@root'], "_addBrush_", [smalltalk.send(self, "_newTag_", [aString])]);
 return self;},
+args: ["aString"],
 source: unescape('tag%3A%20aString%0A%20%20%20%20%5Eroot%20addBrush%3A%20%28self%20newTag%3A%20aString%29'),
 messageSends: ["addBrush:", "newTag:"],
 referencedClasses: []
@@ -342,6 +121,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h1"]);
 return self;},
+args: [],
 source: unescape('h1%0A%20%20%20%20%5Eself%20tag%3A%20%27h1%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -357,6 +137,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h2"]);
 return self;},
+args: [],
 source: unescape('h2%0A%20%20%20%20%5Eself%20tag%3A%20%27h2%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -372,6 +153,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h3"]);
 return self;},
+args: [],
 source: unescape('h3%0A%20%20%20%20%5Eself%20tag%3A%20%27h3%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -387,6 +169,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h4"]);
 return self;},
+args: [],
 source: unescape('h4%0A%20%20%20%20%5Eself%20tag%3A%20%27h4%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -402,6 +185,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h5"]);
 return self;},
+args: [],
 source: unescape('h5%0A%20%20%20%20%5Eself%20tag%3A%20%27h5%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -417,6 +201,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["h6"]);
 return self;},
+args: [],
 source: unescape('h6%0A%20%20%20%20%5Eself%20tag%3A%20%27h6%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -432,6 +217,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["p"]);
 return self;},
+args: [],
 source: unescape('p%0A%20%20%20%20%5Eself%20tag%3A%20%27p%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -447,6 +233,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["div"]);
 return self;},
+args: [],
 source: unescape('div%0A%20%20%20%20%5Eself%20tag%3A%20%27div%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -462,6 +249,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["span"]);
 return self;},
+args: [],
 source: unescape('span%0A%20%20%20%20%5Eself%20tag%3A%20%27span%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -477,6 +265,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["img"]);
 return self;},
+args: [],
 source: unescape('img%0A%20%20%20%20%5Eself%20tag%3A%20%27img%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -492,6 +281,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["ul"]);
 return self;},
+args: [],
 source: unescape('ul%0A%20%20%20%20%5Eself%20tag%3A%20%27ul%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -507,6 +297,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["ol"]);
 return self;},
+args: [],
 source: unescape('ol%0A%20%20%20%20%5Eself%20tag%3A%20%27ol%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -522,6 +313,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["li"]);
 return self;},
+args: [],
 source: unescape('li%0A%20%20%20%20%5Eself%20tag%3A%20%27li%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -537,6 +329,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["table"]);
 return self;},
+args: [],
 source: unescape('table%0A%20%20%20%20%5Eself%20tag%3A%20%27table%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -552,6 +345,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["tr"]);
 return self;},
+args: [],
 source: unescape('tr%0A%20%20%20%20%5Eself%20tag%3A%20%27tr%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -567,6 +361,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["td"]);
 return self;},
+args: [],
 source: unescape('td%20%0A%20%20%20%20%5Eself%20tag%3A%20%27td%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -582,6 +377,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["th"]);
 return self;},
+args: [],
 source: unescape('th%0A%20%20%20%20%5Eself%20tag%3A%20%27th%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -597,6 +393,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["form"]);
 return self;},
+args: [],
 source: unescape('form%0A%20%20%20%20%5Eself%20tag%3A%20%27form%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -612,6 +409,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["input"]);
 return self;},
+args: [],
 source: unescape('input%0A%20%20%20%20%5Eself%20tag%3A%20%27input%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -627,6 +425,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["button"]);
 return self;},
+args: [],
 source: unescape('button%0A%20%20%20%20%5Eself%20tag%3A%20%27button%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -642,6 +441,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["select"]);
 return self;},
+args: [],
 source: unescape('select%0A%20%20%20%20%5Eself%20tag%3A%20%27select%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -657,6 +457,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["option"]);
 return self;},
+args: [],
 source: unescape('option%0A%20%20%20%20%5Eself%20tag%3A%20%27option%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -672,6 +473,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["textarea"]);
 return self;},
+args: [],
 source: unescape('textarea%0A%20%20%20%20%5Eself%20tag%3A%20%27textarea%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -687,6 +489,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["a"]);
 return self;},
+args: [],
 source: unescape('a%0A%20%20%20%20%5Eself%20tag%3A%20%27a%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -702,6 +505,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["canvas"]);
 return self;},
+args: [],
 source: unescape('canvas%0A%09%5Eself%20tag%3A%20%27canvas%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -717,6 +521,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["pre"]);
 return self;},
+args: [],
 source: unescape('pre%0A%20%20%20%20%5Eself%20tag%3A%20%27pre%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -732,6 +537,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["code"]);
 return self;},
+args: [],
 source: unescape('code%0A%20%20%20%20%5Eself%20tag%3A%20%27code%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -747,6 +553,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["br"]);
 return self;},
+args: [],
 source: unescape('br%0A%20%20%20%20%5Eself%20tag%3A%20%27br%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -762,6 +569,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["script"]);
 return self;},
+args: [],
 source: unescape('script%0A%20%20%20%20%5Eself%20tag%3A%20%27script%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -777,6 +585,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["link"]);
 return self;},
+args: [],
 source: unescape('link%0A%20%20%20%20%5Eself%20tag%3A%20%27link%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -792,6 +601,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_tag_", ["style"]);
 return self;},
+args: [],
 source: unescape('style%0A%09%5Eself%20tag%3A%20%27style%27'),
 messageSends: ["tag:"],
 referencedClasses: []
@@ -808,6 +618,7 @@ fn: function (aJQuery){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_", [aJQuery]);smalltalk.send($rec, "_initialize", []);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_basicNew", []));
 return self;},
+args: ["aJQuery"],
 source: unescape('onJQuery%3A%20aJQuery%0A%09%5Eself%20basicNew%0A%09%09initializeFromJQuery%3A%20aJQuery%3B%0A%09%09initialize%3B%0A%09%09yourself'),
 messageSends: ["initializeFromJQuery:", "initialize", "yourself", "basicNew"],
 referencedClasses: []
@@ -825,6 +636,7 @@ fn: function (){
 var self=this;
 return self['@element'];
 return self;},
+args: [],
 source: unescape('element%0A%20%20%20%20%5Eelement'),
 messageSends: [],
 referencedClasses: []
@@ -840,6 +652,7 @@ fn: function (anObject){
 var self=this;
 (function($rec){smalltalk.send($rec, "_empty", []);return smalltalk.send($rec, "_append_", [anObject]);})(self);
 return self;},
+args: ["anObject"],
 source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20%0A%09empty%3B%0A%20%20%20%09append%3A%20anObject'),
 messageSends: ["empty", "append:"],
 referencedClasses: []
@@ -856,6 +669,7 @@ var self=this;
 smalltalk.send(self, "_appendChild_", [smalltalk.send(aTagBrush, "_element", [])]);
 return aTagBrush;
 return self;},
+args: ["aTagBrush"],
 source: unescape('addBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendChild%3A%20aTagBrush%20element.%0A%20%20%20%20%5EaTagBrush'),
 messageSends: ["appendChild:", "element"],
 referencedClasses: []
@@ -871,6 +685,7 @@ fn: function (anObject){
 var self=this;
 smalltalk.send(self, "_append_", [anObject]);
 return self;},
+args: ["anObject"],
 source: unescape('with%3A%20anObject%0A%20%20%20%20self%20append%3A%20anObject'),
 messageSends: ["append:"],
 referencedClasses: []
@@ -886,6 +701,7 @@ fn: function (anObject){
 var self=this;
 smalltalk.send(anObject, "_appendToBrush_", [self]);
 return self;},
+args: ["anObject"],
 source: unescape('append%3A%20anObject%0A%20%20%20%20anObject%20appendToBrush%3A%20self'),
 messageSends: ["appendToBrush:"],
 referencedClasses: []
@@ -901,6 +717,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_addBrush_", [self]);
 return self;},
+args: ["aTagBrush"],
 source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20addBrush%3A%20self'),
 messageSends: ["addBrush:"],
 referencedClasses: []
@@ -920,6 +737,7 @@ smalltalk.send(self['@canvas'], "_root_", [self]);
 smalltalk.send(aBlock, "_value_", [self['@canvas']]);
 smalltalk.send(self['@canvas'], "_root_", [root]);
 return self;},
+args: ["aBlock"],
 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: []
@@ -940,6 +758,7 @@ var element=self['@element'];
  		element.text = String(element.text) +  anElement.innerHTML;
  	} ;
 return self;},
+args: ["anElement"],
 source: unescape('appendChild%3A%20anElement%0A%09%22In%20IE7%20and%20IE8%20appendChild%20fails%20on%20several%20node%20types.%20So%20we%20need%20to%20check%22%20%0A%20%09%3Cvar%20element%3Dself%5B%27@element%27%5D%3B%0A%20%09if%20%28null%20%3D%3D%20element.canHaveChildren%20%7C%7C%20element.canHaveChildren%29%20%7B%0A%09%09element.appendChild%28anElement%29%3B%0A%20%09%7D%20else%20%7B%0A%20%09%09element.text%20%3D%20String%28element.text%29%20+%20%20anElement.innerHTML%3B%0A%20%09%7D%20%3E'),
 messageSends: [],
 referencedClasses: []
@@ -955,6 +774,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_appendChild_", [smalltalk.send(self, "_createTextNodeFor_", [aString])]);
 return self;},
+args: ["aString"],
 source: unescape('appendString%3A%20aString%0A%20%20%20%20self%20appendChild%3A%20%28self%20createTextNodeFor%3A%20aString%29'),
 messageSends: ["appendChild:", "createTextNodeFor:"],
 referencedClasses: []
@@ -970,6 +790,7 @@ fn: function (aString, aValue){
 var self=this;
 self['@element'].setAttribute(aString, aValue);
 return self;},
+args: ["aString", "aValue"],
 source: unescape('at%3A%20aString%20put%3A%20aValue%0A%20%20%20%20%3Cself%5B%27@element%27%5D.setAttribute%28aString%2C%20aValue%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -985,6 +806,7 @@ fn: function (aString){
 var self=this;
 self['@element'].removeAttribute(aString);
 return self;},
+args: ["aString"],
 source: unescape('removeAt%3A%20aString%0A%20%20%20%20%3Cself%5B%27@element%27%5D.removeAttribute%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1000,6 +822,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["class", aString]);
 return self;},
+args: ["aString"],
 source: unescape('class%3A%20aString%0A%20%20%20%20self%20at%3A%20%27class%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1015,6 +838,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["id", aString]);
 return self;},
+args: ["aString"],
 source: unescape('id%3A%20aString%0A%20%20%20%20self%20at%3A%20%27id%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1030,6 +854,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["src", aString]);
 return self;},
+args: ["aString"],
 source: unescape('src%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27src%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1045,6 +870,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["href", aString]);
 return self;},
+args: ["aString"],
 source: unescape('href%3A%20aString%0A%20%20%20%20self%20at%3A%20%27href%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1060,6 +886,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["title", aString]);
 return self;},
+args: ["aString"],
 source: unescape('title%3A%20aString%0A%20%20%20%20self%20at%3A%20%27title%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1075,6 +902,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["style", aString]);
 return self;},
+args: ["aString"],
 source: unescape('style%3A%20aString%0A%20%20%20%20self%20at%3A%20%27style%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1090,6 +918,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["type", aString]);
 return self;},
+args: ["aString"],
 source: unescape('type%3A%20aString%0A%20%20%20%20self%20at%3A%20%27type%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1105,6 +934,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["media", aString]);
 return self;},
+args: ["aString"],
 source: unescape('media%3A%20aString%0A%20%20%20%20self%20at%3A%20%27media%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1120,6 +950,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["rel", aString]);
 return self;},
+args: ["aString"],
 source: unescape('rel%3A%20aString%0A%20%20%20%20self%20%20at%3A%20%27rel%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1135,6 +966,7 @@ fn: function (){
 var self=this;
 return smalltalk.JQuery._from_(jQuery(self['@element']));
 return self;},
+args: [],
 source: unescape('asJQuery%0A%09%3Creturn%20smalltalk.JQuery._from_%28jQuery%28self%5B%27@element%27%5D%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1150,6 +982,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(aBlock, "_value_", [smalltalk.send(self, "_asJQuery", [])]);
 return self;},
+args: ["aBlock"],
 source: unescape('asJQueryDo%3A%20aBlock%0A%20%20%20%20aBlock%20value%3A%20self%20asJQuery'),
 messageSends: ["value:", "asJQuery"],
 referencedClasses: []
@@ -1165,6 +998,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keydown", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onKeyDown%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keydown%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1180,6 +1014,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keypress", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onKeyPress%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keypress%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1195,6 +1030,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["keyup", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onKeyUp%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27keyup%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1210,6 +1046,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["focus", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onFocus%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27focus%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1225,6 +1062,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["blur", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onBlur%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27blur%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1240,6 +1078,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["change", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onChange%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27change%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1255,6 +1094,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_on_do_", ["click", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onClick%3A%20aBlock%0A%20%20%20%20self%20asJQuery%20on%3A%20%27click%27%20do%3A%20aBlock'),
 messageSends: ["on:do:", "asJQuery"],
 referencedClasses: []
@@ -1271,6 +1111,7 @@ var self=this;
 self['@element']=smalltalk.send(self, "_createElementFor_", [aString]);
 self['@canvas']=aCanvas;
 return self;},
+args: ["aString", "aCanvas"],
 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: []
@@ -1287,6 +1128,7 @@ var self=this;
 self['@element']=smalltalk.send(smalltalk.send(aJQuery, "_jquery", []), "_get_", [(0)]);
 self['@canvas']=aCanvas;
 return self;},
+args: ["aJQuery", "aCanvas"],
 source: unescape('initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20element%20%3A%3D%20aJQuery%20jquery%20get%3A%200.%0A%20%20%20%20canvas%20%3A%3D%20aCanvas'),
 messageSends: ["get:", "jquery"],
 referencedClasses: []
@@ -1302,6 +1144,7 @@ fn: function (aString){
 var self=this;
 return document.createElement(String(aString));
 return self;},
+args: ["aString"],
 source: unescape('createElementFor%3A%20aString%0A%09%3Creturn%20document.createElement%28String%28aString%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1317,6 +1160,7 @@ fn: function (aString){
 var self=this;
 return document.createTextNode(String(aString));
 return self;},
+args: ["aString"],
 source: unescape('createTextNodeFor%3A%20aString%0A%09%3Creturn%20document.createTextNode%28String%28aString%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1332,6 +1176,7 @@ fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
 return self;},
+args: [],
 source: unescape('empty%0A%09self%20asJQuery%20empty'),
 messageSends: ["empty", "asJQuery"],
 referencedClasses: []
@@ -1348,6 +1193,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;},
+args: ["aString", "aCanvas"],
 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: []
@@ -1363,6 +1209,7 @@ fn: function (aJQuery, aCanvas){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_initializeFromJQuery_canvas_", [aJQuery, aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 return self;},
+args: ["aJQuery", "aCanvas"],
 source: unescape('fromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%0A%20%20%20%20%5Eself%20new%0A%09initializeFromJQuery%3A%20aJQuery%20canvas%3A%20aCanvas%3B%0A%09yourself'),
 messageSends: ["initializeFromJQuery:canvas:", "yourself", "new"],
 referencedClasses: []
@@ -1380,6 +1227,7 @@ fn: function (aString){
 var self=this;
 alert(aString);
 return self;},
+args: ["aString"],
 source: unescape('alert%3A%20aString%0A%20%20%20%20%3Calert%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1395,6 +1243,7 @@ fn: function (aString){
 var self=this;
 return window.confirm(aString);
 return self;},
+args: ["aString"],
 source: unescape('confirm%3A%20aString%0A%20%20%20%20%3Creturn%20window.confirm%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1410,6 +1259,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_prompt_default_", [aString, ""]);
 return self;},
+args: ["aString"],
 source: unescape('prompt%3A%20aString%0A%20%20%20%20%5Eself%20prompt%3A%20aString%20default%3A%20%27%27'),
 messageSends: ["prompt:default:"],
 referencedClasses: []
@@ -1425,6 +1275,7 @@ fn: function (aString, anotherString){
 var self=this;
 return window.prompt(aString, anotherString);
 return self;},
+args: ["aString", "anotherString"],
 source: unescape('prompt%3A%20aString%20default%3A%20anotherString%0A%20%20%20%20%3Creturn%20window.prompt%28aString%2C%20anotherString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1440,6 +1291,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(self, "_appendToJQuery_", [smalltalk.send(aTagBrush, "_asJQuery", [])]);
 return self;},
+args: ["aTagBrush"],
 source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20self%20appendToJQuery%3A%20aTagBrush%20asJQuery'),
 messageSends: ["appendToJQuery:", "asJQuery"],
 referencedClasses: []
@@ -1455,6 +1307,7 @@ fn: function (aJQuery){
 var self=this;
 smalltalk.send(self, "_renderOn_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
 return self;},
+args: ["aJQuery"],
 source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20self%20renderOn%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
 messageSends: ["renderOn:", "onJQuery:"],
 referencedClasses: [smalltalk.HTMLCanvas]
@@ -1470,6 +1323,7 @@ fn: function (html){
 var self=this;
 self;
 return self;},
+args: ["html"],
 source: unescape('renderOn%3A%20html%0A%20%20%20%20self'),
 messageSends: [],
 referencedClasses: []
@@ -1478,54 +1332,6 @@ smalltalk.Widget);
 
 
 
-smalltalk.addClass('CanvasBrush', smalltalk.TagBrush, [], 'Canvas');
-smalltalk.addMethod(
-'_initializeWithCanvas_',
-smalltalk.method({
-selector: 'initializeWithCanvas:',
-category: 'initialization',
-fn: function (aCanvas){
-var self=this;
-self['@canvas']=aCanvas;
-return self;},
-source: unescape('initializeWithCanvas%3A%20aCanvas%0A%09canvas%20%3A%3D%20aCanvas'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasBrush);
-
-smalltalk.addMethod(
-'_createElement',
-smalltalk.method({
-selector: 'createElement',
-category: 'private',
-fn: function (){
-var self=this;
-return document.createElement('canvas');
-return self;},
-source: unescape('createElement%0A%09%3Creturn%20document.createElement%28%27canvas%27%29%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.CanvasBrush);
-
-
-smalltalk.addMethod(
-'_canvas_',
-smalltalk.method({
-selector: 'canvas:',
-category: 'instance creation',
-fn: function (aCanvas){
-var self=this;
-return (function($rec){smalltalk.send($rec, "_initializeWithCanvas_", [aCanvas]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
-return self;},
-source: unescape('canvas%3A%20aCanvas%0A%09%5Eself%20new%0A%09%09initializeWithCanvas%3A%20aCanvas%3B%0A%09%09yourself'),
-messageSends: ["initializeWithCanvas:", "yourself", "new"],
-referencedClasses: []
-}),
-smalltalk.CanvasBrush.klass);
-
-
 smalltalk.addMethod(
 '_appendToBrush_',
 smalltalk.method({
@@ -1535,6 +1341,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_append_", [smalltalk.send(self, "_asString", [])]);
 return self;},
+args: ["aTagBrush"],
 source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20append%3A%20self%20asString'),
 messageSends: ["append:", "asString"],
 referencedClasses: []
@@ -1550,6 +1357,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_appendBlock_", [self]);
 return self;},
+args: ["aTagBrush"],
 source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendBlock%3A%20self'),
 messageSends: ["appendBlock:"],
 referencedClasses: []
@@ -1565,6 +1373,7 @@ fn: function (aTagBrush){
 var self=this;
 smalltalk.send(aTagBrush, "_appendString_", [self]);
 return self;},
+args: ["aTagBrush"],
 source: unescape('appendToBrush%3A%20aTagBrush%0A%20%20%20%20aTagBrush%20appendString%3A%20self'),
 messageSends: ["appendString:"],
 referencedClasses: []

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 6 - 4
js/Compiler.deploy.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 120 - 13
js/Compiler.js


+ 51 - 1
js/Examples.js

@@ -9,6 +9,7 @@ var self=this;
 self['@count']=(($receiver = self['@count']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;},
+args: [],
 source: unescape('increase%0A%20%20%20%20count%20%3A%3D%20count%20+%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
 messageSends: [unescape("+"), "contents:", "with:", "asString"],
 referencedClasses: []
@@ -25,6 +26,7 @@ var self=this;
 self['@count']=(($receiver = self['@count']).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]);
 smalltalk.send(self['@header'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(self['@count'], "_asString", [])]);})]);
 return self;},
+args: [],
 source: unescape('decrease%0A%20%20%20%20count%20%3A%3D%20count%20-%201.%0A%20%20%20%20header%20contents%3A%20%5B%3Ahtml%20%7C%20html%20with%3A%20count%20asString%5D'),
 messageSends: [unescape("-"), "contents:", "with:", "asString"],
 referencedClasses: []
@@ -41,6 +43,7 @@ var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Widget);
 self['@count']=(0);
 return self;},
+args: [],
 source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20count%20%3A%3D%200'),
 messageSends: ["initialize"],
 referencedClasses: []
@@ -58,6 +61,7 @@ self['@header']=(function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(s
 (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;},
+args: ["html"],
 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: []
@@ -76,6 +80,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_class", []), "_width", []);
 return self;},
+args: [],
 source: unescape('width%0A%09%5Eself%20class%20width'),
 messageSends: ["width", "class"],
 referencedClasses: []
@@ -91,6 +96,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_class", []), "_height", []);
 return self;},
+args: [],
 source: unescape('height%0A%09%5Eself%20class%20height'),
 messageSends: ["height", "class"],
 referencedClasses: []
@@ -106,6 +112,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_class", []), "_squares", []);
 return self;},
+args: [],
 source: unescape('squares%0A%09%5Eself%20class%20squares'),
 messageSends: ["squares", "class"],
 referencedClasses: []
@@ -121,6 +128,7 @@ fn: function (aPiece){
 var self=this;
 smalltalk.send(aPiece, "_glueOn_", [self]);
 return self;},
+args: ["aPiece"],
 source: unescape('gluePiece%3A%20aPiece%0A%09aPiece%20glueOn%3A%20self'),
 messageSends: ["glueOn:"],
 referencedClasses: []
@@ -136,6 +144,7 @@ fn: function (){
 var self=this;
 return self['@rows'];
 return self;},
+args: [],
 source: unescape('rows%0A%09%22An%20array%20of%20rows.%20Each%20row%20is%20a%20collection%20of%20points.%22%0A%09%5Erows'),
 messageSends: [],
 referencedClasses: []
@@ -151,6 +160,7 @@ fn: function (aCollection){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_rows", []), "_add_", [aCollection]);
 return self;},
+args: ["aCollection"],
 source: unescape('addRow%3A%20aCollection%0A%09self%20rows%20add%3A%20aCollection'),
 messageSends: ["add:", "rows"],
 referencedClasses: []
@@ -168,6 +178,7 @@ smalltalk.send(self, "_newGame", []);
 (($receiver = self['@timer']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@timer'], "_clearInterval", []);})() : nil;
 self['@timer']=smalltalk.send((function(){return smalltalk.send(self, "_nextStep", []);}), "_valueWithInterval_", [self['@speed']]);
 return self;},
+args: [],
 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: []
@@ -185,6 +196,7 @@ var self=this;
 (($receiver = smalltalk.send(self['@movingPiece'], "_canMoveIn_", [self])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(self['@movingPiece'], "_position_", [(($receiver = smalltalk.send(self['@movingPiece'], "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send((0), "__at", [(1)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((0), "__at", [(1)])])]);})() : (function(){return smalltalk.send(self, "_newPiece", []);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return smalltalk.send(self['@movingPiece'], "_position_", [(($receiver = smalltalk.send(self['@movingPiece'], "_position", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send((0), "__at", [(1)]) : smalltalk.send($receiver, "__plus", [smalltalk.send((0), "__at", [(1)])])]);}), (function(){return smalltalk.send(self, "_newPiece", []);})]);
 smalltalk.send(self, "_redraw", []);
 return self;},
+args: [],
 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: []
@@ -201,6 +213,7 @@ var self=this;
 smalltalk.send(self['@renderingContext'], "_clearRectFrom_to_", [smalltalk.send((0), "__at", [smalltalk.send(self, "_width", [])]), smalltalk.send((0), "__at", [smalltalk.send(self, "_height", [])])]);
 (function($rec){smalltalk.send($rec, "_drawMap", []);return smalltalk.send($rec, "_drawPiece", []);})(self);
 return self;},
+args: [],
 source: unescape('redraw%0A%09renderingContext%20clearRectFrom%3A%200@%20self%20width%20to%3A%200@%20self%20height.%0A%09self%20%0A%09%09drawMap%3B%0A%09%09drawPiece'),
 messageSends: ["clearRectFrom:to:", unescape("@"), "width", "height", "drawMap", "drawPiece"],
 referencedClasses: []
@@ -221,6 +234,7 @@ x=(($receiver = each).klass === smalltalk.Number) ? $receiver *smalltalk.send(sm
 smalltalk.send((0), "_to_do_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_squares", []), "_y", []), (function(each){var y=nil;
 y=(($receiver = each).klass === smalltalk.Number) ? $receiver *smalltalk.send(smalltalk.send(self, "_class", []), "_squareSize", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(self, "_class", []), "_squareSize", [])]);return smalltalk.send(self, "_drawLineFrom_to_", [smalltalk.send((0), "__at", [y]), smalltalk.send(smalltalk.send(self, "_width", []), "__at", [y])]);})]);
 return self;},
+args: [],
 source: unescape('drawMap%0A%09renderingContext%20%0A%09%09fillStyle%3A%20%27%23fafafa%27%3B%0A%09%09fillRectFrom%3A%200@0%20to%3A%20self%20width@self%20height.%0A%09renderingContext%20%0A%09%09lineWidth%3A%200.5%3B%0A%09%09strokeStyle%3A%20%27%23999%27.%0A%090%20to%3A%20self%20class%20squares%20x%20do%3A%20%5B%3Aeach%20%7C%20%7C%20x%20%7C%0A%09%09x%20%3A%3D%20each%20*%20self%20class%20squareSize.%0A%09%09self%20drawLineFrom%3A%20x@0%20to%3A%20x@self%20height%5D.%0A%090%20to%3A%20self%20class%20squares%20y%20do%3A%20%5B%3Aeach%20%7C%20%7C%20y%20%7C%0A%09%09y%20%3A%3D%20each%20*%20self%20class%20squareSize.%0A%09%09self%20drawLineFrom%3A%200@y%20to%3A%20self%20width@y%5D.'),
 messageSends: ["fillStyle:", "fillRectFrom:to:", unescape("@"), "width", "height", "lineWidth:", "strokeStyle:", "to:do:", "x", "squares", "class", unescape("*"), "squareSize", "drawLineFrom:to:", "y"],
 referencedClasses: []
@@ -236,6 +250,7 @@ fn: function (aPoint, anotherPoint){
 var self=this;
 (function($rec){smalltalk.send($rec, "_beginPath", []);smalltalk.send($rec, "_moveTo_", [aPoint]);smalltalk.send($rec, "_lineTo_", [anotherPoint]);return smalltalk.send($rec, "_stroke", []);})(self['@renderingContext']);
 return self;},
+args: ["aPoint", "anotherPoint"],
 source: unescape('drawLineFrom%3A%20aPoint%20to%3A%20anotherPoint%0A%09renderingContext%20%0A%09%09beginPath%3B%0A%09%09moveTo%3A%20aPoint%3B%0A%09%09lineTo%3A%20anotherPoint%3B%0A%09%09stroke'),
 messageSends: ["beginPath", "moveTo:", "lineTo:", "stroke"],
 referencedClasses: []
@@ -254,6 +269,7 @@ self['@movingPiece']=nil;
 self['@speed']=(200);
 self['@score']=(0);
 return self;},
+args: [],
 source: unescape('newGame%0A%09rows%20%3A%3D%20%23%28%29.%0A%09movingPiece%20%3A%3D%20nil.%0A%09speed%20%3A%3D%20200.%0A%09score%20%3A%3D%200'),
 messageSends: [],
 referencedClasses: []
@@ -269,9 +285,10 @@ fn: function (){
 var self=this;
 self['@movingPiece']=smalltalk.send((smalltalk.TetrisPiece || TetrisPiece), "_atRandom", []);
 return self;},
+args: [],
 source: unescape('newPiece%0A%09movingPiece%20%3A%3D%20TetrisPiece%20atRandom'),
 messageSends: ["atRandom"],
-referencedClasses: []
+referencedClasses: [smalltalk.TetrisPiece]
 }),
 smalltalk.Tetris);
 
@@ -285,6 +302,7 @@ var self=this;
 smalltalk.send(smalltalk.send(self, "_rows", []), "_do_", [(function(each){return nil;})]);
 (($receiver = self['@movingPiece']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@movingPiece'], "_drawOn_", [self['@renderingContext']]);})() : nil;
 return self;},
+args: [],
 source: unescape('drawRows%0A%09self%20rows%20do%3A%20%5B%3Aeach%20%7C%5D.%0A%09movingPiece%20ifNotNil%3A%20%5BmovingPiece%20drawOn%3A%20renderingContext%5D'),
 messageSends: ["do:", "rows", "ifNotNil:", "drawOn:"],
 referencedClasses: []
@@ -300,6 +318,7 @@ fn: function (){
 var self=this;
 (($receiver = self['@movingPiece']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@movingPiece'], "_drawOn_", [self['@renderingContext']]);})() : nil;
 return self;},
+args: [],
 source: unescape('drawPiece%0A%09movingPiece%20ifNotNil%3A%20%5B%0A%09%09movingPiece%20drawOn%3A%20renderingContext%5D'),
 messageSends: ["ifNotNil:", "drawOn:"],
 referencedClasses: []
@@ -316,6 +335,7 @@ var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Widget);
 smalltalk.send(self, "_newGame", []);
 return self;},
+args: [],
 source: unescape('initialize%0A%09super%20initialize.%0A%09self%20newGame'),
 messageSends: ["initialize", "newGame"],
 referencedClasses: []
@@ -331,6 +351,7 @@ 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", []));
 return self;},
+args: ["html"],
 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: []
@@ -351,6 +372,7 @@ smalltalk.send(canvas, "_at_put_", ["height", smalltalk.send(smalltalk.send(self
 self['@renderingContext']=smalltalk.send((smalltalk.CanvasRenderingContext || CanvasRenderingContext), "_tagBrush_", [canvas]);
 smalltalk.send(self, "_redraw", []);
 return self;},
+args: ["html"],
 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]
@@ -366,6 +388,7 @@ 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;},
+args: ["html"],
 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: []
@@ -382,6 +405,7 @@ fn: function (){
 var self=this;
 return (22);
 return self;},
+args: [],
 source: unescape('squareSize%0A%09%5E22'),
 messageSends: [],
 referencedClasses: []
@@ -397,6 +421,7 @@ fn: function (){
 var self=this;
 return (($receiver = smalltalk.send(self, "_squareSize", [])).klass === smalltalk.Number) ? $receiver *smalltalk.send(smalltalk.send(self, "_squares", []), "_x", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(self, "_squares", []), "_x", [])]);
 return self;},
+args: [],
 source: unescape('width%0A%09%5Eself%20squareSize%20*%20%28self%20squares%20x%29'),
 messageSends: [unescape("*"), "squareSize", "x", "squares"],
 referencedClasses: []
@@ -412,6 +437,7 @@ fn: function (){
 var self=this;
 return (($receiver = smalltalk.send(self, "_squareSize", [])).klass === smalltalk.Number) ? $receiver *smalltalk.send(smalltalk.send(self, "_squares", []), "_y", []) : smalltalk.send($receiver, "__star", [smalltalk.send(smalltalk.send(self, "_squares", []), "_y", [])]);
 return self;},
+args: [],
 source: unescape('height%0A%09%5Eself%20squareSize%20*%20%28self%20squares%20y%29'),
 messageSends: [unescape("*"), "squareSize", "y", "squares"],
 referencedClasses: []
@@ -427,6 +453,7 @@ fn: function (){
 var self=this;
 return smalltalk.send((10), "__at", [(15)]);
 return self;},
+args: [],
 source: unescape('squares%0A%09%5E10@15'),
 messageSends: [unescape("@")],
 referencedClasses: []
@@ -444,6 +471,7 @@ fn: function (){
 var self=this;
 return (($receiver = self['@rotation']) == nil || $receiver == undefined) ? (function(){return self['@rotation']=(1);})() : $receiver;
 return self;},
+args: [],
 source: unescape('rotation%0A%09%5Erotation%20ifNil%3A%20%5Brotation%20%3A%3D%201%5D'),
 messageSends: ["ifNil:"],
 referencedClasses: []
@@ -459,6 +487,7 @@ fn: function (aNumber){
 var self=this;
 self['@rotation']=aNumber;
 return self;},
+args: ["aNumber"],
 source: unescape('rotation%3A%20aNumber%0A%09rotation%20%3A%3D%20aNumber'),
 messageSends: [],
 referencedClasses: []
@@ -474,6 +503,7 @@ fn: function (){
 var self=this;
 return (($receiver = self['@position']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((($receiver = (($receiver = smalltalk.send(smalltalk.send((smalltalk.Tetris || Tetris), "_squares", []), "_x", [])).klass === smalltalk.Number) ? $receiver /(2) : smalltalk.send($receiver, "__slash", [(2)])).klass === smalltalk.Number) ? $receiver -(1) : smalltalk.send($receiver, "__minus", [(1)]), "__at", [(0)]);})() : $receiver;
 return self;},
+args: [],
 source: unescape('position%0A%09%5Eposition%20ifNil%3A%20%5B%28Tetris%20squares%20x%20/%202%29%20-1%20@%200%5D'),
 messageSends: ["ifNil:", unescape("@"), unescape("-"), unescape("/"), "x", "squares"],
 referencedClasses: [smalltalk.Tetris]
@@ -489,6 +519,7 @@ fn: function (aPoint){
 var self=this;
 return self['@position']=aPoint;
 return self;},
+args: ["aPoint"],
 source: unescape('position%3A%20aPoint%0A%09%5Eposition%20%3A%3D%20aPoint'),
 messageSends: [],
 referencedClasses: []
@@ -504,6 +535,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_subclassResponsibility", []);
 return self;},
+args: [],
 source: unescape('bounds%0A%09self%20subclassResponsibility'),
 messageSends: ["subclassResponsibility"],
 referencedClasses: []
@@ -519,6 +551,7 @@ fn: function (){
 var self=this;
 return unescape("%23afa");
 return self;},
+args: [],
 source: unescape('color%0A%09%5E%27%23afa%27'),
 messageSends: [],
 referencedClasses: []
@@ -534,6 +567,7 @@ fn: function (){
 var self=this;
 return (2);
 return self;},
+args: [],
 source: unescape('height%0A%09%5E2'),
 messageSends: [],
 referencedClasses: []
@@ -550,6 +584,7 @@ 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_", [(($receiver = (($receiver = each).klass === smalltalk.Number) ? $receiver +smalltalk.send(self, "_position", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(self, "_position", [])])).klass === smalltalk.Number) ? $receiver *smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", []) : smalltalk.send($receiver, "__star", [smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", [])]), (($receiver = smalltalk.send((1), "__at", [(1)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", []) : smalltalk.send($receiver, "__star", [smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", [])])]);smalltalk.send($rec, "_strokeStyle_", [unescape("%23999")]);smalltalk.send($rec, "_lineWidth_", [(2)]);return smalltalk.send($rec, "_strokeRectFrom_to_", [(($receiver = (($receiver = each).klass === smalltalk.Number) ? $receiver +smalltalk.send(self, "_position", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(self, "_position", [])])).klass === smalltalk.Number) ? $receiver *smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", []) : smalltalk.send($receiver, "__star", [smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", [])]), (($receiver = smalltalk.send((1), "__at", [(1)])).klass === smalltalk.Number) ? $receiver *smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", []) : smalltalk.send($receiver, "__star", [smalltalk.send((smalltalk.Tetris || Tetris), "_squareSize", [])])]);})(aRenderingContext);})]);
 return self;},
+args: ["aRenderingContext"],
 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]
@@ -565,6 +600,7 @@ fn: function (){
 var self=this;
 return (($receiver = smalltalk.send(smalltalk.send(self, "_position", []), "_y", [])).klass === smalltalk.Number) ? $receiver <(($receiver = smalltalk.send(smalltalk.send((smalltalk.Tetris || Tetris), "_squares", []), "_y", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(self, "_height", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(self, "_height", [])]) : smalltalk.send($receiver, "__lt", [(($receiver = smalltalk.send(smalltalk.send((smalltalk.Tetris || Tetris), "_squares", []), "_y", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(self, "_height", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(self, "_height", [])])]);
 return self;},
+args: [],
 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]
@@ -580,6 +616,7 @@ fn: function (aTetris){
 var self=this;
 return (($receiver = smalltalk.send(smalltalk.send(self, "_position", []), "_y", [])).klass === smalltalk.Number) ? $receiver <(($receiver = smalltalk.send(smalltalk.send(aTetris, "_squares", []), "_y", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(self, "_height", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(self, "_height", [])]) : smalltalk.send($receiver, "__lt", [(($receiver = smalltalk.send(smalltalk.send(aTetris, "_squares", []), "_y", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(self, "_height", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(self, "_height", [])])]);
 return self;},
+args: ["aTetris"],
 source: unescape('canMoveIn%3A%20aTetris%0A%09%5Eself%20position%20y%20%3C%20%28aTetris%20squares%20y%20-%20self%20height%29'),
 messageSends: [unescape("%3C"), "y", "position", unescape("-"), "squares", "height"],
 referencedClasses: []
@@ -596,6 +633,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(smalltalk.send(self, "_subclasses", []), "_at_", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_subclasses", []), "_size", []), "_atRandom", [])]), "_new", []);
 return self;},
+args: [],
 source: unescape('atRandom%0A%09%5E%28self%20subclasses%20at%3A%20self%20subclasses%20size%20atRandom%29%20new'),
 messageSends: ["new", "at:", "subclasses", "atRandom", "size"],
 referencedClasses: []
@@ -613,6 +651,7 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(1)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(1)])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_new", []));
 return self;},
+args: [],
 source: unescape('bounds%0A%09%5EArray%20new%0A%09%09add%3A%200@0%3B%0A%09%09add%3A%200@1%3B%0A%09%09add%3A%201@0%3B%0A%09%09add%3A%201@1%3B%0A%09%09yourself'),
 messageSends: ["add:", unescape("@"), "yourself", "new"],
 referencedClasses: [smalltalk.Array]
@@ -631,6 +670,7 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(1)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(2)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(2)])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_new", []));
 return self;},
+args: [],
 source: unescape('bounds%0A%09%5EArray%20new%0A%09%09add%3A%200@0%3B%0A%09%09add%3A%200@1%3B%0A%09%09add%3A%200@2%3B%0A%09%09add%3A%201@2%3B%0A%09%09yourself'),
 messageSends: ["add:", unescape("@"), "yourself", "new"],
 referencedClasses: [smalltalk.Array]
@@ -646,6 +686,7 @@ fn: function (){
 var self=this;
 return unescape("%23ffa");
 return self;},
+args: [],
 source: unescape('color%0A%09%5E%27%23ffa%27'),
 messageSends: [],
 referencedClasses: []
@@ -661,6 +702,7 @@ fn: function (){
 var self=this;
 return (3);
 return self;},
+args: [],
 source: unescape('height%0A%09%5E3'),
 messageSends: [],
 referencedClasses: []
@@ -679,6 +721,7 @@ fn: function (){
 var self=this;
 return unescape("%23aaf");
 return self;},
+args: [],
 source: unescape('color%0A%09%5E%27%23aaf%27'),
 messageSends: [],
 referencedClasses: []
@@ -694,6 +737,7 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(1)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(2)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(2)])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_new", []));
 return self;},
+args: [],
 source: unescape('bounds%0A%09%5EArray%20new%0A%09%09add%3A%201@0%3B%0A%09%09add%3A%201@1%3B%0A%09%09add%3A%201@2%3B%0A%09%09add%3A%200@2%3B%0A%09%09yourself'),
 messageSends: ["add:", unescape("@"), "yourself", "new"],
 referencedClasses: [smalltalk.Array]
@@ -709,6 +753,7 @@ fn: function (){
 var self=this;
 return (3);
 return self;},
+args: [],
 source: unescape('height%0A%09%5E3'),
 messageSends: [],
 referencedClasses: []
@@ -727,6 +772,7 @@ fn: function (){
 var self=this;
 return unescape("%23faa");
 return self;},
+args: [],
 source: unescape('color%0A%09%5E%27%23faa%27'),
 messageSends: [],
 referencedClasses: []
@@ -742,6 +788,7 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(1)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(2)])]);smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(3)])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_new", []));
 return self;},
+args: [],
 source: unescape('bounds%0A%09%5EArray%20new%0A%09%09add%3A%200@0%3B%0A%09%09add%3A%200@1%3B%0A%09%09add%3A%200@2%3B%0A%09%09add%3A%200@3%3B%0A%09%09yourself'),
 messageSends: ["add:", unescape("@"), "yourself", "new"],
 referencedClasses: [smalltalk.Array]
@@ -757,6 +804,7 @@ fn: function (){
 var self=this;
 return (4);
 return self;},
+args: [],
 source: unescape('height%0A%09%5E4'),
 messageSends: [],
 referencedClasses: []
@@ -775,6 +823,7 @@ fn: function (){
 var self=this;
 return (function($rec){smalltalk.send($rec, "_add_", [smalltalk.send((0), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((2), "__at", [(0)])]);smalltalk.send($rec, "_add_", [smalltalk.send((1), "__at", [(1)])]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.Array || Array), "_new", []));
 return self;},
+args: [],
 source: unescape('bounds%0A%09%5EArray%20new%0A%09%09add%3A%200@0%3B%0A%09%09add%3A%201@0%3B%0A%09%09add%3A%202@0%3B%0A%09%09add%3A%201@1%3B%0A%09%09yourself'),
 messageSends: ["add:", unescape("@"), "yourself", "new"],
 referencedClasses: [smalltalk.Array]
@@ -790,6 +839,7 @@ fn: function (){
 var self=this;
 return unescape("%23aaf");
 return self;},
+args: [],
 source: unescape('color%0A%09%5E%27%23aaf%27'),
 messageSends: [],
 referencedClasses: []

+ 316 - 60
js/IDE.deploy.js

@@ -204,7 +204,7 @@ var self=this;
 var li=nil;
 li=smalltalk.send(html, "_li", []);
 (($receiver = smalltalk.send(self['@selectedTab'], "__eq", [aWidget])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);
-smalltalk.send(li, "_with_", [(function(){(($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]);return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(aWidget, "_label", [])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]);
+smalltalk.send(li, "_with_", [(function(){(($receiver = smalltalk.send(aWidget, "_canBeClosed", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function($rec){smalltalk.send($rec, "_class_", ["close"]);smalltalk.send($rec, "_with_", ["x"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_closeTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]);return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(self, "_labelFor_", [aWidget])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectTab_", [aWidget]);})]);})(smalltalk.send(html, "_span", []));})]);
 return self;}
 }),
 smalltalk.TabManager);
@@ -231,6 +231,22 @@ return self;}
 }),
 smalltalk.TabManager);
 
+smalltalk.addMethod(
+'_labelFor_',
+smalltalk.method({
+selector: 'labelFor:',
+fn: function (aWidget){
+var self=this;
+var label=nil;
+var maxSize=nil;
+maxSize=(15);
+label=smalltalk.send(smalltalk.send(aWidget, "_label", []), "_copyFrom_to_", [(0), smalltalk.send(smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", []), "_min_", [maxSize])]);
+(($receiver = (($receiver = smalltalk.send(smalltalk.send(aWidget, "_label", []), "_size", [])).klass === smalltalk.Number) ? $receiver >maxSize : smalltalk.send($receiver, "__gt", [maxSize])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return label=smalltalk.send(label, "__comma", ["..."]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return label=smalltalk.send(label, "__comma", ["..."]);})]);
+return label;
+return self;}
+}),
+smalltalk.TabManager);
+
 
 smalltalk.TabManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
@@ -380,6 +396,17 @@ return self;}
 }),
 smalltalk.TabWidget);
 
+smalltalk.addMethod(
+'_close',
+smalltalk.method({
+selector: 'close',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send((smalltalk.TabManager || TabManager), "_current", []), "_closeTab_", [self]);
+return self;}
+}),
+smalltalk.TabWidget);
+
 
 smalltalk.addMethod(
 '_open',
@@ -1332,7 +1359,7 @@ return self;}
 smalltalk.Browser.klass);
 
 
-smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'workspaceTextarea', 'diveButton'], 'IDE');
+smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'diveButton', 'sourceArea'], 'IDE');
 smalltalk.addMethod(
 '_label',
 smalltalk.method({
@@ -1451,7 +1478,8 @@ smalltalk.method({
 selector: 'renderTopPanelOn:',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]);self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", []));(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_class_", ["top"]);return smalltalk.send($rec, "_with_", [(function(){self['@variablesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column variables"]);self['@valueTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["jt_column value"]);return smalltalk.send($rec, "_at_put_", ["readonly", "readonly"]);})(smalltalk.send(html, "_textarea", []));(function($rec){smalltalk.send($rec, "_class_", ["jt_buttons inspector"]);return smalltalk.send($rec, "_with_", [(function(){(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector refresh"]);smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));return self['@diveButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button inspector dive"]);smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", []));})]);})(smalltalk.send(html, "_div", []));return smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_clear"]);})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateValueTextarea", []);})(self);
 return self;}
 }),
 smalltalk.Inspector);
@@ -1462,7 +1490,7 @@ smalltalk.method({
 selector: 'renderBottomPanelOn:',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){self['@workspaceTextarea']=(function($rec){smalltalk.send($rec, "_class_", ["source"]);return smalltalk.send($rec, "_at_put_", ["spellcheck", "false"]);})(smalltalk.send(html, "_textarea", []));return smalltalk.send(smalltalk.send(self['@workspaceTextarea'], "_asJQuery", []), "_call_", ["tabby"]);})]);})(smalltalk.send(html, "_div", []));
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){self['@sourceArea']=(function($rec){smalltalk.send($rec, "_receiver_", [self['@object']]);smalltalk.send($rec, "_onDoIt_", [(function(){return smalltalk.send(self, "_refresh", []);})]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []));return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
 return self;}
 }),
 smalltalk.Inspector);
@@ -1473,8 +1501,9 @@ smalltalk.method({
 selector: 'renderButtonsOn:',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_with_", ["Refresh"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_refresh", []);})]);})(smalltalk.send(html, "_button", []));
-self['@diveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Dive"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_dive", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_sourceArea", []), "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
 smalltalk.send(self, "_updateButtons", []);
 return self;}
 }),
@@ -1537,6 +1566,17 @@ return self;}
 }),
 smalltalk.Inspector);
 
+smalltalk.addMethod(
+'_sourceArea',
+smalltalk.method({
+selector: 'sourceArea',
+fn: function (){
+var self=this;
+return self['@sourceArea'];
+return self;}
+}),
+smalltalk.Inspector);
+
 
 smalltalk.addMethod(
 '_on_',
@@ -1820,7 +1860,7 @@ return self;}
 smalltalk.ReferencesBrowser.klass);
 
 
-smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div'], 'IDE');
+smalltalk.addClass('SourceArea', smalltalk.Widget, ['editor', 'div', 'receiver', 'onDoIt'], 'IDE');
 smalltalk.addMethod(
 '_val',
 smalltalk.method({
@@ -1955,8 +1995,11 @@ selector: 'doIt',
 fn: function (){
 var self=this;
 var selection=nil;
+var result=nil;
 (($receiver = smalltalk.send(self['@editor'], "_somethingSelected", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return selection=smalltalk.send(self, "_currentLine", []);})() : (function(){return selection=smalltalk.send(self, "_selection", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return selection=smalltalk.send(self, "_currentLine", []);}), (function(){return selection=smalltalk.send(self, "_selection", []);})]);
-return smalltalk.send(self, "_eval_", [selection]);
+result=smalltalk.send(self, "_eval_", [selection]);
+(($receiver = smalltalk.send(self, "_onDoIt", [])) != nil && $receiver != undefined) ? (function(){return smalltalk.send(smalltalk.send(self, "_onDoIt", []), "_value", []);})() : nil;
+return result;
 return self;}
 }),
 smalltalk.SourceArea);
@@ -1968,11 +2011,9 @@ selector: 'eval:',
 fn: function (aString){
 var self=this;
 try{var compiler=nil;
-var node=nil;
 compiler=smalltalk.send((smalltalk.Compiler || Compiler), "_new", []);
-node=smalltalk.send(compiler, "_parseExpression_", [aString]);
-(($receiver = smalltalk.send(node, "_isParseFailure", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(self, "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send(node, "_reason", []), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(node, "_position", [])])])}})})();})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(self, "_alert_", [smalltalk.send(smalltalk.send(smalltalk.send(node, "_reason", []), "__comma", [unescape("%2C%20position%3A%20")]), "__comma", [smalltalk.send(node, "_position", [])])])}})})();})]);
-(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(compiler, "_loadExpression_", [aString])}})})();
+smalltalk.send((function(){return smalltalk.send(compiler, "_parseExpression_", [aString]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(self, "_alert_", [smalltalk.send(ex, "_messageText", [])])}})})();})]);
+(function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return smalltalk.send(smalltalk.send(smalltalk.send(compiler, "_load_forClass_", [smalltalk.send(smalltalk.send(unescape("doIt%20%5E%5B"), "__comma", [aString]), "__comma", [unescape("%5D%20value")]), (smalltalk.DoIt || DoIt)]), "_fn", []), "_applyTo_arguments_", [smalltalk.send(self, "_receiver", []), []])}})})();
 return self;
 } catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}}
 }),
@@ -2085,6 +2126,50 @@ return self;}
 }),
 smalltalk.SourceArea);
 
+smalltalk.addMethod(
+'_receiver',
+smalltalk.method({
+selector: 'receiver',
+fn: function (){
+var self=this;
+return (($receiver = self['@receiver']) == nil || $receiver == undefined) ? (function(){return smalltalk.send((smalltalk.DoIt || DoIt), "_new", []);})() : $receiver;
+return self;}
+}),
+smalltalk.SourceArea);
+
+smalltalk.addMethod(
+'_receiver_',
+smalltalk.method({
+selector: 'receiver:',
+fn: function (anObject){
+var self=this;
+self['@receiver']=anObject;
+return self;}
+}),
+smalltalk.SourceArea);
+
+smalltalk.addMethod(
+'_onDoIt_',
+smalltalk.method({
+selector: 'onDoIt:',
+fn: function (aBlock){
+var self=this;
+self['@onDoIt']=aBlock;
+return self;}
+}),
+smalltalk.SourceArea);
+
+smalltalk.addMethod(
+'_onDoIt',
+smalltalk.method({
+selector: 'onDoIt',
+fn: function (){
+var self=this;
+return self['@onDoIt'];
+return self;}
+}),
+smalltalk.SourceArea);
+
 
 
 smalltalk.addClass('ClassesList', smalltalk.Widget, ['browser', 'ul', 'nodes'], 'IDE');
@@ -2314,10 +2399,13 @@ selector: 'renderOn:',
 fn: function (html){
 var self=this;
 var li=nil;
+var cssClass=nil;
+cssClass="";
 li=smalltalk.send(smalltalk.send(html, "_li", []), "_onClick_", [(function(){return smalltalk.send(smalltalk.send(self, "_browser", []), "_selectClass_", [smalltalk.send(self, "_theClass", [])]);})]);
 smalltalk.send(smalltalk.send(li, "_asJQuery", []), "_contents_", [smalltalk.send(self, "_label", [])]);
-(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);
-(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(li, "_class_", ["commented"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(li, "_class_", ["commented"]);})]);
+(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_browser", []), "_selectedClass", []), "__eq", [smalltalk.send(self, "_theClass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return cssClass=smalltalk.send(cssClass, "__comma", [" selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return cssClass=smalltalk.send(cssClass, "__comma", [" selected"]);})]);
+(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_theClass", []), "_comment", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return cssClass=smalltalk.send(cssClass, "__comma", [" commented"]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return cssClass=smalltalk.send(cssClass, "__comma", [" commented"]);})]);
+smalltalk.send(li, "_class_", [cssClass]);
 smalltalk.send(smalltalk.send(self, "_nodes", []), "_do_", [(function(each){return smalltalk.send(each, "_renderOn_", [html]);})]);
 return self;}
 }),
@@ -2336,7 +2424,7 @@ return self;}
 smalltalk.ClassesListNode.klass);
 
 
-smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul'], 'IDE');
+smalltalk.addClass('Debugger', smalltalk.TabWidget, ['error', 'selectedContext', 'sourceArea', 'ul', 'ul2', 'inspector', 'saveButton', 'unsavedChanges', 'selectedVariable', 'selectedVariableName', 'inspectButton'], 'IDE');
 smalltalk.addMethod(
 '_error',
 smalltalk.method({
@@ -2377,19 +2465,9 @@ selector: 'selectContext:',
 fn: function (aContext){
 var self=this;
 self['@selectedContext']=aContext;
-smalltalk.send(self, "_updateContextsList", []);
-smalltalk.send(self, "_updateSourceArea", []);
-return self;}
-}),
-smalltalk.Debugger);
-
-smalltalk.addMethod(
-'_renderBoxOn_',
-smalltalk.method({
-selector: 'renderBoxOn:',
-fn: function (html){
-var self=this;
-(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+self['@selectedVariable']=nil;
+self['@selectedVariableName']=nil;
+(function($rec){smalltalk.send($rec, "_updateContextsList", []);smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateInspector", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateStatus", []);})(self);
 return self;}
 }),
 smalltalk.Debugger);
@@ -2427,8 +2505,10 @@ smalltalk.method({
 selector: 'renderBottomPanelOn:',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode"]);return smalltalk.send($rec, "_with_", [(function(){self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []);return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
-smalltalk.send(self, "_updateSourceArea", []);
+(function($rec){smalltalk.send($rec, "_class_", ["jt_sourceCode debugger"]);return smalltalk.send($rec, "_with_", [(function(){self['@sourceArea']=smalltalk.send((smalltalk.SourceArea || SourceArea), "_new", []);return smalltalk.send(self['@sourceArea'], "_renderOn_", [html]);})]);})(smalltalk.send(html, "_div", []));
+self['@ul2']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column debugger variables"]);
+self['@inspector']=smalltalk.send(smalltalk.send(html, "_div", []), "_class_", ["jt_column debugger inspector"]);
+smalltalk.send(self['@sourceArea'], "_onKeyUp_", [(function(){return smalltalk.send(self, "_updateStatus", []);})]);
 return self;}
 }),
 smalltalk.Debugger);
@@ -2461,7 +2541,180 @@ smalltalk.method({
 selector: 'updateSourceArea',
 fn: function (){
 var self=this;
-smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_source", [])]);
+smalltalk.send(self['@sourceArea'], "_val_", [smalltalk.send(self, "_source", [])]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_renderButtonsOn_',
+smalltalk.method({
+selector: 'renderButtonsOn:',
+fn: function (html){
+var self=this;
+self['@saveButton']=(function($rec){smalltalk.send($rec, "_with_", ["Save"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_save", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["DoIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_doIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["PrintIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_printIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["InspectIt"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self['@sourceArea'], "_inspectIt", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Proceed"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_proceed", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Abandon"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_close", []);})]);})(smalltalk.send(html, "_button", []));
+self['@inspectButton']=(function($rec){smalltalk.send($rec, "_class_", ["jt_button debugger inspect"]);smalltalk.send($rec, "_with_", ["Inspect"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_inspectSelectedVariable", []);})]);})(smalltalk.send(html, "_button", []));
+(function($rec){smalltalk.send($rec, "_updateSourceArea", []);smalltalk.send($rec, "_updateStatus", []);smalltalk.send($rec, "_updateVariablesList", []);return smalltalk.send($rec, "_updateInspector", []);})(self);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_proceed',
+smalltalk.method({
+selector: 'proceed',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_close", []);
+smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_perform_withArguments_", [smalltalk.send(self['@selectedContext'], "_selector", []), smalltalk.send(self['@selectedContext'], "_temps", [])]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_save',
+smalltalk.method({
+selector: 'save',
+fn: function (){
+var self=this;
+var protocol=nil;
+protocol=smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodDictionary", []), "_at_", [smalltalk.send(self['@selectedContext'], "_selector", [])]), "_category", []);
+smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_compile_category_", [smalltalk.send(self['@sourceArea'], "_val", []), protocol]);
+smalltalk.send(self, "_updateStatus", []);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_updateStatus',
+smalltalk.method({
+selector: 'updateStatus',
+fn: function (){
+var self=this;
+(($receiver = smalltalk.send(smalltalk.send(self['@sourceArea'], "_val", []), "__eq", [smalltalk.send(self, "_source", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return self['@unsavedChanges']=false;})() : (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return self['@unsavedChanges']=true;})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_at_put_", ["disabled", true]);})() : nil;return self['@unsavedChanges']=false;}), (function(){(($receiver = self['@saveButton']) != nil && $receiver != undefined) ? (function(){return smalltalk.send(self['@saveButton'], "_removeAt_", ["disabled"]);})() : nil;return self['@unsavedChanges']=true;})]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.TabWidget);
+smalltalk.send(self['@unsavedChanges'], "__eq", [false]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_source',
+smalltalk.method({
+selector: 'source',
+fn: function (){
+var self=this;
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return unescape("Method%20doesn%27t%20exist%21");})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_source", []);})();
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_updateInspector',
+smalltalk.method({
+selector: 'updateInspector',
+fn: function (){
+var self=this;
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return nil;})]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_renderBoxOn_',
+smalltalk.method({
+selector: 'renderBoxOn:',
+fn: function (html){
+var self=this;
+(function($rec){smalltalk.send($rec, "_renderTopPanelOn_", [html]);return smalltalk.send($rec, "_renderBottomPanelOn_", [html]);})(self);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_updateVariablesList',
+smalltalk.method({
+selector: 'updateVariablesList',
+fn: function (){
+var self=this;
+smalltalk.send(self['@ul2'], "_contents_", [(function(html){var li=nil;
+li=(function($rec){smalltalk.send($rec, "_with_", ["self"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [smalltalk.send(self, "_receiver", []), "self"]);})]);})(smalltalk.send(html, "_li", []));(($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", ["self"])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);smalltalk.send(smalltalk.send(self, "_arguments", []), "_withIndexDo_", [(function(each, index){var param=nil;
+param=smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_at_", [index]);li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [param, each]);})]);})(smalltalk.send(html, "_li", []));return (($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);})]);return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_receiver", []), "_class", []), "_allInstanceVariableNames", []), "_do_", [(function(each){var ivar=nil;
+ivar=smalltalk.send(smalltalk.send(self, "_receiver", []), "_instVarAt_", [each]);li=(function($rec){smalltalk.send($rec, "_with_", [each]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_selectVariable_named_", [ivar, each]);})]);})(smalltalk.send(html, "_li", []));return (($receiver = smalltalk.send(self['@selectedVariableName'], "__eq", [each])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(li, "_class_", ["selected"]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(li, "_class_", ["selected"]);})]);})]);})]);
+(($receiver = self['@selectedVariable']) == nil || $receiver == undefined) ? (function(){return smalltalk.send(self['@inspectButton'], "_at_put_", ["disabled", true]);})() : (function(){return smalltalk.send(self['@inspectButton'], "_removeAt_", ["disabled"]);})();
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_selectVariable_named_',
+smalltalk.method({
+selector: 'selectVariable:named:',
+fn: function (anObject, aString){
+var self=this;
+self['@selectedVariable']=anObject;
+self['@selectedVariableName']=aString;
+smalltalk.send(self['@inspector'], "_contents_", [(function(html){return smalltalk.send(html, "_with_", [smalltalk.send(anObject, "_printString", [])]);})]);
+smalltalk.send(self, "_updateVariablesList", []);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_method',
+smalltalk.method({
+selector: 'method',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(self['@selectedContext'], "_receiver", []), "_class", []), "_methodAt_", [smalltalk.send(self['@selectedContext'], "_selector", [])]);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_arguments',
+smalltalk.method({
+selector: 'arguments',
+fn: function (){
+var self=this;
+return (($receiver = smalltalk.send(self, "_method", [])) == nil || $receiver == undefined) ? (function(){return smalltalk.send(smalltalk.send(self['@selectedContext'], "_temps", []), "_collect_", [(function(each){return nil;})]);})() : (function(){return smalltalk.send(smalltalk.send(self, "_method", []), "_arguments", []);})();
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_receiver',
+smalltalk.method({
+selector: 'receiver',
+fn: function (){
+var self=this;
+return smalltalk.send(self['@selectedContext'], "_receiver", []);
+return self;}
+}),
+smalltalk.Debugger);
+
+smalltalk.addMethod(
+'_inspectSelectedVariable',
+smalltalk.method({
+selector: 'inspectSelectedVariable',
+fn: function (){
+var self=this;
+smalltalk.send(self['@selectedVariable'], "_inspect", []);
 return self;}
 }),
 smalltalk.Debugger);
@@ -2560,7 +2813,7 @@ smalltalk.method({
 selector: 'label',
 fn: function (){
 var self=this;
-return unescape("%5BTest%20runner%5D");
+return unescape("%5BSUnit%5D");
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2634,17 +2887,6 @@ return self;}
 }),
 smalltalk.TestRunner);
 
-smalltalk.addMethod(
-'_selectedMethods',
-smalltalk.method({
-selector: 'selectedMethods',
-fn: function (){
-var self=this;
-return (($receiver = self['@selectedMethods']) == nil || $receiver == undefined) ? (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"]);})]);})]);})() : $receiver;
-return self;}
-}),
-smalltalk.TestRunner);
-
 smalltalk.addMethod(
 '_statusInfo',
 smalltalk.method({
@@ -2667,17 +2909,6 @@ return self;}
 }),
 smalltalk.TestRunner);
 
-smalltalk.addMethod(
-'_failedMethods',
-smalltalk.method({
-selector: 'failedMethods',
-fn: function (){
-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((typeof html == 'undefined' ? nil : html), "_li", []));})]);
-return self;}
-}),
-smalltalk.TestRunner);
-
 smalltalk.addMethod(
 '_selectAllCategories',
 smalltalk.method({
@@ -2735,7 +2966,7 @@ var self=this;
 self['@result']=smalltalk.send((smalltalk.TestResult || 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 (($receiver = acc).klass === smalltalk.Number) ? $receiver +smalltalk.send(smalltalk.send(each, "_methods", []), "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(each, "_methods", []), "_size", [])]);})])]);
+smalltalk.send(self['@result'], "_total_", [smalltalk.send(aCollection, "_size", [])]);
 smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send((function(){smalltalk.send(each, "_runCaseFor_", [self['@result']]);smalltalk.send(smalltalk.send(self, "_progressBar", []), "_updatePercent_", [(($receiver = (($receiver = smalltalk.send(self['@result'], "_runs", [])).klass === smalltalk.Number) ? $receiver /smalltalk.send(self['@result'], "_total", []) : smalltalk.send($receiver, "__slash", [smalltalk.send(self['@result'], "_total", [])])).klass === smalltalk.Number) ? $receiver *(100) : smalltalk.send($receiver, "__star", [(100)])]);smalltalk.send(self, "_updateStatusDiv", []);return smalltalk.send(self, "_updateMethodsList", []);}), "_valueWithTimeout_", [(100)]);})]);
 return self;}
 }),
@@ -2781,7 +3012,7 @@ smalltalk.method({
 selector: 'printPasses',
 fn: function (){
 var self=this;
-return smalltalk.send(smalltalk.send((($receiver = smalltalk.send(smalltalk.send(self, "_result", []), "_total", [])).klass === smalltalk.Number) ? $receiver -(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", [])]) : smalltalk.send($receiver, "__minus", [(($receiver = smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", [])).klass === smalltalk.Number) ? $receiver +smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []) : smalltalk.send($receiver, "__plus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", [])])]), "_asString", []), "__comma", [unescape("%20passes%2C%20")]);
+return smalltalk.send(smalltalk.send((($receiver = (($receiver = smalltalk.send(smalltalk.send(self, "_result", []), "_total", [])).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_size", [])])).klass === smalltalk.Number) ? $receiver -smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", []) : smalltalk.send($receiver, "__minus", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_size", [])]), "_asString", []), "__comma", [unescape("%20passes%2C%20")]);
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2814,7 +3045,7 @@ smalltalk.method({
 selector: 'renderButtonsOn:',
 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", []));
+(function($rec){smalltalk.send($rec, "_with_", ["Run selected"]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_run_", [smalltalk.send(self, "_testCases", [])]);})]);})(smalltalk.send(html, "_button", []));
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2864,7 +3095,7 @@ smalltalk.method({
 selector: 'renderFailuresOn:',
 fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);return smalltalk.send($rec, "_with_", [each]);})(smalltalk.send(html, "_li", []));})]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_failures", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["failures"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2875,7 +3106,7 @@ smalltalk.method({
 selector: 'renderErrorsOn:',
 fn: function (html){
 var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);return smalltalk.send($rec, "_with_", [each]);})(smalltalk.send(html, "_li", []));})]);
+smalltalk.send(smalltalk.send(smalltalk.send(self, "_result", []), "_errors", []), "_do_", [(function(each){return (function($rec){smalltalk.send($rec, "_class_", ["errors"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_class", []), "_name", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_performFailure_", [each]);})]);})(smalltalk.send(html, "_li", []));})]);
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2932,7 +3163,7 @@ smalltalk.method({
 selector: 'updateMethodsList',
 fn: function (){
 var self=this;
-smalltalk.send(self['@methodsList'], "_contents_", [(function(html){smalltalk.send(self, "_renderFailuresOn_", [html]);return smalltalk.send(self, "_renderErrorsOn_", [html]);})]);
+smalltalk.send(self['@methodsList'], "_contents_", [(function(html){smalltalk.send(self, "_renderErrorsOn_", [html]);return smalltalk.send(self, "_renderFailuresOn_", [html]);})]);
 return self;}
 }),
 smalltalk.TestRunner);
@@ -2949,6 +3180,31 @@ return self;}
 }),
 smalltalk.TestRunner);
 
+smalltalk.addMethod(
+'_testCases',
+smalltalk.method({
+selector: 'testCases',
+fn: function (){
+var self=this;
+var testCases=nil;
+testCases=[];
+smalltalk.send(smalltalk.send(self, "_selectedClasses", []), "_do_", [(function(each){return smalltalk.send(testCases, "_addAll_", [smalltalk.send(each, "_buildSuite", [])]);})]);
+return testCases;
+return self;}
+}),
+smalltalk.TestRunner);
+
+smalltalk.addMethod(
+'_performFailure_',
+smalltalk.method({
+selector: 'performFailure:',
+fn: function (aTestCase){
+var self=this;
+smalltalk.send(aTestCase, "_perform_", [smalltalk.send(aTestCase, "_selector", [])]);
+return self;}
+}),
+smalltalk.TestRunner);
+
 
 
 smalltalk.addMethod(

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 118 - 6
js/IDE.js


+ 74 - 0
js/JQuery.js

@@ -8,6 +8,7 @@ fn: function (anObject){
 var self=this;
 smalltalk.send(anObject, "_appendToJQuery_", [self]);
 return self;},
+args: ["anObject"],
 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: []
@@ -23,6 +24,7 @@ fn: function (anElement){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["append", anElement]);
 return self;},
+args: ["anElement"],
 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: []
@@ -38,6 +40,7 @@ fn: function (aJQuery){
 var self=this;
 smalltalk.send(aJQuery, "_appendElement_", [self['@jquery']]);
 return self;},
+args: ["aJQuery"],
 source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20jquery'),
 messageSends: ["appendElement:"],
 referencedClasses: []
@@ -54,6 +57,7 @@ var self=this;
 smalltalk.send(self, "_empty", []);
 smalltalk.send(self, "_append_", [anObject]);
 return self;},
+args: ["anObject"],
 source: unescape('contents%3A%20anObject%0A%20%20%20%20self%20empty.%0A%20%20%20%20self%20append%3A%20anObject'),
 messageSends: ["empty", "append:"],
 referencedClasses: []
@@ -69,6 +73,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["empty"]);
 return self;},
+args: [],
 source: unescape('empty%0A%20%20%20%20%5Eself%20call%3A%20%27empty%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -84,6 +89,7 @@ fn: function (){
 var self=this;
 return self['@jquery'];
 return self;},
+args: [],
 source: unescape('jquery%0A%09%5Ejquery'),
 messageSends: [],
 referencedClasses: []
@@ -99,6 +105,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["removeAttribute", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -114,6 +121,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["attr", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -129,6 +137,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["val"]);
 return self;},
+args: [],
 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: []
@@ -144,6 +153,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["val", aString]);
 return self;},
+args: ["aString"],
 source: unescape('val%3A%20aString%0A%20%20%20%20self%20call%3A%20%27val%27%20withArgument%3A%20aString'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -159,6 +169,7 @@ fn: function (aString, anotherString){
 var self=this;
 self['@jquery'].attr(aString, anotherString);
 return self;},
+args: ["aString", "anotherString"],
 source: unescape('attrAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%22Set%20the%20value%20of%20an%20attribute%20for%20the%20first%20element%20in%20the%20set%20of%20matched%20elements.%22%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.attr%28aString%2C%20anotherString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -174,6 +185,7 @@ fn: function (aString){
 var self=this;
 return self['@jquery'].css(aString);
 return self;},
+args: ["aString"],
 source: unescape('cssAt%3A%20aString%0A%09%3Creturn%20self%5B%27@jquery%27%5D.css%28aString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -189,6 +201,7 @@ fn: function (aString, anotherString){
 var self=this;
 self['@jquery'].css(aString, anotherString);
 return self;},
+args: ["aString", "anotherString"],
 source: unescape('cssAt%3A%20aString%20put%3A%20anotherString%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.css%28aString%2C%20anotherString%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -204,6 +217,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["addClass", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -219,6 +233,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["removeClass", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -234,6 +249,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["toggleClass", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -249,6 +265,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["height"]);
 return self;},
+args: [],
 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: []
@@ -264,6 +281,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["height", anInteger]);
 return self;},
+args: ["anInteger"],
 source: unescape('height%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27height%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -279,6 +297,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["width", anInteger]);
 return self;},
+args: ["anInteger"],
 source: unescape('width%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27width%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -294,6 +313,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["width"]);
 return self;},
+args: [],
 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: []
@@ -309,6 +329,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["innerHeight"]);
 return self;},
+args: [],
 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: []
@@ -324,6 +345,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["innerWidth"]);
 return self;},
+args: [],
 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: []
@@ -339,6 +361,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["outerHeight"]);
 return self;},
+args: [],
 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: []
@@ -354,6 +377,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["outerWidth"]);
 return self;},
+args: [],
 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: []
@@ -369,6 +393,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["position"]), "_basicAt_", ["top"]);
 return self;},
+args: [],
 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: []
@@ -384,6 +409,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["position"]), "_basicAt_", ["left"]);
 return self;},
+args: [],
 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: []
@@ -399,6 +425,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["offset"]), "_basicAt_", ["left"]);
 return self;},
+args: [],
 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: []
@@ -414,6 +441,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(smalltalk.send(self, "_call_", ["offset"]), "_basicAt_", ["top"]);
 return self;},
+args: [],
 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: []
@@ -429,6 +457,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["scrollLeft"]);
 return self;},
+args: [],
 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: []
@@ -444,6 +473,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_call_", ["scrollTop"]);
 return self;},
+args: [],
 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: []
@@ -459,6 +489,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["scrollLeft", anInteger]);
 return self;},
+args: ["anInteger"],
 source: unescape('scrollLeft%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollLeft%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -474,6 +505,7 @@ fn: function (anInteger){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["scrollTop", anInteger]);
 return self;},
+args: ["anInteger"],
 source: unescape('scrollTop%3A%20anInteger%0A%20%20%20%20self%20call%3A%20%27scrollTop%27%20withArgument%3A%20anInteger'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -489,6 +521,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(self, "_elementsDo_", [(function(anElement){return smalltalk.send(aBlock, "_value_", [smalltalk.send((smalltalk.JQuery || JQuery), "_fromElement_", [anElement])]);})]);
 return self;},
+args: ["aBlock"],
 source: unescape('do%3A%20aBlock%0A%20%20%20%20self%20elementsDo%3A%20%5B%3AanElement%7C%20%20aBlock%20value%3A%20%28JQuery%20fromElement%3A%20anElement%29%5D'),
 messageSends: ["elementsDo:", "value:", "fromElement:"],
 referencedClasses: [smalltalk.JQuery]
@@ -504,6 +537,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["focus"]);
 return self;},
+args: [],
 source: unescape('focus%0A%20%20%20%20self%20call%3A%20%27focus%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -519,6 +553,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["show"]);
 return self;},
+args: [],
 source: unescape('show%0A%20%20%20%20self%20call%3A%20%27show%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -534,6 +569,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["hide"]);
 return self;},
+args: [],
 source: unescape('hide%0A%20%20%20%20self%20call%3A%20%27hide%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -549,6 +585,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["remove"]);
 return self;},
+args: [],
 source: unescape('remove%0A%20%20%20%20self%20call%3A%20%27remove%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -564,6 +601,7 @@ fn: function (anEventString, aBlock){
 var self=this;
 self['@jquery'].bind(anEventString, function(e){aBlock(e, self)});
 return self;},
+args: ["anEventString", "aBlock"],
 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%3Cself%5B%27@jquery%27%5D.bind%28anEventString%2C%20function%28e%29%7BaBlock%28e%2C%20self%29%7D%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -579,6 +617,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["unbind", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -594,6 +633,7 @@ fn: function (anObject){
 var self=this;
 self['@jquery']=anObject;
 return self;},
+args: ["anObject"],
 source: unescape('initializeWithJQueryObject%3A%20anObject%0A%20%20%20%20jquery%20%3A%3D%20anObject'),
 messageSends: [],
 referencedClasses: []
@@ -609,6 +649,7 @@ fn: function (aString){
 var self=this;
 return self['@jquery'][aString]();
 return self;},
+args: ["aString"],
 source: unescape('call%3A%20aString%0A%09%3Creturn%20self%5B%27@jquery%27%5D%5BaString%5D%28%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -624,6 +665,7 @@ fn: function (aString, anObject){
 var self=this;
 return self['@jquery'][aString](anObject);
 return self;},
+args: ["aString", "anObject"],
 source: unescape('call%3A%20aString%20withArgument%3A%20anObject%0A%20%20%20%20%3Creturn%20self%5B%27@jquery%27%5D%5BaString%5D%28anObject%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -639,6 +681,7 @@ fn: function (aBlock){
 var self=this;
 self['@jquery'].each(function(index, element){aBlock(element, self)});
 return self;},
+args: ["aBlock"],
 source: unescape('elementsDo%3A%20aBlock%0A%20%20%20%20%22Iterate%20over%20a%20jQuery%20object%2C%20executing%20a%20function%20for%20each%20matched%20element.%22%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.each%28function%28index%2C%20element%29%7BaBlock%28element%2C%20self%29%7D%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -654,6 +697,7 @@ fn: function (aString){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["hasClass", aString]);
 return self;},
+args: ["aString"],
 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: []
@@ -669,6 +713,7 @@ fn: function (aSelector){
 var self=this;
 return smalltalk.send(self, "_call_withArgument_", ["find", aSelector]);
 return self;},
+args: ["aSelector"],
 source: unescape('find%3A%20aSelector%0A%20%20%20%20%22Get%20the%20descendants%20of%20each%20element%20in%20the%20current%20set%20of%20matched%20elements%2C%20filtered%20by%20a%20selector%2C%20jQuery%20object%2C%20or%20element.%22%0A%20%20%20%20%5E%20self%20call%3A%20%27find%27%20withArgument%3A%20aSelector'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -684,6 +729,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["load", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onLoadDo%3A%20aBlock%0A%09%22Bind%20an%20event%20handler%20to%20the%20%27load%27%20JavaScript%20event.%22%0A%09self%20call%3A%20%27load%27%20withArgument%3A%20aBlock'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -699,6 +745,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["fadeIn"]);
 return self;},
+args: [],
 source: unescape('fadeIn%0A%20%09self%20call%3A%20%27fadeIn%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -714,6 +761,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["slideDown"]);
 return self;},
+args: [],
 source: unescape('slideDown%0A%20%09self%20call%3A%20%27slideDown%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -729,6 +777,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["fadeIn", "slow"]);
 return self;},
+args: [],
 source: unescape('fadeInSlow%0A%20%09self%20call%3A%20%27fadeIn%27%20withArgument%3A%20%27slow%27'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -744,6 +793,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["fadeOut"]);
 return self;},
+args: [],
 source: unescape('fadeOut%0A%20%09self%20call%3A%20%27fadeOut%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -759,6 +809,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_withArgument_", ["fadeOut", "slow"]);
 return self;},
+args: [],
 source: unescape('fadeOutSlow%0A%20%09self%20call%3A%20%27fadeOut%27%20withArgument%3A%20%27slow%27'),
 messageSends: ["call:withArgument:"],
 referencedClasses: []
@@ -774,6 +825,7 @@ fn: function (){
 var self=this;
 smalltalk.send(self, "_call_", ["slideUp"]);
 return self;},
+args: [],
 source: unescape('slideUp%0A%20%09self%20call%3A%20%27slideUp%27'),
 messageSends: ["call:"],
 referencedClasses: []
@@ -789,6 +841,7 @@ fn: function (aString, aBlock){
 var self=this;
 self['@jquery'].fadeOut(aString, aBlock);
 return self;},
+args: ["aString", "aBlock"],
 source: unescape('fadeOut%3A%20aString%20do%3A%20aBlock%0A%20%20%20%20%3Cself%5B%27@jquery%27%5D.fadeOut%28aString%2C%20aBlock%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -807,6 +860,7 @@ var newJQuery=nil;
 newJQuery = jQuery(String(aString));
 return smalltalk.send(self, "_from_", [newJQuery]);
 return self;},
+args: ["aString"],
 source: unescape('fromString%3A%20aString%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%3CnewJQuery%20%3D%20jQuery%28String%28aString%29%29%3E.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
 messageSends: ["from:"],
 referencedClasses: []
@@ -822,6 +876,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;},
+args: ["anObject"],
 source: unescape('from%3A%20anObject%0A%20%20%20%20%5Eself%20new%0A%09initializeWithJQueryObject%3A%20anObject%3B%0A%09yourself'),
 messageSends: ["initializeWithJQueryObject:", "yourself", "new"],
 referencedClasses: []
@@ -837,6 +892,7 @@ fn: function (){
 var self=this;
 return self._from_(jQuery(window));
 return self;},
+args: [],
 source: unescape('window%0A%09%3Creturn%20self._from_%28jQuery%28window%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -852,6 +908,7 @@ fn: function (){
 var self=this;
 return self._from_(jQuery('body'));
 return self;},
+args: [],
 source: unescape('body%0A%09%3Creturn%20self._from_%28jQuery%28%27body%27%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -867,6 +924,7 @@ fn: function (){
 var self=this;
 return self._from_(jQuery(document));
 return self;},
+args: [],
 source: unescape('document%0A%09%3Creturn%20self._from_%28jQuery%28document%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -884,6 +942,7 @@ var newJQuery=nil;
 newJQuery = jQuery(anElement);
 return smalltalk.send(self, "_from_", [newJQuery]);
 return self;},
+args: ["anElement"],
 source: unescape('fromElement%3A%20anElement%0A%20%20%20%20%7C%20newJQuery%20%7C%0A%20%20%20%20%3CnewJQuery%20%3D%20jQuery%28anElement%29%3E.%0A%20%20%20%20%5Eself%20from%3A%20newJQuery'),
 messageSends: ["from:"],
 referencedClasses: []
@@ -899,6 +958,7 @@ fn: function (aBlock){
 var self=this;
 jQuery(document).ready(aBlock);
 return self;},
+args: ["aBlock"],
 source: unescape('documentReady%3A%20aBlock%0A%09%3CjQuery%28document%29.ready%28aBlock%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -917,6 +977,7 @@ fn: function (aKey){
 var self=this;
 return smalltalk.send(self['@settings'], "_at_ifAbsent_", [aKey, (function(){return nil;})]);
 return self;},
+args: ["aKey"],
 source: unescape('at%3A%20aKey%0A%20%20%20%20%5Esettings%20at%3A%20aKey%20ifAbsent%3A%20%5Bnil%5D'),
 messageSends: ["at:ifAbsent:"],
 referencedClasses: []
@@ -932,6 +993,7 @@ fn: function (aKey, aValue){
 var self=this;
 smalltalk.send(self['@settings'], "_at_put_", [aKey, aValue]);
 return self;},
+args: ["aKey", "aValue"],
 source: unescape('at%3A%20aKey%20put%3A%20aValue%0A%20%20%20%20settings%20at%3A%20aKey%20put%3A%20aValue'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -947,6 +1009,7 @@ fn: function (){
 var self=this;
 return smalltalk.send(self, "_at_", ["url"]);
 return self;},
+args: [],
 source: unescape('url%0A%20%20%20%20%5Eself%20at%3A%20%27url%27'),
 messageSends: ["at:"],
 referencedClasses: []
@@ -962,6 +1025,7 @@ fn: function (aString){
 var self=this;
 smalltalk.send(self, "_at_put_", ["url", aString]);
 return self;},
+args: ["aString"],
 source: unescape('url%3A%20aString%0A%20%20%20%20self%20at%3A%20%27url%27%20put%3A%20aString'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -977,6 +1041,7 @@ fn: function (){
 var self=this;
 jQuery.ajax(self['@settings']);
 return self;},
+args: [],
 source: unescape('send%0A%20%20%20%20%3CjQuery.ajax%28self%5B%27@settings%27%5D%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -992,6 +1057,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(self, "_at_put_", ["success", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onSuccessDo%3A%20aBlock%0A%09%22Set%20action%20to%20execute%20when%20Ajax%20request%20is%20successful.%20Pass%20received%20data%20as%20block%20argument.%20Block%20arguments%3A%20data%2C%20textStatus%2C%20jqXHR%22%0A%09self%20at%3A%20%27success%27%20put%3A%20aBlock'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1007,6 +1073,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(self, "_at_put_", ["complete", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onCompleteDo%3A%20aBlock%0A%09%22A%20block%20to%20be%20called%20when%20the%20request%20finishes%20%28after%20success%20and%20error%20callbacks%20are%20executed%29.%20Block%20arguments%3A%20jqXHR%2C%20textStatus%22%0A%09self%20at%3A%20%27complete%27%20put%3A%20aBlock'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1022,6 +1089,7 @@ fn: function (aBlock){
 var self=this;
 smalltalk.send(self, "_at_put_", ["error", aBlock]);
 return self;},
+args: ["aBlock"],
 source: unescape('onErrorDo%3A%20aBlock%0A%09%22A%20block%20to%20be%20called%20if%20the%20request%20fails.Block%20arguments%3A%20jqXHR%2C%20textStatus%2C%20errorThrown%22%0A%09self%20at%3A%20%27error%27%20put%3A%20aBlock'),
 messageSends: ["at:put:"],
 referencedClasses: []
@@ -1038,6 +1106,7 @@ var self=this;
 smalltalk.send(self, "_initialize", [], smalltalk.Object);
 self['@settings']=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []);
 return self;},
+args: [],
 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]
@@ -1054,6 +1123,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;},
+args: ["aString"],
 source: unescape('url%3A%20aString%0A%20%20%20%20%5Eself%20new%0A%09url%3A%20aString%3B%0A%09yourself'),
 messageSends: ["url:", "yourself", "new"],
 referencedClasses: []
@@ -1070,6 +1140,7 @@ fn: function (aJQuery){
 var self=this;
 smalltalk.send(self, "_value_", [smalltalk.send((smalltalk.HTMLCanvas || HTMLCanvas), "_onJQuery_", [aJQuery])]);
 return self;},
+args: ["aJQuery"],
 source: unescape('appendToJQuery%3A%20aJQuery%0A%09self%20value%3A%20%28HTMLCanvas%20onJQuery%3A%20aJQuery%29'),
 messageSends: ["value:", "onJQuery:"],
 referencedClasses: [smalltalk.HTMLCanvas]
@@ -1085,6 +1156,7 @@ fn: function (){
 var self=this;
 return smalltalk.send((smalltalk.JQuery || JQuery), "_fromString_", [self]);
 return self;},
+args: [],
 source: unescape('asJQuery%0A%20%20%20%20%5EJQuery%20fromString%3A%20self'),
 messageSends: ["fromString:"],
 referencedClasses: [smalltalk.JQuery]
@@ -1100,6 +1172,7 @@ fn: function (aJQuery){
 var self=this;
 aJQuery._appendElement_(String(self));
 return self;},
+args: ["aJQuery"],
 source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20%3CaJQuery._appendElement_%28String%28self%29%29%3E'),
 messageSends: [],
 referencedClasses: []
@@ -1115,6 +1188,7 @@ fn: function (aJQuery){
 var self=this;
 smalltalk.send(aJQuery, "_appendElement_", [smalltalk.send(self['@root'], "_element", [])]);
 return self;},
+args: ["aJQuery"],
 source: unescape('appendToJQuery%3A%20aJQuery%0A%20%20%20%20aJQuery%20appendElement%3A%20root%20element'),
 messageSends: ["appendElement:", "element"],
 referencedClasses: []

+ 12 - 12
js/Kernel.deploy.js

@@ -526,17 +526,6 @@ return self;}
 }),
 smalltalk.Object);
 
-smalltalk.addMethod(
-'_foo',
-smalltalk.method({
-selector: 'foo',
-fn: function (){
-var self=this;
-return self;
-return self;}
-}),
-smalltalk.Object);
-
 
 smalltalk.addMethod(
 '_initialize',
@@ -1227,6 +1216,17 @@ return self;}
 }),
 smalltalk.CompiledMethod);
 
+smalltalk.addMethod(
+'_arguments',
+smalltalk.method({
+selector: 'arguments',
+fn: function (){
+var self=this;
+return self.args || [];
+return self;}
+}),
+smalltalk.CompiledMethod);
+
 
 
 smalltalk.addClass('Number', smalltalk.Object, [], 'Kernel');
@@ -4073,7 +4073,7 @@ smalltalk.method({
 selector: 'signal',
 fn: function (){
 var self=this;
-self.context = thisContext; self.smalltalkError = true; throw(self);
+self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self);
 return self;}
 }),
 smalltalk.Error);

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 140 - 23
js/Kernel.js


+ 96 - 48
js/SUnit.deploy.js

@@ -1,37 +1,4 @@
-smalltalk.addClass('TestCase', smalltalk.Object, ['testedClass'], 'SUnit');
-smalltalk.addMethod(
-'_testedClass',
-smalltalk.method({
-selector: 'testedClass',
-fn: function (){
-var self=this;
-return self['@testedClass'];
-return self;}
-}),
-smalltalk.TestCase);
-
-smalltalk.addMethod(
-'_testedClass_',
-smalltalk.method({
-selector: 'testedClass:',
-fn: function (aClass){
-var self=this;
-self['@testedClass']=aClass;
-return self;}
-}),
-smalltalk.TestCase);
-
-smalltalk.addMethod(
-'_cleanUpInstanceVariables',
-smalltalk.method({
-selector: 'cleanUpInstanceVariables',
-fn: function (){
-var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(name){return (($receiver = smalltalk.send(name, "__eq", ["testSelector"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_instVarAt_put_", [name, nil]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_instVarAt_put_", [name, nil]);})]);})]);
-return self;}
-}),
-smalltalk.TestCase);
-
+smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
 smalltalk.addMethod(
 '_signalFailure_',
 smalltalk.method({
@@ -65,26 +32,16 @@ return self;}
 }),
 smalltalk.TestCase);
 
-smalltalk.addMethod(
-'_methods',
-smalltalk.method({
-selector: 'methods',
-fn: function (){
-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")]);})]);
-return self;}
-}),
-smalltalk.TestCase);
-
 smalltalk.addMethod(
 '_runCaseFor_',
 smalltalk.method({
 selector: 'runCaseFor:',
 fn: function (aTestResult){
 var self=this;
-smalltalk.send((function(){smalltalk.send(self, "_setUp", []);return smalltalk.send(self, "_performTestFor_", [aTestResult]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){smalltalk.send(self, "_tearDown", []);smalltalk.send(self, "_cleanUpInstanceVariables", []);return smalltalk.send(ex, "_signal", []);})]);
+smalltalk.send(self, "_setUp", []);
+smalltalk.send(aTestResult, "_increaseRuns", []);
+smalltalk.send(self, "_performTestFor_", [aTestResult]);
 smalltalk.send(self, "_tearDown", []);
-smalltalk.send(self, "_cleanUpInstanceVariables", []);
 return self;}
 }),
 smalltalk.TestCase);
@@ -95,7 +52,7 @@ smalltalk.method({
 selector: 'performTestFor:',
 fn: function (aResult){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [each]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_name", []), "__comma", [unescape("%3E%3E")]), "__comma", [each]), "__comma", [": "]), "__comma", [smalltalk.send(ex, "_messageText", [])])]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_name", []), "__comma", [unescape("%3E%3E")]), "__comma", [each]), "__comma", [": "]), "__comma", [smalltalk.send(ex, "_messageText", [])])]);})]);return smalltalk.send(aResult, "_increaseRuns", []);})]);
+smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
 return self;}
 }),
 smalltalk.TestCase);
@@ -144,6 +101,97 @@ return self;}
 }),
 smalltalk.TestCase);
 
+smalltalk.addMethod(
+'_setTestSelector_',
+smalltalk.method({
+selector: 'setTestSelector:',
+fn: function (aSelector){
+var self=this;
+self['@testSelector']=aSelector;
+return self;}
+}),
+smalltalk.TestCase);
+
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+fn: function (){
+var self=this;
+return self['@testSelector'];
+return self;}
+}),
+smalltalk.TestCase);
+
+
+smalltalk.addMethod(
+'_testSelectors',
+smalltalk.method({
+selector: 'testSelectors',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
+return self;}
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_selector_',
+smalltalk.method({
+selector: 'selector:',
+fn: function (aSelector){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return self;}
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_lookupHierarchyRoot',
+smalltalk.method({
+selector: 'lookupHierarchyRoot',
+fn: function (){
+var self=this;
+return (smalltalk.TestCase || TestCase);
+return self;}
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_shouldInheritSelectors',
+smalltalk.method({
+selector: 'shouldInheritSelectors',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_~_eq", [smalltalk.send(self, "_lookupHierarchyRoot", [])]);
+return self;}
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_allTestSelectors',
+smalltalk.method({
+selector: 'allTestSelectors',
+fn: function (){
+var self=this;
+var selectors=nil;
+selectors=smalltalk.send(self, "_testSelectors", []);
+(($receiver = smalltalk.send(self, "_shouldInheritSelectors", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})]);
+return selectors;
+return self;}
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_buildSuite',
+smalltalk.method({
+selector: 'buildSuite',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_allTestSelectors", []), "_collect_", [(function(each){return smalltalk.send(self, "_selector_", [each]);})]);
+return self;}
+}),
+smalltalk.TestCase.klass);
 
 
 smalltalk.addClass('TestFailure', smalltalk.Error, [], 'SUnit');

+ 164 - 72
js/SUnit.js

@@ -1,49 +1,4 @@
-smalltalk.addClass('TestCase', smalltalk.Object, ['testedClass'], 'SUnit');
-smalltalk.addMethod(
-'_testedClass',
-smalltalk.method({
-selector: 'testedClass',
-category: 'accessing',
-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'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.TestCase);
-
-smalltalk.addMethod(
-'_cleanUpInstanceVariables',
-smalltalk.method({
-selector: 'cleanUpInstanceVariables',
-category: 'private',
-fn: function (){
-var self=this;
-smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_instanceVariableNames", []), "_do_", [(function(name){return (($receiver = smalltalk.send(name, "__eq", ["testSelector"])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_instVarAt_put_", [name, nil]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_instVarAt_put_", [name, nil]);})]);})]);
-return self;},
-source: unescape('cleanUpInstanceVariables%0A%09self%20class%20instanceVariableNames%20do%3A%20%5B%20%3Aname%20%7C%0A%09%09name%20%3D%20%27testSelector%27%20ifFalse%3A%20%5B%0A%09%09%09self%20instVarAt%3A%20name%20put%3A%20nil%20%5D%5D'),
-messageSends: ["do:", "instanceVariableNames", "class", "ifFalse:", unescape("%3D"), "instVarAt:put:"],
-referencedClasses: []
-}),
-smalltalk.TestCase);
-
+smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
 smalltalk.addMethod(
 '_signalFailure_',
 smalltalk.method({
@@ -53,9 +8,10 @@ fn: function (aString){
 var self=this;
 (function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
 return self;},
-source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
+args: ["aString"],
+source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal%20'),
 messageSends: ["messageText:", "signal", "new"],
-referencedClasses: []
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.TestCase);
 
@@ -68,6 +24,7 @@ fn: function (){
 var self=this;
 
 return self;},
+args: [],
 source: unescape('setUp'),
 messageSends: [],
 referencedClasses: []
@@ -83,27 +40,13 @@ fn: function (){
 var self=this;
 
 return self;},
+args: [],
 source: unescape('tearDown'),
 messageSends: [],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
-smalltalk.addMethod(
-'_methods',
-smalltalk.method({
-selector: 'methods',
-category: 'running',
-fn: function (){
-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")]);})]);
-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:"],
-referencedClasses: []
-}),
-smalltalk.TestCase);
-
 smalltalk.addMethod(
 '_runCaseFor_',
 smalltalk.method({
@@ -111,13 +54,15 @@ selector: 'runCaseFor:',
 category: 'running',
 fn: function (aTestResult){
 var self=this;
-smalltalk.send((function(){smalltalk.send(self, "_setUp", []);return smalltalk.send(self, "_performTestFor_", [aTestResult]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){smalltalk.send(self, "_tearDown", []);smalltalk.send(self, "_cleanUpInstanceVariables", []);return smalltalk.send(ex, "_signal", []);})]);
+smalltalk.send(self, "_setUp", []);
+smalltalk.send(aTestResult, "_increaseRuns", []);
+smalltalk.send(self, "_performTestFor_", [aTestResult]);
 smalltalk.send(self, "_tearDown", []);
-smalltalk.send(self, "_cleanUpInstanceVariables", []);
 return self;},
-source: unescape('runCaseFor%3A%20aTestResult%0A%09%5Bself%20setUp.%0A%09self%20performTestFor%3A%20aTestResult%5D%0A%09%09on%3A%20Error%0A%09%09do%3A%20%5B%3Aex%20%7C%0A%09%09%09self%20tearDown.%0A%09%09%09self%20cleanUpInstanceVariables.%0A%09%09%09ex%20signal%5D.%0A%09self%20tearDown.%0A%09self%20cleanUpInstanceVariables'),
-messageSends: ["on:do:", "setUp", "performTestFor:", "tearDown", "cleanUpInstanceVariables", "signal"],
-referencedClasses: [smalltalk.Error]
+args: ["aTestResult"],
+source: unescape('runCaseFor%3A%20aTestResult%0A%09self%20setUp.%0A%09aTestResult%20increaseRuns.%0A%09self%20performTestFor%3A%20aTestResult.%0A%09self%20tearDown'),
+messageSends: ["setUp", "increaseRuns", "performTestFor:", "tearDown"],
+referencedClasses: []
 }),
 smalltalk.TestCase);
 
@@ -128,11 +73,12 @@ selector: 'performTestFor:',
 category: 'running',
 fn: function (aResult){
 var self=this;
-smalltalk.send(smalltalk.send(self, "_methods", []), "_do_", [(function(each){smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [each]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_name", []), "__comma", [unescape("%3E%3E")]), "__comma", [each]), "__comma", [": "]), "__comma", [smalltalk.send(ex, "_messageText", [])])]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self, "_class", []), "_name", []), "__comma", [unescape("%3E%3E")]), "__comma", [each]), "__comma", [": "]), "__comma", [smalltalk.send(ex, "_messageText", [])])]);})]);return smalltalk.send(aResult, "_increaseRuns", []);})]);
+smalltalk.send((function(){return smalltalk.send((function(){return smalltalk.send(self, "_perform_", [smalltalk.send(self, "_selector", [])]);}), "_on_do_", [(smalltalk.TestFailure || TestFailure), (function(ex){return smalltalk.send(aResult, "_addFailure_", [self]);})]);}), "_on_do_", [(smalltalk.Error || Error), (function(ex){return smalltalk.send(aResult, "_addError_", [self]);})]);
 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%2C%20%27%3A%20%27%2C%20ex%20messageText%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%2C%20%27%3A%20%27%2C%20ex%20messageText%5D.%0A%09%09aResult%20increaseRuns%5D'),
-messageSends: ["do:", "methods", "on:do:", "perform:", "addFailure:", unescape("%2C"), "name", "class", "messageText", "addError:", "increaseRuns"],
-referencedClasses: [smalltalk.Error]
+args: ["aResult"],
+source: unescape('performTestFor%3A%20aResult%0A%09%5B%5Bself%20perform%3A%20self%20selector%5D%0A%09%09on%3A%20TestFailure%20do%3A%20%5B%3Aex%20%7C%20aResult%20addFailure%3A%20self%5D%5D%0A%09%09on%3A%20Error%20do%3A%20%5B%3Aex%20%7C%20aResult%20addError%3A%20self%5D'),
+messageSends: ["on:do:", "perform:", "selector", "addFailure:", "addError:"],
+referencedClasses: [smalltalk.TestFailure,smalltalk.Error]
 }),
 smalltalk.TestCase);
 
@@ -145,6 +91,7 @@ fn: function (aBoolean){
 var self=this;
 smalltalk.send(self, "_assert_description_", [aBoolean, "Assertion failed"]);
 return self;},
+args: ["aBoolean"],
 source: unescape('assert%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20description%3A%20%27Assertion%20failed%27'),
 messageSends: ["assert:description:"],
 referencedClasses: []
@@ -160,6 +107,7 @@ fn: function (aBoolean){
 var self=this;
 smalltalk.send(self, "_assert_", [smalltalk.send(aBoolean, "_not", [])]);
 return self;},
+args: ["aBoolean"],
 source: unescape('deny%3A%20aBoolean%0A%09self%20assert%3A%20aBoolean%20not'),
 messageSends: ["assert:", "not"],
 referencedClasses: []
@@ -175,6 +123,7 @@ fn: function (expected, actual){
 var self=this;
 return smalltalk.send(self, "_assert_description_", [smalltalk.send(expected, "__eq", [actual]), smalltalk.send(smalltalk.send(smalltalk.send("Expected: ", "__comma", [smalltalk.send(expected, "_asString", [])]), "__comma", [" but was: "]), "__comma", [smalltalk.send(actual, "_asString", [])])]);
 return self;},
+args: ["expected", "actual"],
 source: unescape('assert%3A%20expected%20equals%3A%20actual%0A%09%5E%20self%20assert%3A%20%28expected%20%3D%20actual%29%20description%3A%20%27Expected%3A%20%27%2C%20expected%20asString%2C%20%27%20but%20was%3A%20%27%2C%20actual%20asString'),
 messageSends: ["assert:description:", unescape("%3D"), unescape("%2C"), "asString"],
 referencedClasses: []
@@ -190,12 +139,144 @@ fn: function (aBoolean, aString){
 var self=this;
 (($receiver = aBoolean).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_signalFailure_", [aString]);})() : nil) : smalltalk.send($receiver, "_ifFalse_", [(function(){return smalltalk.send(self, "_signalFailure_", [aString]);})]);
 return self;},
+args: ["aBoolean", "aString"],
 source: unescape('assert%3A%20aBoolean%20description%3A%20aString%0A%09aBoolean%20ifFalse%3A%20%5Bself%20signalFailure%3A%20aString%5D'),
 messageSends: ["ifFalse:", "signalFailure:"],
 referencedClasses: []
 }),
 smalltalk.TestCase);
 
+smalltalk.addMethod(
+'_setTestSelector_',
+smalltalk.method({
+selector: 'setTestSelector:',
+category: 'accessing',
+fn: function (aSelector){
+var self=this;
+self['@testSelector']=aSelector;
+return self;},
+args: ["aSelector"],
+source: unescape('setTestSelector%3A%20aSelector%0A%09testSelector%20%3A%3D%20aSelector'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.TestCase);
+
+smalltalk.addMethod(
+'_selector',
+smalltalk.method({
+selector: 'selector',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@testSelector'];
+return self;},
+args: [],
+source: unescape('selector%0A%09%5EtestSelector'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.TestCase);
+
+
+smalltalk.addMethod(
+'_testSelectors',
+smalltalk.method({
+selector: 'testSelectors',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(self, "_methodDictionary", []), "_keys", []), "_select_", [(function(each){return smalltalk.send(each, "_match_", [unescape("%5Etest")]);})]);
+return self;},
+args: [],
+source: unescape('testSelectors%0A%09%5Eself%20methodDictionary%20keys%20select%3A%20%5B%3Aeach%20%7C%20each%20match%3A%20%27%5Etest%27%5D'),
+messageSends: ["select:", "keys", "methodDictionary", "match:"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_selector_',
+smalltalk.method({
+selector: 'selector:',
+category: 'accessing',
+fn: function (aSelector){
+var self=this;
+return (function($rec){smalltalk.send($rec, "_setTestSelector_", [aSelector]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
+return self;},
+args: ["aSelector"],
+source: unescape('selector%3A%20aSelector%0A%09%5Eself%20new%0A%09%09setTestSelector%3A%20aSelector%3B%0A%09%09yourself'),
+messageSends: ["setTestSelector:", "yourself", "new"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_lookupHierarchyRoot',
+smalltalk.method({
+selector: 'lookupHierarchyRoot',
+category: 'accessing',
+fn: function (){
+var self=this;
+return (smalltalk.TestCase || TestCase);
+return self;},
+args: [],
+source: unescape('lookupHierarchyRoot%0A%09%5ETestCase'),
+messageSends: [],
+referencedClasses: [smalltalk.TestCase]
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_shouldInheritSelectors',
+smalltalk.method({
+selector: 'shouldInheritSelectors',
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.send(self, "_~_eq", [smalltalk.send(self, "_lookupHierarchyRoot", [])]);
+return self;},
+args: [],
+source: unescape('shouldInheritSelectors%0A%09%5Eself%20%7E%3D%20self%20lookupHierarchyRoot'),
+messageSends: [unescape("%7E%3D"), "lookupHierarchyRoot"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_allTestSelectors',
+smalltalk.method({
+selector: 'allTestSelectors',
+category: 'accessing',
+fn: function (){
+var self=this;
+var selectors=nil;
+selectors=smalltalk.send(self, "_testSelectors", []);
+(($receiver = smalltalk.send(self, "_shouldInheritSelectors", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(selectors, "_addAll_", [smalltalk.send(smalltalk.send(self, "_superclass", []), "_allTestSelectors", [])]);})]);
+return selectors;
+return self;},
+args: [],
+source: unescape('allTestSelectors%0A%09%7C%20selectors%20%7C%0A%09selectors%20%3A%3D%20self%20testSelectors.%0A%09self%20shouldInheritSelectors%20ifTrue%3A%20%5B%0A%09%09selectors%20addAll%3A%20self%20superclass%20allTestSelectors%5D.%0A%09%5Eselectors'),
+messageSends: ["testSelectors", "ifTrue:", "shouldInheritSelectors", "addAll:", "allTestSelectors", "superclass"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
+
+smalltalk.addMethod(
+'_buildSuite',
+smalltalk.method({
+selector: 'buildSuite',
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(self, "_allTestSelectors", []), "_collect_", [(function(each){return smalltalk.send(self, "_selector_", [each]);})]);
+return self;},
+args: [],
+source: unescape('buildSuite%0A%09%5Eself%20allTestSelectors%20collect%3A%20%5B%3Aeach%20%7C%20self%20selector%3A%20each%5D'),
+messageSends: ["collect:", "allTestSelectors", "selector:"],
+referencedClasses: []
+}),
+smalltalk.TestCase.klass);
 
 
 smalltalk.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
@@ -211,6 +292,7 @@ fn: function (){
 var self=this;
 return self['@timestamp'];
 return self;},
+args: [],
 source: unescape('timestamp%0A%09%5Etimestamp'),
 messageSends: [],
 referencedClasses: []
@@ -226,6 +308,7 @@ fn: function (){
 var self=this;
 return self['@errors'];
 return self;},
+args: [],
 source: unescape('errors%0A%09%5Eerrors'),
 messageSends: [],
 referencedClasses: []
@@ -241,6 +324,7 @@ fn: function (){
 var self=this;
 return self['@failures'];
 return self;},
+args: [],
 source: unescape('failures%0A%09%5Efailures'),
 messageSends: [],
 referencedClasses: []
@@ -256,6 +340,7 @@ fn: function (){
 var self=this;
 return self['@total'];
 return self;},
+args: [],
 source: unescape('total%0A%09%5Etotal'),
 messageSends: [],
 referencedClasses: []
@@ -271,6 +356,7 @@ fn: function (aNumber){
 var self=this;
 self['@total']=aNumber;
 return self;},
+args: ["aNumber"],
 source: unescape('total%3A%20aNumber%0A%09total%20%3A%3D%20aNumber'),
 messageSends: [],
 referencedClasses: []
@@ -286,6 +372,7 @@ fn: function (anError){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_errors", []), "_add_", [anError]);
 return self;},
+args: ["anError"],
 source: unescape('addError%3A%20anError%0A%09self%20errors%20add%3A%20anError'),
 messageSends: ["add:", "errors"],
 referencedClasses: []
@@ -301,6 +388,7 @@ fn: function (aFailure){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_failures", []), "_add_", [aFailure]);
 return self;},
+args: ["aFailure"],
 source: unescape('addFailure%3A%20aFailure%0A%09self%20failures%20add%3A%20aFailure'),
 messageSends: ["add:", "failures"],
 referencedClasses: []
@@ -316,6 +404,7 @@ fn: function (){
 var self=this;
 return self['@runs'];
 return self;},
+args: [],
 source: unescape('runs%0A%09%5Eruns'),
 messageSends: [],
 referencedClasses: []
@@ -331,6 +420,7 @@ fn: function (){
 var self=this;
 self['@runs']=(($receiver = self['@runs']).klass === smalltalk.Number) ? $receiver +(1) : smalltalk.send($receiver, "__plus", [(1)]);
 return self;},
+args: [],
 source: unescape('increaseRuns%0A%09runs%20%3A%3D%20runs%20+%201'),
 messageSends: [unescape("+")],
 referencedClasses: []
@@ -346,6 +436,7 @@ fn: function (){
 var self=this;
 return (($receiver = smalltalk.send(smalltalk.send(self, "_errors", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]);})() : (function(){return "error";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (($receiver = smalltalk.send(smalltalk.send(self, "_failures", []), "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return "success";})() : (function(){return "failure";})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return "success";}), (function(){return "failure";})]);}), (function(){return "error";})]);
 return self;},
+args: [],
 source: unescape('status%0A%09%5Eself%20errors%20isEmpty%20%0A%09%09ifTrue%3A%20%5B%0A%09%09%09self%20failures%20isEmpty%20%0A%09%09%09%09ifTrue%3A%20%5B%27success%27%5D%0A%09%09%09%09ifFalse%3A%20%5B%27failure%27%5D%5D%0A%09%09ifFalse%3A%20%5B%27error%27%5D'),
 messageSends: ["ifTrue:ifFalse:", "isEmpty", "errors", "failures"],
 referencedClasses: []
@@ -366,6 +457,7 @@ self['@errors']=smalltalk.send((smalltalk.Array || Array), "_new", []);
 self['@failures']=smalltalk.send((smalltalk.Array || Array), "_new", []);
 self['@total']=(0);
 return self;},
+args: [],
 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]

+ 30 - 13
js/boot.js

@@ -47,6 +47,7 @@ function SmalltalkNil(){};
 function Smalltalk(){
 
     var st = this;
+    this.thisContext = undefined;
 
     /* Smalltalk class creation. A class is an instance of an automatically 
        created metaclass object. Newly created classes (not their metaclass) 
@@ -86,6 +87,7 @@ function Smalltalk(){
 	var that = new SmalltalkMethod();
 	that.selector          = spec.selector;
 	that.jsSelector        = spec.jsSelector;
+	that.args              = spec.args || {};
 	that.category          = spec.category;
 	that.source            = spec.source;
 	that.messageSends      = spec.messageSends || [];
@@ -224,13 +226,13 @@ function Smalltalk(){
     /* Handles unhandled errors during message sends */
 
     sendWithContext = function(receiver, selector, args, klass) {
-	if(thisContext) {
+	if(st.thisContext) {
 	     return withContextSend(receiver, selector, args, klass);
 	} else {
 	    try {return withContextSend(receiver, selector, args, klass)}
 	    catch(error) {
 		// Reset the context stack in any case
-		thisContext = undefined;
+		st.thisContext = undefined;
 		if(error.smalltalkError) {
 		    handleError(error);
 		} else {
@@ -265,7 +267,7 @@ function Smalltalk(){
        (See the Smalltalk class ErrorHandler and its subclasses */
     
     function handleError(error) {
-	thisContext = undefined;
+	st.thisContext = undefined;
 	smalltalk.ErrorHandler._current()._handleError_(error);
     }
 
@@ -325,11 +327,19 @@ function Smalltalk(){
 	
     /* Handle thisContext pseudo variable */
     
+    st.getThisContext = function() {
+	if(st.thisContext) {
+	    return st.thisContext.copy();
+	} else {
+	    return undefined;
+	}
+    }
+
     pushContext = function(receiver, selector, temps) {
-	if(thisContext) {
-	    return thisContext = thisContext.newContext(receiver, selector, temps);
+	if(st.thisContext) {
+	    return st.thisContext = st.thisContext.newContext(receiver, selector, temps);
 	} else {
-	    return thisContext = new SmalltalkMethodContext(receiver, selector, temps);
+	    return st.thisContext = new SmalltalkMethodContext(receiver, selector, temps);
 	}
     };
 
@@ -409,6 +419,17 @@ function SmalltalkMethodContext(receiver, selector, temps, home) {
     that.temps = temps || {};
     that.homeContext = home;
 
+    that.copy = function() {
+	var home = that.homeContext;
+	if(home) {home = home.copy()}
+	return new SmalltalkMethodContext(
+	    that.receiver, 
+	    that.selector, 
+	    that.temps, 
+	    home
+	);
+    }
+
     that.newContext = function(receiver, selector, temps) {
 	var c = smalltalk.oldContexts.pop();
 	if(c) {
@@ -423,16 +444,16 @@ function SmalltalkMethodContext(receiver, selector, temps, home) {
     }
 
     that.removeYourself = function() {
-	thisContext = that.homeContext;
+	smalltalk.thisContext = that.homeContext;
+	that.homeContext = undefined;
 	smalltalk.oldContexts.push(that);
     }
 }
 
-/* Global Smalltalk objects. nil and thisContext shouldn't be globals. */
+/* Global Smalltalk objects. */
 
 var nil = new SmalltalkNil();
 var smalltalk = new Smalltalk();
-var thisContext = undefined;
 
 if(this.jQuery) {
     this.jQuery.allowJavaScriptCalls = true;
@@ -467,7 +488,3 @@ smalltalk.mapClassName("RegularExpression", "Kernel", RegExp, smalltalk.String);
 
 smalltalk.mapClassName("Error", "Kernel", Error, smalltalk.Object);
 smalltalk.mapClassName("MethodContext", "Kernel", SmalltalkMethodContext, smalltalk.Object);
-
-if(this.CanvasRenderingContext2D) {
-    smalltalk.mapClassName("CanvasRenderingContext", "Canvas", CanvasRenderingContext2D, smalltalk.Object);
-}

+ 0 - 1
js/jtalk.js

@@ -63,7 +63,6 @@
 
 	    loadIDEDependencies();
 	    loadCSS('jtalk.css');
-	    loadCSS('sunit.css');
 	    loadJS("boot.js");
 	    loadJS("Kernel.js");
 	    loadJS("Canvas.js");

+ 0 - 96
st/Canvas.st

@@ -1,75 +1,3 @@
-Object subclass: #CanvasRenderingContext
-	instanceVariableNames: ''
-	category: 'Canvas'!
-
-!CanvasRenderingContext methodsFor: 'drawing arcs'!
-
-arcTo: aPoint radius: aNumber startAngle: aNumber2 endAngle: aNumber3 anticlockwise: aBoolean
-	<self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean)>
-!
-
-arcTo: aPoint radius: aNumber
-	self arcTo: aPoint radius: aNumber startAngle: 0 endAngle: Number pi * 2 anticlockwise: false
-! !
-
-!CanvasRenderingContext methodsFor: 'drawing paths'!
-
-fillStyle: aString
-	<self.fillStyle = String(aString)>
-!
-
-beginPath
-	<self.beginPath()>
-!
-
-closePath
-	<self.closePath()>
-!
-
-fill
-	<self.fill()>
-!
-
-stroke
-	<self.stroke()>
-!
-
-moveTo: aPoint
-	<self.moveTo(aPoint._x(), aPoint._y())>
-!
-
-lineTo: aPoint
-	<self.lineTo(aPoint._x(), aPoint._y())>
-!
-
-strokeStyle: aString
-	<self.strokeStyle = String(aString)>
-!
-
-lineWidth: aNumber
-	<self.lineWidth = aNumber>
-! !
-
-!CanvasRenderingContext methodsFor: 'drawing rectangles'!
-
-fillRectFrom: aPoint to: anotherPoint
-	<self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())>
-!
-
-strokeRectFrom: aPoint to: anotherPoint
-	<self.strokeRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())>
-!
-
-clearRectFrom: aPoint to: anotherPoint
-	<self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())>
-! !
-
-!CanvasRenderingContext class methodsFor: 'instance creation'!
-
-tagBrush: aTagBrush
-	<return aTagBrush._element().getContext('2d')>
-! !
-
 Object subclass: #HTMLCanvas
 	instanceVariableNames: 'root'
 	category: 'Canvas'!
@@ -465,30 +393,6 @@ renderOn: html
     self
 ! !
 
-TagBrush subclass: #CanvasBrush
-	instanceVariableNames: ''
-	category: 'Canvas'!
-
-!CanvasBrush methodsFor: 'initialization'!
-
-initializeWithCanvas: aCanvas
-	canvas := aCanvas
-! !
-
-!CanvasBrush methodsFor: 'private'!
-
-createElement
-	<return document.createElement('canvas')>
-! !
-
-!CanvasBrush class methodsFor: 'instance creation'!
-
-canvas: aCanvas
-	^self new
-		initializeWithCanvas: aCanvas;
-		yourself
-! !
-
 !Object methodsFor: '*Canvas'!
 
 appendToBrush: aTagBrush

+ 20 - 4
st/Compiler.st

@@ -147,6 +147,7 @@ exportMethod: aMethod of: aClass on: aStream
 		nextPutAll: 'selector: ''', aMethod selector, ''',';lf;
 		nextPutAll: 'category: ''', aMethod category, ''',';lf;
 		nextPutAll: 'fn: ', aMethod fn compiledSource, ',';lf;
+		nextPutAll: 'args: ', aMethod arguments asJavascript, ','; lf;
 		nextPutAll: 'source: unescape(''', aMethod source escaped, '''),';lf;
 		nextPutAll: 'messageSends: ', aMethod messageSends asJavascript, ',';lf;
 		nextPutAll: 'referencedClasses: ['.
@@ -715,7 +716,7 @@ visitDynamicDictionaryNode: aNode
 ! !
 
 NodeVisitor subclass: #Compiler
-	instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector unknownVariables tempVariables messageSends referencedClasses classReferenced source'
+	instanceVariableNames: 'stream nestedBlocks earlyReturn currentClass currentSelector unknownVariables tempVariables messageSends referencedClasses classReferenced source argVariables'
 	category: 'Compiler'!
 
 !Compiler methodsFor: 'accessing'!
@@ -747,6 +748,7 @@ tempVariables
 knownVariables
 	^self pseudoVariables 
 		addAll: self tempVariables;
+		addAll: self argVariables;
 		yourself
 !
 
@@ -765,6 +767,10 @@ source
 
 source: aString
 	source := aString
+!
+
+argVariables
+	^argVariables copy
 ! !
 
 !Compiler methodsFor: 'compiling'!
@@ -843,6 +849,7 @@ initialize
 	stream := '' writeStream. 
 	unknownVariables := #().
 	tempVariables := #().
+	argVariables := #().
 	messageSends := #().
 	classReferenced := #()
 ! !
@@ -1115,7 +1122,7 @@ visit: aNode
 !
 
 visitMethodNode: aNode
-	| str currentSelector |
+	| str currentSelector | 
 	currentSelector := aNode selector asSelector.
 	nestedBlocks := 0.
 	earlyReturn := false.
@@ -1123,6 +1130,7 @@ visitMethodNode: aNode
 	referencedClasses := #().
 	unknownVariables := #().
 	tempVariables := #().
+	argVariables := #().
 	stream 
 	    nextPutAll: 'smalltalk.method({'; lf;
 	    nextPutAll: 'selector: "', aNode selector, '",'; lf.
@@ -1130,7 +1138,7 @@ visitMethodNode: aNode
 	stream nextPutAll: 'fn: function('.
 	aNode arguments 
 	    do: [:each | 
-		tempVariables add: each.
+		argVariables add: each.
 		stream nextPutAll: each]
 	    separatedBy: [stream nextPutAll: ', '].
 	stream 
@@ -1153,6 +1161,7 @@ visitMethodNode: aNode
 	stream 
 		nextPutAll: ',', String lf, 'messageSends: ';
 		nextPutAll: messageSends asJavascript, ','; lf;
+          	nextPutAll: 'args: ', argVariables asJavascript, ','; lf;
 		nextPutAll: 'referencedClasses: ['.
 	referencedClasses 
 		do: [:each | stream nextPutAll: each]
@@ -1288,7 +1297,9 @@ visitVariableNode: aNode
                                   		ifTrue: [stream nextPutAll: aNode value]
                                   		ifFalse: [stream nextPutAll: '(typeof ', aNode value, ' == ''undefined'' ? nil : ', aNode value, ')']]
                   		ifTrue: [
-                			stream nextPutAll:aNode value]]
+                                  	aNode value = 'thisContext'
+                                  		ifTrue: [stream nextPutAll: '(smalltalk.getThisContext())']
+                				ifFalse: [stream nextPutAll:aNode value]]]
 !
 
 visitJSStatementNode: aNode
@@ -1363,6 +1374,11 @@ Object subclass: #DoIt
 	instanceVariableNames: ''
 	category: 'Compiler'!
 
+!DoIt methodsFor: ''!
+
+doIt ^[1 fdsfds] value
+! !
+
 Node subclass: #DynamicArrayNode
 	instanceVariableNames: ''
 	category: 'Compiler'!

+ 248 - 70
st/IDE.st

@@ -6,6 +6,15 @@ Widget subclass: #TabManager
 
 tabs
     ^tabs ifNil: [tabs := Array new]
+!
+
+labelFor: aWidget
+	| label maxSize |
+	maxSize := 15.
+	label := aWidget label copyFrom: 0 to: (aWidget label size min: maxSize).
+	aWidget label size > maxSize ifTrue: [
+        	label := label, '...'].
+	^label
 ! !
 
 !TabManager methodsFor: 'actions'!
@@ -132,7 +141,7 @@ renderTabFor: aWidget on: html
 		with: 'x';
 		onClick: [self closeTab: aWidget]].
 	html span
-	    with: aWidget label;
+	    with: (self labelFor: aWidget);
 	    onClick: [self selectTab: aWidget]]
 !
 
@@ -195,6 +204,10 @@ hide
 
 remove
 	div asJQuery remove
+!
+
+close
+    TabManager current closeTab: self
 ! !
 
 !TabWidget methodsFor: 'rendering'!
@@ -768,8 +781,7 @@ renderBottomPanelOn: html
 	with: [
 	    sourceArea := SourceArea new.
 	    sourceArea renderOn: html.
-	    sourceArea
-		onKeyUp: [self updateStatus]]
+	    sourceArea onKeyUp: [self updateStatus]]
 !
 
 renderButtonsOn: html
@@ -969,7 +981,7 @@ open
 ! !
 
 TabWidget subclass: #Inspector
-	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea workspaceTextarea diveButton'
+	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea diveButton sourceArea'
 	category: 'IDE'!
 
 !Inspector methodsFor: 'accessing'!
@@ -996,6 +1008,10 @@ selectedVariable
 
 selectedVariable: aString
 	selectedVariable := aString
+!
+
+sourceArea
+	^sourceArea
 ! !
 
 !Inspector methodsFor: 'actions'!
@@ -1026,34 +1042,47 @@ renderBoxOn: html
 !
 
 renderTopPanelOn: html
-    html div 
-	class: 'top'; 
-	with: [
-	    variablesList := html ul class: 'jt_column variables'.
-	    valueTextarea := html textarea class: 'jt_column value'; at: 'readonly' put: 'readonly'.
-	    self
+	html div 
+		class: 'top'; 
+		with: [
+			variablesList := html ul class: 'jt_column variables'.
+			valueTextarea := html textarea class: 'jt_column value'; at: 'readonly' put: 'readonly'.
+                  	html div class: 'jt_buttons inspector'; with: [
+          			html button
+                  			class: 'jt_button inspector refresh';
+					with: 'Refresh';
+					onClick: [self refresh].
+				diveButton := html button 
+                  			class: 'jt_button inspector dive';
+					with: 'Dive'; 
+					onClick: [self dive]].
+	    		html div class: 'jt_clear'].
+	self
 		updateVariablesList;
 		updateValueTextarea.
-	    html div class: 'jt_clear']
 !
 
 renderBottomPanelOn: html
     html div
 	class: 'jt_sourceCode';
 	with: [
-	    workspaceTextarea := html textarea 
-		class: 'source';
-		at: 'spellcheck' put: 'false'.
-	    workspaceTextarea asJQuery call: 'tabby']
+	    sourceArea := SourceArea new
+          	receiver: object;
+          	onDoIt: [self refresh];
+          	yourself.
+            sourceArea renderOn: html]
 !
 
 renderButtonsOn: html
-	html button
-		with: 'Refresh';
-		onClick: [self refresh].
-	diveButton := html button 
-		with: 'Dive'; 
-		onClick: [self dive].
+	html button 
+		with: 'DoIt';
+		onClick: [self sourceArea doIt].
+	html button 
+		with: 'PrintIt';
+		onClick: [self sourceArea printIt].
+	html button 
+		with: 'InspectIt';
+		onClick: [self sourceArea inspectIt].
 	self updateButtons
 ! !
 
@@ -1282,7 +1311,7 @@ search: aString
 ! !
 
 Widget subclass: #SourceArea
-	instanceVariableNames: 'editor div'
+	instanceVariableNames: 'editor div receiver onDoIt'
 	category: 'IDE'!
 
 !SourceArea methodsFor: 'accessing'!
@@ -1331,6 +1360,22 @@ setEditorOn: aTextarea
 
 editor
 	^editor
+!
+
+receiver
+	^receiver ifNil: [DoIt new]
+!
+
+receiver: anObject
+	receiver := anObject
+!
+
+onDoIt: aBlock
+	onDoIt := aBlock
+!
+
+onDoIt
+	^onDoIt
 ! !
 
 !SourceArea methodsFor: 'actions'!
@@ -1340,20 +1385,21 @@ clear
 !
 
 doIt
-    | selection |
+    | selection result |
     editor somethingSelected
 	ifFalse: [selection := self currentLine]
 	ifTrue: [selection := self selection].
-    ^self eval: selection
+    result := self eval: selection.
+    self onDoIt ifNotNil: [self onDoIt value].
+    ^result
 !
 
 eval: aString
-    | compiler node |
-    compiler := Compiler new.
-    node := compiler parseExpression: aString.
-    node isParseFailure ifTrue: [
-	^self alert: node reason, ', position: ', node position].
-    ^compiler loadExpression: aString
+	| compiler  |
+      	compiler := Compiler new.
+      	[compiler parseExpression: aString] on: Error do: [:ex |
+		^self alert: ex messageText].
+	^(compiler load: 'doIt ^[', aString, '] value' forClass: DoIt) fn applyTo: self receiver arguments: #()
 !
 
 handleKeyDown: anEvent
@@ -1487,17 +1533,19 @@ Widget subclass: #ClassesListNode
 !ClassesListNode methodsFor: ''!
 
 renderOn: html
-	| li |
+	| li cssClass |
+	cssClass := ''.
 	li := html li 
 		onClick: [self browser selectClass: self theClass]. 
 	li asJQuery contents: self label.
 
 	self browser selectedClass = self theClass ifTrue:  [
-		li class: 'selected'].
+		cssClass := cssClass, ' selected'].
 
 	self theClass comment isEmpty ifFalse: [
-          	li class: 'commented'
-        ].
+          	cssClass := cssClass, ' commented'].
+
+	li class: cssClass.
 
 	self nodes do: [:each |
 		each renderOn: html]
@@ -1566,7 +1614,7 @@ on: aClass browser: aBrowser classes: aCollection level: anInteger
 ! !
 
 TabWidget subclass: #Debugger
-	instanceVariableNames: 'error selectedContext sourceArea ul'
+	instanceVariableNames: 'error selectedContext sourceArea ul ul2 inspector saveButton unsavedChanges selectedVariable selectedVariableName inspectButton'
 	category: 'IDE'!
 
 !Debugger methodsFor: 'accessing'!
@@ -1581,24 +1629,74 @@ error: anError
 
 label
 	^'[Debugger]'
+!
+
+source
+	^self method 
+		ifNil: ['Method doesn''t exist!!']
+		ifNotNil: [self method source]
+!
+
+method
+	^selectedContext receiver class methodAt: selectedContext selector
+!
+
+arguments
+	^self method 
+		ifNil: [selectedContext temps collect: [:each | nil]]
+		ifNotNil: [self method arguments]
+!
+
+receiver
+	^selectedContext receiver
 ! !
 
 !Debugger methodsFor: 'actions'!
 
 selectContext: aContext
 	selectedContext := aContext.
-	self updateContextsList.
-	self updateSourceArea
-! !
+	selectedVariable := nil.
+	selectedVariableName := nil.
+	self 
+		updateContextsList;
+          	updateSourceArea;
+          	updateInspector;
+		updateVariablesList;
+		updateStatus
+!
 
-!Debugger methodsFor: 'rendering'!
+proceed
+	self close.
+	selectedContext receiver perform: selectedContext selector withArguments: selectedContext temps
+!
 
-renderBoxOn: html
-    self 
-	renderTopPanelOn: html;
-	renderBottomPanelOn: html
+save
+	| protocol |
+	protocol := (selectedContext receiver class methodDictionary at: selectedContext selector) category.
+	selectedContext receiver class compile: sourceArea val category: protocol.
+	self updateStatus
+!
+
+selectVariable: anObject named: aString
+	selectedVariable := anObject.
+	selectedVariableName := aString.
+	inspector contents: [:html | html with: anObject printString].
+	self updateVariablesList
 !
 
+inspectSelectedVariable
+	selectedVariable inspect
+! !
+
+!Debugger methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	unsavedChanges = false
+! !
+
+!Debugger methodsFor: 'rendering'!
+
 renderTopPanelOn: html
 	selectedContext := self error context.
 	html div 
@@ -1608,8 +1706,8 @@ renderTopPanelOn: html
 				class: 'label';
 				with: self error messageText.
 	    		ul := html ul 
-			class: 'jt_column debugger contexts';
-			with: [self renderContext: self error context on: html]]
+				class: 'jt_column debugger contexts';
+				with: [self renderContext: self error context on: html]]
 !
 
 renderContext: aContext on: html
@@ -1624,12 +1722,51 @@ renderContext: aContext on: html
 !
 
 renderBottomPanelOn: html
-    html div
-	class: 'jt_sourceCode';
-	with: [
-	    sourceArea := SourceArea new.
-	    sourceArea renderOn: html].
-    self updateSourceArea
+	html div
+		class: 'jt_sourceCode debugger';
+		with: [
+			sourceArea := SourceArea new.
+              		sourceArea renderOn: html].
+	ul2 := html ul class: 'jt_column debugger variables'.
+	inspector := html div class: 'jt_column debugger inspector'.
+	sourceArea
+		onKeyUp: [self updateStatus]
+!
+
+renderButtonsOn: html
+	saveButton := html button
+		with: 'Save';
+		onClick: [self save].
+	html button
+		with: 'DoIt';
+		onClick: [sourceArea doIt].
+	html button
+		with: 'PrintIt';
+		onClick: [sourceArea printIt].
+	html button
+		with: 'InspectIt';
+		onClick: [sourceArea inspectIt].
+	html button 
+		with: 'Proceed';
+		onClick: [self proceed].
+	html button
+		with: 'Abandon';
+		onClick: [self close].
+	inspectButton := html button
+		class: 'jt_button debugger inspect';
+		with: 'Inspect';
+		onClick: [self inspectSelectedVariable].
+	 self 
+		updateSourceArea;
+		updateStatus;
+		updateVariablesList;
+		updateInspector
+!
+
+renderBoxOn: html
+    self 
+	renderTopPanelOn: html;
+	renderBottomPanelOn: html
 ! !
 
 !Debugger methodsFor: 'testing'!
@@ -1646,7 +1783,47 @@ updateContextsList
 !
 
 updateSourceArea
-	 sourceArea val: (selectedContext receiver class methodAt: selectedContext selector) source
+	 sourceArea val: self source
+!
+
+updateStatus
+	sourceArea val = self source
+		ifTrue: [
+			saveButton ifNotNil: [
+				saveButton at: 'disabled' put: true].
+    			unsavedChanges := false]
+		ifFalse: [
+			saveButton ifNotNil: [
+    				saveButton removeAt: 'disabled'].
+    			unsavedChanges := true]
+!
+
+updateInspector
+	inspector contents: [:html |]
+!
+
+updateVariablesList
+	ul2 contents: [:html | | li |
+          	li := html li 
+			with: 'self';
+			onClick: [self selectVariable: self receiver named: 'self'].
+                selectedVariableName = 'self' ifTrue: [
+                  	li class: 'selected'].
+                self arguments withIndexDo: [:each :index | | param |
+                        param := selectedContext temps at: index.
+                        li := html li 
+				with: each;
+				onClick: [self selectVariable: param named: each].
+                         selectedVariableName = each ifTrue: [
+				li class: 'selected']].
+                self receiver class allInstanceVariableNames do: [:each | | ivar |
+                        ivar := self receiver instVarAt: each.
+                        li := html li 
+				with: each;
+				onClick: [self selectVariable: ivar named: each].
+                         selectedVariableName = each ifTrue: [
+				li class: 'selected']]].
+	selectedVariable ifNil: [inspectButton at: 'disabled' put: true] ifNotNil: [inspectButton removeAt: 'disabled']
 ! !
 
 ErrorHandler subclass: #DebugErrorHandler
@@ -1712,7 +1889,7 @@ TabWidget subclass: #TestRunner
 !TestRunner methodsFor: 'accessing'!
 
 label
-    ^'[Test runner]'
+    ^'[SUnit]'
 !
 
 categories
@@ -1746,11 +1923,6 @@ progressBar
 	^progressBar ifNil: [progressBar := ProgressBar new]
 !
 
-selectedMethods
-	^selectedMethods ifNil: [self selectedClasses collect: [:each |
-		each methodDictionary keys select: [:key |  key beginsWith: 'test' ]]]
-!
-
 statusInfo
 	^self printTotal, self printPasses, self printErrors, self printFailures
 !
@@ -1759,11 +1931,11 @@ result
 	^result
 !
 
-failedMethods
-	self result failures collect: [:each |
-		html li 
-			class: 'failures';
-			with: each]
+testCases
+	| testCases |
+	testCases := #().
+	self selectedClasses do: [:each | testCases addAll: each buildSuite].
+	^testCases
 ! !
 
 !TestRunner methodsFor: 'actions'!
@@ -1809,12 +1981,16 @@ run: aCollection
 		updateStatusDiv;
 		updateMethodsList.
 	self progressBar updatePercent: 0.
-	result total: (aCollection inject: 0 into: [:acc :each | acc + each methods size]).
+	result total: aCollection size.
 	aCollection do: [:each | 
 		[each runCaseFor: result.
 		self progressBar updatePercent: result runs / result total * 100.
 		self updateStatusDiv.
 		self updateMethodsList] valueWithTimeout: 100].
+!
+
+performFailure: aTestCase
+	aTestCase perform: aTestCase selector
 ! !
 
 !TestRunner methodsFor: 'initialization'!
@@ -1835,7 +2011,7 @@ printFailures
 !
 
 printPasses
-	^(((self result total) - (self result errors size + (self result failures size))) asString) , ' passes, '
+	^(self result total - self result errors size - self result failures size) asString , ' passes, '
 !
 
 printTotal
@@ -1854,7 +2030,7 @@ renderBoxOn: html
 renderButtonsOn: html
     html button
 	with: 'Run selected';
-	onClick: [self run: (self selectedClasses collect: [:each | each new])]
+	onClick: [self run: self testCases]
 !
 
 renderCategoriesOn: html
@@ -1879,14 +2055,16 @@ renderFailuresOn: html
 	self result failures do: [:each |
 		html li 
 			class: 'failures';
-			with: each]
+			with: each class name, ' >> ', each selector;
+                        onClick: [self performFailure: each]]
 !
 
 renderErrorsOn: html
 	self result errors do: [:each |
 		html li 
 			class: 'errors';
-			with: each]
+			with: each class name, ' >> ', each selector;
+                        onClick: [self performFailure: each]]
 ! !
 
 !TestRunner methodsFor: 'testing'!
@@ -1934,8 +2112,8 @@ updateClassesList
 
 updateMethodsList
 	methodsList contents: [:html |
-		self renderFailuresOn: html.
-                self renderErrorsOn: html]
+		self renderErrorsOn: html.
+                self renderFailuresOn: html]
 !
 
 updateStatusDiv

+ 5 - 6
st/Kernel.st

@@ -2,11 +2,6 @@ nil subclass: #Object
 	instanceVariableNames: ''
 	category: 'Kernel'!
 
-!Object methodsFor: ''!
-
-foo ^ self
-! !
-
 !Object methodsFor: 'accessing'!
 
 yourself
@@ -579,6 +574,10 @@ methodClass
 
 referencedClasses
 	^self basicAt: 'referencedClasses'
+!
+
+arguments
+	<return self.args || []>
 ! !
 
 Object subclass: #Number
@@ -1975,7 +1974,7 @@ context
 !Error methodsFor: 'signaling'!
 
 signal
-	<self.context = thisContext; self.smalltalkError = true; throw(self)>
+	<self.context = smalltalk.getThisContext(); self.smalltalkError = true; throw(self)>
 ! !
 
 !Error class methodsFor: 'instance creation'!

+ 46 - 29
st/SUnit.st

@@ -1,25 +1,19 @@
 Object subclass: #TestCase
-	instanceVariableNames: 'testedClass'
+	instanceVariableNames: 'testSelector'
 	category: 'SUnit'!
 
 !TestCase methodsFor: 'accessing'!
 
-testedClass
-	^testedClass
+setTestSelector: aSelector
+	testSelector := aSelector
 !
 
-testedClass: aClass
-	testedClass := aClass
+selector
+	^testSelector
 ! !
 
 !TestCase methodsFor: 'private'!
 
-cleanUpInstanceVariables
-	self class instanceVariableNames do: [ :name |
-		name = 'testSelector' ifFalse: [
-			self instVarAt: name put: nil ]]
-!
-
 signalFailure: aString
 	TestFailure new
 		messageText: aString;
@@ -34,28 +28,17 @@ setUp
 tearDown
 !
 
-methods
-	^self class methodDictionary keys select: [:each | each match: '^test']
-!
-
 runCaseFor: aTestResult
-	[self setUp.
-	self performTestFor: aTestResult]
-		on: Error
-		do: [:ex |
-			self tearDown.
-			self cleanUpInstanceVariables.
-			ex signal].
-	self tearDown.
-	self cleanUpInstanceVariables
+	self setUp.
+	aTestResult increaseRuns.
+	self performTestFor: aTestResult.
+	self tearDown
 !
 
 performTestFor: aResult
-	self methods do: [:each | 
-		[[self perform: each]
-			on: TestFailure do: [:ex | aResult addFailure: self class name, '>>', each, ': ', ex messageText]]
-			on: Error do: [:ex | aResult addError: self class name, '>>', each, ': ', ex messageText].
-		aResult increaseRuns]
+	[[self perform: self selector]
+		on: TestFailure do: [:ex | aResult addFailure: self]]
+		on: Error do: [:ex | aResult addError: self]
 ! !
 
 !TestCase methodsFor: 'testing'!
@@ -76,6 +59,40 @@ assert: aBoolean description: aString
 	aBoolean ifFalse: [self signalFailure: aString]
 ! !
 
+!TestCase class methodsFor: 'accessing'!
+
+testSelectors
+	^self methodDictionary keys select: [:each | each match: '^test']
+!
+
+selector: aSelector
+	^self new
+		setTestSelector: aSelector;
+		yourself
+!
+
+lookupHierarchyRoot
+	^TestCase
+!
+
+allTestSelectors
+	| selectors |
+	selectors := self testSelectors.
+	self shouldInheritSelectors ifTrue: [
+		selectors addAll: self superclass allTestSelectors].
+	^selectors
+!
+
+buildSuite
+	^self allTestSelectors collect: [:each | self selector: each]
+! !
+
+!TestCase class methodsFor: 'testing'!
+
+shouldInheritSelectors
+	^self ~= self lookupHierarchyRoot
+! !
+
 Error subclass: #TestFailure
 	instanceVariableNames: ''
 	category: 'SUnit'!

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác