Prechádzať zdrojové kódy

- (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 rokov pred
rodič
commit
797954d0e4
22 zmenil súbory, kde vykonal 1653 pridanie a 1024 odobranie
  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: []

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 6 - 4
js/Compiler.deploy.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 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(

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 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);

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 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'!

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov