Browse Source

merge upstream/master

Laurent Laffont 13 years ago
parent
commit
f079650f5a
22 changed files with 1322 additions and 871 deletions
  1. 209 162
      css/jtalk.css
  2. BIN
      images/off.png
  3. BIN
      images/offHover.png
  4. BIN
      images/sprite.png
  5. BIN
      images/tinylogo.png
  6. 11 11
      js/Canvas.deploy.js
  7. 19 19
      js/Canvas.js
  8. 0 11
      js/Compiler.deploy.js
  9. 2 18
      js/Compiler.js
  10. 2 2
      js/Examples.js
  11. 76 50
      js/IDE.deploy.js
  12. 133 97
      js/IDE.js
  13. 80 80
      js/JQuery.deploy.js
  14. 128 128
      js/JQuery.js
  15. 142 44
      js/Kernel.deploy.js
  16. 216 78
      js/Kernel.js
  17. 33 33
      js/SUnit.deploy.js
  18. 51 51
      js/SUnit.js
  19. 57 12
      js/boot.js
  20. 0 0
      st/Compiler.st
  21. 89 49
      st/IDE.st
  22. 74 26
      st/Kernel.st

+ 209 - 162
css/jtalk.css

@@ -2,80 +2,132 @@ body.jtalkBody {
     margin-bottom: 350px;
 }
 
-#jtalkTabs {
-    position: fixed;
-    font-family: helvetica,arial,sans;
-    font-size: 12px;
-    line-height: 1;
-    z-index: 1001;
-    bottom: 0;
-    left: 0;
-    right: 0;
+#jtalkTabs, #jtalk .jt_tabs {
     margin: 0;
-    padding: 0 0 3px 0;
-    height: 20px;
-    background: transparent;
-}
-#jtalkTabs li {
-    list-style-type: none;
-    display: inline;
-    background: #c8c8c8;
+    padding: 0;
+    background: url("../images/sprite.png") #DBD9C9 0 -27px;
+    height: 22px;
+    width: 100%;
+    list-style: none;
     font-weight: bold;
-    color: #414141;
-    padding: 4px;
-    border: 1px solid #acacac;
+}
+
+#jtalkTabs li, #jtalk .jt_tabs li {
+    padding: 0 1px;
     cursor: pointer;
-    line-height: 14px;
-    margin: 0;
+    color: #565656;
 }
 
-#jtalkTabs li.selected {
-    background: #dbdbdb;
-    border-top: 0 none;
-    padding: 5px 4px;
-    color: #222;
+#jtalk .ltab, #jtalk .rtab, #jtalk .mtab {
+    height: 22px;
+    float: left;
 }
 
-#jtalkTabs li span.close {
-    margin-left: 3px;
-    margin-right: 5px;
+#jtalk .ltab, #jtalk .rtab {
+    width: 8px;
 }
 
-#jtalkTabs li span.close:hover {
-    color: #e72a2a;
+#jtalk .rtab {
+    margin-right: 1px;
 }
 
-#jtalkTabs li.closeAll {
-    -moz-border-radius: 10px;
-    -webkit-border-radius: 10px;
-    border-radius: 10px;
-    background: #ef3b3b;
-    color: #e3e3e3;
-    font-weight: bold;
-    border: 1px solid #ac1616;
-    margin: 4px;
-    padding: 2px 6px;
-    font-size: 10px;
+#jtalk .mtab {
+    line-height: 20px;
+}
+
+#jtalkTabs li:hover .ltab,
+#jtalk .jt_tabs li:hover .ltab {
+    background: url("../images/sprite.png") -16px -96px;
 }
 
-#jtalkTabs li.closeAll:hover {		
-    background: #e72a2a;
+#jtalkTabs li:hover .mtab,
+#jtalk .jt_tabs li:hover .mtab {
+    background: url("../images/sprite.png") 0 -73px;
+}
+
+#jtalkTabs li:hover .rtab,
+#jtalk .jt_tabs li:hover .rtab {
+    background: url("../images/sprite.png") -24px -96px;
+}
+
+#jtalkTabs li.selected,
+#jtalk .jt_tabs li.selected {
+    color: #111;
+}
+
+#jtalkTabs li.selected .ltab,
+#jtalk .jt_tabs li.selected .ltab {
+    background: url("../images/sprite.png") 0px -96px;
+}
+
+#jtalkTabs li.selected .mtab,
+#jtalk .jt_tabs li.selected .mtab {
+    background: url("../images/sprite.png") 0 -50px;
+}
+
+#jtalkTabs li.selected .rtab,
+#jtalk .jt_tabs li.selected .rtab {
+    background: url("../images/sprite.png") -8px -96px;
+}
+
+#jtalkTabs li .close {
+    margin-right: 5px;
+    color: #aaa;
 }
 
 #jtalk {
        position: fixed;
-       bottom: 27px;
+       bottom: 0;
        left: 0;
        right: 0;
        height: 330px;
        z-index: 1000;
 }
 
+#jtalk, #jtalk button, #jtalk input, #jtalk select {
+       font-family: Lucida Grande, Tahoma, sans-serif;
+       font-size: 11px;
+}
+
+#jtalk #logo {
+    position: absolute;
+    top: 3px;
+    left: 8px;
+    width: 22px;
+    height: 20px;
+    background: url("../images/tinylogo.png") top left no-repeat;
+}
+
+#jtalk #jt_toolbar {
+    height: 27px;
+    background: url("../images/sprite.png") 0 0;
+}
+
+#jtalk #jt_toolbar input {
+    margin-left: 50px;
+    width: 250px;
+}
+
+#jtalk #jt_toolbar #jt_close {
+    position: absolute;
+    right: 4px;
+    top: 6px;
+    width: 16px;
+    height: 16px;
+    background: url('../images/off.png');
+    cursor: pointer;
+}
+
+#jtalk #jt_toolbar #jt_close:hover {
+    background: url('../images/offHover.png');
+}
+
+
 #jtalk .ui-resizable-handle {
-    background-color: #a8a8a8;
+    background-color: transparent;
     top: 0;
     cursor: row-resize;
-    height: 4px;
+    height: 5px;
     left: 0;
     position: absolute;
     right: 0;
@@ -83,35 +135,35 @@ body.jtalkBody {
 }
 
 .jtalkTool {
-    width: 98%;
-    background: #dbdbdb;
-    border-style: solid;
-    border-width: 1px;
-    border-color: #a8a8a8;
-    color: @dark;
-    font-family: Arial, Helvetica, sans;
-    font-size: 12px;
-    line-height: 1.5em;
-    padding: 15px 1%;
+    width: 100%;
+    color: #333;
+    line-height: 1.3em;
+    padding: 0;
+    margin: 0;
     position: absolute;
     bottom: 0;
     left: 0;
-    top: 4px;
+    top: 49px;
     z-index: 1000;
+    background: white;
 }
 
 .jtalkTool .jt_box {
-    width: 98%;
+    width: 100%;
     margin: 0;
     position: absolute;
-    top: 15px;
-    bottom: 45px;
+    top: 0;
+    bottom: 27px;
 }
 
 .jtalkTool .jt_buttons {
     position: absolute;
-    width: 98%;
-    bottom: 15px;    
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 27px;
+    line-height: 27px;
+    background: url("../images/sprite.png") 0 0 repeat;
 }
 
 .jtalkTool .jt_buttons .right {
@@ -122,36 +174,65 @@ body.jtalkBody {
     font-weight: bold;
 }
 
+
+.jtalkTool button {
+    border: 1px solid transparent;
+    background: transparent;
+    padding: 2px 4px;
+    margin-left: 4px;
+    cursor: pointer;
+}
+
+.jtalkTool button:hover {
+    border-top: 1px solid #fff;
+    border-left: 1px solid #fff;
+    border-right: 1px solid #bbb;
+    border-bottom: 1px solid #bbb;
+}
+
+.jtalkTool  button:active {
+    border-top: 1px solid #bbb;
+    border-left: 1px solid #bbb;
+    border-right: 1px solid #fff;
+    border-bottom: 1px solid #fff;
+    background: #ddd;
+}
+
+.jtalkTool select, #jtalk input {
+    border-top: 1px solid #bbb;
+    border-left: 1px solid #bbb;
+    border-right: 1px solid #fff;
+    border-bottom: 1px solid #fff;
+    background: #fff;
+    margin-top: 0;
+    margin-bottom: 0;
+    padding-top: 0;
+    padding-bottom: 0;
+}
+
 .jtalkTool li {
     margin: 0;
     padding: 0;
 }
     
-.jtalkTool .jt_buttons button,
-.jtalkTool .jt_buttons select {
-    font-size: 12px;
-}
-
 .jtalkTool .source {
     height: 100%;
 }
 
 .jtalkTool textarea,
 .jtalkTool input {
-    border: 1px solid;
-    border-color: #a8a8a8;
+    border: 0 none;
     font-family: Arial, Helvetica, sans;
-    line-height: 1.2em;
-    font-size: 13px;
+    line-height: 1.3em;
+    font-size: 12px;
     position: relative;
     padding: 0;
 }
 
 .jtalkTool .CodeMirror {
-    border: 1px solid;
-    border-color: #a8a8a8;
+    border: 0 none;
     font-family: Arial, Helvetica, sans;
-    font-size: 13px;
+    font-size: 12px;
     line-height: 1.3em;
     height: 100%;
     background: white;
@@ -177,42 +258,28 @@ body.jtalkBody {
 
 .jtalkTool .jt_commit {
     position: absolute;
-    top: 140px;
+    top: 129px;
     left: 0;
-    font-size: 12px;
+    z-index: 1;
 }
 
 .jtalkTool .jt_column {
-    width: 24%;
+    width: 25%;
     padding: 0;
     margin: 0;
     float: left;
-    border: 1px solid;
-    border-color: #a8a8a8;
+    outline: 1px solid #aaa;
+    border: 0 none;
     height: 130px;
-    overflow-y: scroll;
+    overflow-y: auto;
     background: #fff;
+    color: #111;
     position: absolute;
     top: 0;
 }
 
-.jtalkTool .jt_column.value {
-    left: 25.2%;
-    width: 74.8%;
-}
-
-.jtalkTool .jt_column.browser {
-    top: 30px;
-}
-
-.jtalkTool .jt_column.categories {
-    left: 0%;
-    height: 105px;
-}
-
 .jtalkTool .jt_column.classes {
-    height: 105px;
-    left: 25.2%
+    left: 25%
 }
 
 .jtalkTool .jt_column.classes ul {
@@ -225,18 +292,18 @@ body.jtalkBody {
 }
 
 .jtalkTool .jt_column.protocols {
-    left: 50.4%
+    left: 50%
 }
 
 .jtalkTool .jt_column.methods {
-    left: 75.6%
+    left: 75%
 }
 
 .jtalkTool .jt_column li {
     list-style-type: none;
     padding-left: 5px;
     cursor: pointer;
-    color: #333;
+    color: #111;
     font-weight: bold;
 }
 
@@ -250,46 +317,18 @@ body.jtalkBody {
     color: white;
 }
 
-.jtalkTool .jt_tabs {
-    top: 136px;
+#jtalk .jtalkTool .jt_tabs {
+    top: 130px;
     position: absolute;
-    left: 25.2%;
-    padding: 0;
-    margin: 0;
-}
-
-.jtalkTool .jt_tabs li {
-    color: #666;
-    font-weight: bold;
-    cursor: pointer;
-    list-style-type: none;
-    float: left;
-    padding: 2px 4px;
-    margin-right: 2px;
-    background: #ccc;
-    border: 1px solid #a8a8a8;
-    -moz-border-radius-bottomleft: 8px;
-    -moz-border-radius-bottomright: 8px;
-    -webkit-border-bottom-left-radius: 8px;
-    -webkit-border-bottom-right-radius: 8px;
-    border-bottom-left-radius: 8px;
-    border-bottom-right-radius: 8px;
-    height: 20px;
-    line-height: 18px;
 }
 
-.jtalkTool .jt_tabs li.selected,
-.jtalkTool .jt_tabs li.selected:hover {
-    background: white;
-    border: 1px solid #b3b3b3;
-    border-top: 1px solid white;
-    color: #222;
+#jtalk .jtalkTool .jt_tabs.jt_browser {
+    padding-left: 25%;
 }
 
-
 .jtalkTool .jt_sourceCode {
     position: absolute;
-    top: 175px;
+    top: 152px;
     bottom: 0;
     left: 0;
     right: 0;
@@ -303,39 +342,42 @@ body.jtalkBody {
 /* Debugger & inspector */
 
 .jtalkTool .jt_box .label {
-	width: 98%;
+	width: 100%;
 	font-weight: bold;
 	text-align: center;
 	position: absolute;
-	line-height: 1.2em;
+	line-height: 1.5em;
 	font-size: 16px;
 	color: red;
+	background: url("../images/sprite.png") top left repeat;
+	height: 27px;
 }
 
 .jtalkTool .jt_box .jt_column.debugger {
-    top: 175px;
+    top: 158px;
 }
 
 .jtalkTool .jt_box .jt_column.debugger.contexts {
-    top: 30px;
+    top: 27px;
     width: 100%;
 }
 
 .jtalkTool .jt_sourceCode.debugger {
     width: 60%;
+    top: 158px;
 }
 
 .jtalkTool .jt_box .jt_column.debugger.variables {
     width: 10%;
-    left: 61%;
+    left: 60%;
     bottom: 0;
     position: absolute;
     height: auto;
 }
 
 .jtalkTool .jt_box .jt_column.debugger.inspector {
-    width: 28%;
-    left: 72%;
+    width: 30%;
+    left: 70%;
     bottom: 0;
     position: absolute;
     height: auto;
@@ -343,12 +385,17 @@ body.jtalkBody {
 
 .jtalkTool .jt_button.debugger.inspect {
     position: absolute;
-    left: 61%;
+    left: 60%;
+}
+
+.jtalkTool .jt_column.value {
+    left: 25%;
+    width: 75%;
 }
 
 .jtalkTool .jt_buttons.inspector {
     position: absolute;
-    top: 140px;
+    top: 130px;
 }
 
 
@@ -361,18 +408,18 @@ body.jtalkBody {
 .jtalkTool .jt_box .jt_column.implementors,
 .jtalkTool .jt_box .jt_column.senders,
 .jtalkTool .jt_box .jt_column.referenced_classes {
-	top: 30px;
-	height: 100%;
-	bottom: 0px;
-	width: 33%;
+	top: 20px;
+	height: auto;
+	bottom: 0;
+	width: 33.333%;
 }
 
 .jtalkTool .jt_box .jt_column.senders {
-	left: 33.6%
+	left: 33.333%
 }
 
 .jtalkTool .jt_box .jt_column.referenced_classes {
-        left: 67.3%
+        left: 66.67%
 }
 
 .jtalkTool .jt_box .jt_column.implementors .column_label, 
@@ -416,10 +463,10 @@ body.jtalkBody {
 
 .jtalkTool .sunit.status {
 	position: absolute;
-	left: 50.4%;
-	width: 49%;
+	left: 50%;
+	width: 50%;
+	outline: 1px solid #aaa;
 	background: white;
-	border: 1px solid #a8a8a8;
 	height: 40px
 }
 
@@ -440,11 +487,11 @@ body.jtalkBody {
 
 .jtalkTool .progress_bar {
 	position: absolute;
-	left: 50.4%;
-	width: 49%;
-	top: 50px;
-	border: 1px solid #a8a8a8;
+	left: 50%;
+	width: 50%;
+	top: 40px;
 	background: white;
+	outline: 1px solid #aaa;
 	min-height: 20px
 }
 
@@ -453,17 +500,17 @@ body.jtalkBody {
 	min-height: 20px;
 }
 
-.jtalkTool .jt_column.sunit.methods {
-	left: 50.4%;
+.jtalkTool .jt_column.results.sunit {
+	left: 50%;
 	height: auto;
-        width: 49%;
-        top: 80px;
+        width: 50%;
+        top: 62px;
         bottom: 0;
 }
 
-.jtalkTool .jt_column.sunit.methods .errors {
+.jtalkTool .jt_column.sunit.results .errors {
     color: red;
 }
 
-.jtalkTool .jt_column.sunit.methods ul {padding: 0; margin: 0}
+/*.jtalkTool .jt_column.sunit.results ul {padding: 0; margin: 0}*/
 

BIN
images/off.png


BIN
images/offHover.png


BIN
images/sprite.png


BIN
images/tinylogo.png


+ 11 - 11
js/Canvas.deploy.js

@@ -541,6 +541,17 @@ return self;}
 }),
 smalltalk.TagBrush);
 
+smalltalk.addMethod(
+'_empty',
+smalltalk.method({
+selector: 'empty',
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
+return self;}
+}),
+smalltalk.TagBrush);
+
 smalltalk.addMethod(
 '_at_put_',
 smalltalk.method({
@@ -807,17 +818,6 @@ return self;}
 }),
 smalltalk.TagBrush);
 
-smalltalk.addMethod(
-'_empty',
-smalltalk.method({
-selector: 'empty',
-fn: function (){
-var self=this;
-smalltalk.send(smalltalk.send(self, "_asJQuery", []), "_empty", []);
-return self;}
-}),
-smalltalk.TagBrush);
-
 
 smalltalk.addMethod(
 '_fromString_canvas_',

+ 19 - 19
js/Canvas.js

@@ -60,7 +60,7 @@ 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: [smalltalk.nil]
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
@@ -76,7 +76,7 @@ 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: [smalltalk.nil]
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
@@ -92,7 +92,7 @@ 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: [smalltalk.nil]
+referencedClasses: []
 }),
 smalltalk.HTMLCanvas);
 
@@ -781,6 +781,22 @@ referencedClasses: []
 }),
 smalltalk.TagBrush);
 
+smalltalk.addMethod(
+'_empty',
+smalltalk.method({
+selector: 'empty',
+category: 'adding',
+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: []
+}),
+smalltalk.TagBrush);
+
 smalltalk.addMethod(
 '_at_put_',
 smalltalk.method({
@@ -1167,22 +1183,6 @@ referencedClasses: []
 }),
 smalltalk.TagBrush);
 
-smalltalk.addMethod(
-'_empty',
-smalltalk.method({
-selector: 'empty',
-category: 'adding',
-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: []
-}),
-smalltalk.TagBrush);
-
 
 smalltalk.addMethod(
 '_fromString_canvas_',

+ 0 - 11
js/Compiler.deploy.js

@@ -1796,17 +1796,6 @@ smalltalk.Compiler.klass);
 
 
 smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
-smalltalk.addMethod(
-'_doIt',
-smalltalk.method({
-selector: 'doIt',
-fn: function (){
-var self=this;
-return smalltalk.send((function(){return smalltalk.send((1), "_fdsfds", []);}), "_value", []);
-return self;}
-}),
-smalltalk.DoIt);
-
 
 
 smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');

+ 2 - 18
js/Compiler.js

@@ -2059,7 +2059,7 @@ var self=this;
 return smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_parse_", [aString]);
 return self;},
 args: ["aString"],
-source: unescape('parse%3A%20aString%0A%20%20%20%20%5ESmalltalk%20current%20parse%3A%20aString%20'),
+source: unescape('parse%3A%20aString%0A%20%20%20%20%5ESmalltalk%20current%20parse%3A%20aString'),
 messageSends: ["parse:", "current"],
 referencedClasses: [smalltalk.Smalltalk]
 }),
@@ -2175,7 +2175,7 @@ return self;},
 args: [],
 source: unescape('recompileAll%0A%09Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%09Transcript%20show%3A%20each%3B%20cr.%0A%09%09%5Bself%20recompile%3A%20each%5D%20valueWithTimeout%3A%20100%5D'),
 messageSends: ["do:", "classes", "current", "show:", "cr", "valueWithTimeout:", "recompile:"],
-referencedClasses: [smalltalk.Smalltalk,smalltalk.Transcript]
+referencedClasses: [smalltalk.Smalltalk]
 }),
 smalltalk.Compiler);
 
@@ -2511,22 +2511,6 @@ smalltalk.Compiler.klass);
 
 
 smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
-smalltalk.addMethod(
-'_doIt',
-smalltalk.method({
-selector: 'doIt',
-category: '',
-fn: function (){
-var self=this;
-return smalltalk.send((function(){return smalltalk.send((1), "_fdsfds", []);}), "_value", []);
-return self;},
-args: [],
-source: unescape('doIt%20%5E%5B1%20fdsfds%5D%20value'),
-messageSends: ["value", "fdsfds"],
-referencedClasses: []
-}),
-smalltalk.DoIt);
-
 
 
 smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');

+ 2 - 2
js/Examples.js

@@ -288,7 +288,7 @@ return self;},
 args: [],
 source: unescape('newPiece%0A%09movingPiece%20%3A%3D%20TetrisPiece%20atRandom'),
 messageSends: ["atRandom"],
-referencedClasses: [smalltalk.TetrisPiece]
+referencedClasses: []
 }),
 smalltalk.Tetris);
 
@@ -375,7 +375,7 @@ 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]
+referencedClasses: []
 }),
 smalltalk.Tetris);
 

File diff suppressed because it is too large
+ 76 - 50
js/IDE.deploy.js


File diff suppressed because it is too large
+ 133 - 97
js/IDE.js


+ 80 - 80
js/JQuery.deploy.js

@@ -353,232 +353,232 @@ return self;}
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_do_',
+'_fadeIn',
 smalltalk.method({
-selector: 'do:',
-fn: function (aBlock){
+selector: 'fadeIn',
+fn: function (){
 var self=this;
-smalltalk.send(self, "_elementsDo_", [(function(anElement){return smalltalk.send(aBlock, "_value_", [smalltalk.send((smalltalk.JQuery || JQuery), "_fromElement_", [anElement])]);})]);
+smalltalk.send(self, "_call_", ["fadeIn"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_focus',
+'_slideDown',
 smalltalk.method({
-selector: 'focus',
+selector: 'slideDown',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_call_", ["focus"]);
+smalltalk.send(self, "_call_", ["slideDown"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_show',
+'_fadeInSlow',
 smalltalk.method({
-selector: 'show',
+selector: 'fadeInSlow',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_call_", ["show"]);
+smalltalk.send(self, "_call_withArgument_", ["fadeIn", "slow"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_hide',
+'_fadeOut',
 smalltalk.method({
-selector: 'hide',
+selector: 'fadeOut',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_call_", ["hide"]);
+smalltalk.send(self, "_call_", ["fadeOut"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_remove',
+'_fadeOutSlow',
 smalltalk.method({
-selector: 'remove',
+selector: 'fadeOutSlow',
 fn: function (){
 var self=this;
-smalltalk.send(self, "_call_", ["remove"]);
+smalltalk.send(self, "_call_withArgument_", ["fadeOut", "slow"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_on_do_',
+'_slideUp',
 smalltalk.method({
-selector: 'on:do:',
-fn: function (anEventString, aBlock){
+selector: 'slideUp',
+fn: function (){
 var self=this;
-self['@jquery'].bind(anEventString, function(e){aBlock(e, self)});
+smalltalk.send(self, "_call_", ["slideUp"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_removeEvents_',
+'_fadeOut_do_',
 smalltalk.method({
-selector: 'removeEvents:',
-fn: function (aString){
+selector: 'fadeOut:do:',
+fn: function (aString, aBlock){
 var self=this;
-smalltalk.send(self, "_call_withArgument_", ["unbind", aString]);
+self['@jquery'].fadeOut(aString, aBlock);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_initializeWithJQueryObject_',
+'_do_',
 smalltalk.method({
-selector: 'initializeWithJQueryObject:',
-fn: function (anObject){
+selector: 'do:',
+fn: function (aBlock){
 var self=this;
-self['@jquery']=anObject;
+smalltalk.send(self, "_elementsDo_", [(function(anElement){return smalltalk.send(aBlock, "_value_", [smalltalk.send((smalltalk.JQuery || JQuery), "_fromElement_", [anElement])]);})]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_call_',
+'_focus',
 smalltalk.method({
-selector: 'call:',
-fn: function (aString){
+selector: 'focus',
+fn: function (){
 var self=this;
-return self['@jquery'][aString]();
+smalltalk.send(self, "_call_", ["focus"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_call_withArgument_',
+'_show',
 smalltalk.method({
-selector: 'call:withArgument:',
-fn: function (aString, anObject){
+selector: 'show',
+fn: function (){
 var self=this;
-return self['@jquery'][aString](anObject);
+smalltalk.send(self, "_call_", ["show"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_elementsDo_',
+'_hide',
 smalltalk.method({
-selector: 'elementsDo:',
-fn: function (aBlock){
+selector: 'hide',
+fn: function (){
 var self=this;
-self['@jquery'].each(function(index, element){aBlock(element, self)});
+smalltalk.send(self, "_call_", ["hide"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_hasClass_',
+'_remove',
 smalltalk.method({
-selector: 'hasClass:',
-fn: function (aString){
+selector: 'remove',
+fn: function (){
 var self=this;
-return smalltalk.send(self, "_call_withArgument_", ["hasClass", aString]);
+smalltalk.send(self, "_call_", ["remove"]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_find_',
+'_on_do_',
 smalltalk.method({
-selector: 'find:',
-fn: function (aSelector){
+selector: 'on:do:',
+fn: function (anEventString, aBlock){
 var self=this;
-return smalltalk.send(self, "_call_withArgument_", ["find", aSelector]);
+self['@jquery'].bind(anEventString, function(e){aBlock(e, self)});
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_onLoadDo_',
+'_removeEvents_',
 smalltalk.method({
-selector: 'onLoadDo:',
-fn: function (aBlock){
+selector: 'removeEvents:',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_call_withArgument_", ["load", aBlock]);
+smalltalk.send(self, "_call_withArgument_", ["unbind", aString]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_fadeIn',
+'_onLoadDo_',
 smalltalk.method({
-selector: 'fadeIn',
-fn: function (){
+selector: 'onLoadDo:',
+fn: function (aBlock){
 var self=this;
-smalltalk.send(self, "_call_", ["fadeIn"]);
+smalltalk.send(self, "_call_withArgument_", ["load", aBlock]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_slideDown',
+'_initializeWithJQueryObject_',
 smalltalk.method({
-selector: 'slideDown',
-fn: function (){
+selector: 'initializeWithJQueryObject:',
+fn: function (anObject){
 var self=this;
-smalltalk.send(self, "_call_", ["slideDown"]);
+self['@jquery']=anObject;
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_fadeInSlow',
+'_call_',
 smalltalk.method({
-selector: 'fadeInSlow',
-fn: function (){
+selector: 'call:',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_call_withArgument_", ["fadeIn", "slow"]);
+return self['@jquery'][aString]();
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_fadeOut',
+'_call_withArgument_',
 smalltalk.method({
-selector: 'fadeOut',
-fn: function (){
+selector: 'call:withArgument:',
+fn: function (aString, anObject){
 var self=this;
-smalltalk.send(self, "_call_", ["fadeOut"]);
+return self['@jquery'][aString](anObject);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_fadeOutSlow',
+'_elementsDo_',
 smalltalk.method({
-selector: 'fadeOutSlow',
-fn: function (){
+selector: 'elementsDo:',
+fn: function (aBlock){
 var self=this;
-smalltalk.send(self, "_call_withArgument_", ["fadeOut", "slow"]);
+self['@jquery'].each(function(index, element){aBlock(element, self)});
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_slideUp',
+'_hasClass_',
 smalltalk.method({
-selector: 'slideUp',
-fn: function (){
+selector: 'hasClass:',
+fn: function (aString){
 var self=this;
-smalltalk.send(self, "_call_", ["slideUp"]);
+return smalltalk.send(self, "_call_withArgument_", ["hasClass", aString]);
 return self;}
 }),
 smalltalk.JQuery);
 
 smalltalk.addMethod(
-'_fadeOut_do_',
+'_find_',
 smalltalk.method({
-selector: 'fadeOut:do:',
-fn: function (aString, aBlock){
+selector: 'find:',
+fn: function (aSelector){
 var self=this;
-self['@jquery'].fadeOut(aString, aBlock);
+return smalltalk.send(self, "_call_withArgument_", ["find", aSelector]);
 return self;}
 }),
 smalltalk.JQuery);

+ 128 - 128
js/JQuery.js

@@ -512,6 +512,118 @@ referencedClasses: []
 }),
 smalltalk.JQuery);
 
+smalltalk.addMethod(
+'_fadeIn',
+smalltalk.method({
+selector: 'fadeIn',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_slideDown',
+smalltalk.method({
+selector: 'slideDown',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_fadeInSlow',
+smalltalk.method({
+selector: 'fadeInSlow',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_fadeOut',
+smalltalk.method({
+selector: 'fadeOut',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_fadeOutSlow',
+smalltalk.method({
+selector: 'fadeOutSlow',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_slideUp',
+smalltalk.method({
+selector: 'slideUp',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
+smalltalk.addMethod(
+'_fadeOut_do_',
+smalltalk.method({
+selector: 'fadeOut:do:',
+category: 'effects',
+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: []
+}),
+smalltalk.JQuery);
+
 smalltalk.addMethod(
 '_do_',
 smalltalk.method({
@@ -624,6 +736,22 @@ referencedClasses: []
 }),
 smalltalk.JQuery);
 
+smalltalk.addMethod(
+'_onLoadDo_',
+smalltalk.method({
+selector: 'onLoadDo:',
+category: 'events',
+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: []
+}),
+smalltalk.JQuery);
+
 smalltalk.addMethod(
 '_initializeWithJQueryObject_',
 smalltalk.method({
@@ -720,134 +848,6 @@ referencedClasses: []
 }),
 smalltalk.JQuery);
 
-smalltalk.addMethod(
-'_onLoadDo_',
-smalltalk.method({
-selector: 'onLoadDo:',
-category: 'events',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_fadeIn',
-smalltalk.method({
-selector: 'fadeIn',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_slideDown',
-smalltalk.method({
-selector: 'slideDown',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_fadeInSlow',
-smalltalk.method({
-selector: 'fadeInSlow',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_fadeOut',
-smalltalk.method({
-selector: 'fadeOut',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_fadeOutSlow',
-smalltalk.method({
-selector: 'fadeOutSlow',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_slideUp',
-smalltalk.method({
-selector: 'slideUp',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
-smalltalk.addMethod(
-'_fadeOut_do_',
-smalltalk.method({
-selector: 'fadeOut:do:',
-category: 'effects',
-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: []
-}),
-smalltalk.JQuery);
-
 
 smalltalk.addMethod(
 '_fromString_',

+ 142 - 44
js/Kernel.deploy.js

@@ -636,6 +636,17 @@ return self;}
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+'_modules',
+smalltalk.method({
+selector: 'modules',
+fn: function (){
+var self=this;
+return self.modules.all();
+return self;}
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
@@ -650,6 +661,42 @@ return self;}
 smalltalk.Smalltalk.klass);
 
 
+smalltalk.addClass('Module', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_name',
+smalltalk.method({
+selector: 'name',
+fn: function (){
+var self=this;
+return self.moduleName || nil;
+return self;}
+}),
+smalltalk.Module);
+
+smalltalk.addMethod(
+'_requires',
+smalltalk.method({
+selector: 'requires',
+fn: function (){
+var self=this;
+return self.requires || nil;
+return self;}
+}),
+smalltalk.Module);
+
+smalltalk.addMethod(
+'_name_',
+smalltalk.method({
+selector: 'name:',
+fn: function (aString){
+var self=this;
+return self.moduleName = aString;
+return self;}
+}),
+smalltalk.Module);
+
+
+
 smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_new',
@@ -959,18 +1006,7 @@ smalltalk.method({
 selector: 'category',
 fn: function (){
 var self=this;
-return self.category;
-return self;}
-}),
-smalltalk.Class);
-
-smalltalk.addMethod(
-'_category_',
-smalltalk.method({
-selector: 'category:',
-fn: function (aString){
-var self=this;
-self.category = aString;
+return (($receiver = smalltalk.send(self, "_module", [])) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : (function(){return smalltalk.send(smalltalk.send(self, "_module", []), "_name", []);})();
 return self;}
 }),
 smalltalk.Class);
@@ -981,7 +1017,7 @@ smalltalk.method({
 selector: 'subclass:instanceVariableNames:',
 fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, anotherString, nil]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, anotherString, nil]);
 return self;}
 }),
 smalltalk.Class);
@@ -992,7 +1028,7 @@ smalltalk.method({
 selector: 'subclass:instanceVariableNames:category:',
 fn: function (aString, aString2, aString3){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_category_", [self, aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
 return self;}
 }),
 smalltalk.Class);
@@ -1040,7 +1076,40 @@ smalltalk.method({
 selector: 'subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:',
 fn: function (aString, aString2, classVars, pools, aString3){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
+return self;}
+}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_module',
+smalltalk.method({
+selector: 'module',
+fn: function (){
+var self=this;
+return self.module;
+return self;}
+}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_module_',
+smalltalk.method({
+selector: 'module:',
+fn: function (aModule){
+var self=this;
+self.module = aModule;
+return self;}
+}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:module:',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_module_", [self, aString, aString2, aString3]);
 return self;}
 }),
 smalltalk.Class);
@@ -2416,7 +2485,7 @@ smalltalk.method({
 selector: 'subclass:instanceVariableNames:',
 fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, anotherString, nil]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, anotherString, nil]);
 return self;}
 }),
 smalltalk.UndefinedObject);
@@ -2427,7 +2496,7 @@ smalltalk.method({
 selector: 'subclass:instanceVariableNames:category:',
 fn: function (aString, aString2, aString3){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_category_", [self, aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
 return self;}
 }),
 smalltalk.UndefinedObject);
@@ -2531,6 +2600,17 @@ return self;}
 }),
 smalltalk.UndefinedObject);
 
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:module:',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_module_", [self, aString, aString2, aString3]);
+return self;}
+}),
+smalltalk.UndefinedObject);
+
 
 smalltalk.addMethod(
 '_new',
@@ -4637,21 +4717,7 @@ smalltalk.method({
 selector: 'superclass:subclass:',
 fn: function (aClass, aString){
 var self=this;
-smalltalk.send(self, "_superclass_subclass_instanceVariableNames_category_", [aClass, aString, "", nil]);
-return self;}
-}),
-smalltalk.ClassBuilder);
-
-smalltalk.addMethod(
-'_superclass_subclass_instanceVariableNames_category_',
-smalltalk.method({
-selector: 'superclass:subclass:instanceVariableNames:category:',
-fn: function (aClass, aString, aString2, aString3){
-var self=this;
-var newClass=nil;
-newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2])]);
-smalltalk.send(self, "_setupClass_", [newClass]);
-smalltalk.send(newClass, "_category_", [(($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]);
+return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_module_", [aClass, aString, "", nil]);
 return self;}
 }),
 smalltalk.ClassBuilder);
@@ -4703,6 +4769,31 @@ return self;}
 }),
 smalltalk.ClassBuilder);
 
+smalltalk.addMethod(
+'_superclass_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'superclass:subclass:instanceVariableNames:module:',
+fn: function (aClass, aString, aString2, aString3){
+var self=this;
+var newClass=nil;
+newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_module_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2]), (($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]);
+smalltalk.send(self, "_setupClass_", [newClass]);
+return self;}
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_addSubclassOf_named_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'addSubclassOf:named:instanceVariableNames:module:',
+fn: function (aClass, aString, aCollection, moduleName){
+var self=this;
+smalltalk.addClass(aString, aClass, aCollection, moduleName);
+	    return smalltalk[aString];
+return self;}
+}),
+smalltalk.ClassBuilder);
+
 
 
 smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel');
@@ -5487,18 +5578,7 @@ smalltalk.method({
 selector: 'current',
 fn: function (){
 var self=this;
-return self['@current'];
-return self;}
-}),
-smalltalk.ErrorHandler.klass);
-
-smalltalk.addMethod(
-'_initialize',
-smalltalk.method({
-selector: 'initialize',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_register", []);
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return self['@current']=smalltalk.send(self, "_new", []);})() : $receiver;
 return self;}
 }),
 smalltalk.ErrorHandler.klass);
@@ -5578,6 +5658,24 @@ return self;}
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+'_doesNotUnderstand_',
+smalltalk.method({
+selector: 'doesNotUnderstand:',
+fn: function (aMessage){
+var self=this;
+var obj=nil;
+var selector=nil;
+var arguments=nil;
+obj=smalltalk.send(self, "_jsObject", []);
+selector=smalltalk.send(aMessage, "_selector", []);
+arguments=smalltalk.send(aMessage, "_arguments", []);
+if(obj[selector]) {return smalltalk.send(obj, selector, arguments)};
+smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
+return self;}
+}),
+smalltalk.JSObjectProxy);
+
 
 smalltalk.addMethod(
 '_on_',

+ 216 - 78
js/Kernel.js

@@ -900,12 +900,28 @@ code=smalltalk.send((smalltalk.String || String), "_streamContents_", [(function
 return smalltalk.send(smalltalk.send((smalltalk.Error || Error), "_new", []), "_messageText_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send("Parse error on line ", "__comma", [row]), "__comma", [" column "]), "__comma", [col]), "__comma", [" : "]), "__comma", [message]), "__comma", [unescape("%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A")]), "__comma", [smalltalk.send((smalltalk.String || String), "_lf", [])]), "__comma", [code])]);
 return self;},
 args: ["anException", "aString"],
-source: unescape('parseError%3A%20anException%20parsing%3A%20aString%0A%09%7C%20row%20col%20message%20lines%20badLine%20code%20%7C%0A%09%3Crow%20%3D%20anException.line%3B%0A%09col%20%3D%20anException.column%3B%0A%09message%20%3D%20anException.message%3B%3E.%0A%09lines%20%3A%3D%20aString%20lines.%0A%09badLine%20%3A%3D%20lines%20at%3A%20row.%0A%09badLine%20%3A%3D%20%28badLine%20copyFrom%3A%201%20to%3A%20col%20-%201%29%2C%20%27%20%3D%3D%3D%3E%27%2C%20%28badLine%20copyFrom%3A%20%20col%20to%3A%20badLine%20size%29.%0A%09lines%20at%3A%20row%20put%3A%20badLine.%0A%09code%20%3A%3D%20String%20streamContents%3A%20%5B%3As%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lines%20withIndexDo%3A%20%5B%3Al%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20nextPutAll%3A%20i%20asString%2C%20%27%3A%20%27%2C%20l%2C%20String%20lf%5D%5D.%0A%09%5E%20Error%20new%20messageText%3A%20%28%27Parse%20error%20on%20line%20%27%20%2C%20row%20%2C%20%27%20column%20%27%20%2C%20col%20%2C%20%27%20%3A%20%27%20%2C%20message%20%2C%20%27%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A%27%20%2C%20String%20lf%2C%20code%29'),
+source: unescape('parseError%3A%20anException%20parsing%3A%20aString%0A%09%7C%20row%20col%20message%20lines%20badLine%20code%20%7C%0A%09%3Crow%20%3D%20anException.line%3B%0A%09col%20%3D%20anException.column%3B%0A%09message%20%3D%20anException.message%3B%3E.%0A%09lines%20%3A%3D%20aString%20lines.%0A%09badLine%20%3A%3D%20lines%20at%3A%20row.%0A%09badLine%20%3A%3D%20%28badLine%20copyFrom%3A%201%20to%3A%20col%20-%201%29%2C%20%27%20%3D%3D%3D%3E%27%2C%20%28badLine%20copyFrom%3A%20%20col%20to%3A%20badLine%20size%29.%0A%09lines%20at%3A%20row%20put%3A%20badLine.%0A%09code%20%3A%3D%20String%20streamContents%3A%20%5B%3As%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lines%20withIndexDo%3A%20%5B%3Al%20%3Ai%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20nextPutAll%3A%20i%20asString%2C%20%27%3A%20%27%2C%20l%2C%20String%20lf%5D%5D.%0A%09%5E%20Error%20new%20messageText%3A%20%28%27Parse%20error%20on%20line%20%27%20%2C%20row%20%2C%20%27%20column%20%27%20%2C%20col%20%2C%20%27%20%3A%20%27%20%2C%20message%20%2C%20%27%20Below%20is%20code%20with%20line%20numbers%20and%20%3D%3D%3D%3E%20marker%20inserted%3A%27%20%2C%20String%20lf%2C%20code%29'),
 messageSends: ["lines", "at:", unescape("%2C"), "copyFrom:to:", unescape("-"), "size", "at:put:", "streamContents:", "withIndexDo:", "nextPutAll:", "asString", "lf", "messageText:", "new"],
 referencedClasses: [smalltalk.String,smalltalk.Error]
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+'_modules',
+smalltalk.method({
+selector: 'modules',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.modules.all();
+return self;},
+args: [],
+source: unescape('modules%0A%09%3Creturn%20self.modules.all%28%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
@@ -925,6 +941,57 @@ referencedClasses: []
 smalltalk.Smalltalk.klass);
 
 
+smalltalk.addClass('Module', smalltalk.Object, [], 'Kernel');
+smalltalk.addMethod(
+'_name',
+smalltalk.method({
+selector: 'name',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.moduleName || nil;
+return self;},
+args: [],
+source: unescape('name%0A%09%3Creturn%20self.moduleName%20%7C%7C%20nil%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Module);
+
+smalltalk.addMethod(
+'_requires',
+smalltalk.method({
+selector: 'requires',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.requires || nil;
+return self;},
+args: [],
+source: unescape('requires%0A%09%3Creturn%20self.requires%20%7C%7C%20nil%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Module);
+
+smalltalk.addMethod(
+'_name_',
+smalltalk.method({
+selector: 'name:',
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return self.moduleName = aString;
+return self;},
+args: ["aString"],
+source: unescape('name%3A%20aString%0A%09%3Creturn%20self.moduleName%20%3D%20aString%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Module);
+
+
+
 smalltalk.addClass('Behavior', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(
 '_new',
@@ -1360,27 +1427,11 @@ selector: 'category',
 category: 'accessing',
 fn: function (){
 var self=this;
-return self.category;
+return (($receiver = smalltalk.send(self, "_module", [])) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : (function(){return smalltalk.send(smalltalk.send(self, "_module", []), "_name", []);})();
 return self;},
 args: [],
-source: unescape('category%0A%09%3Creturn%20self.category%3E'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.Class);
-
-smalltalk.addMethod(
-'_category_',
-smalltalk.method({
-selector: 'category:',
-category: 'accessing',
-fn: function (aString){
-var self=this;
-self.category = aString;
-return self;},
-args: ["aString"],
-source: unescape('category%3A%20aString%0A%09%3Cself.category%20%3D%20aString%3E'),
-messageSends: [],
+source: unescape('category%0A%09%5Eself%20module%20ifNil%3A%20%5B%27unclassified%27%5D%20ifNotNil%3A%20%5Bself%20module%20name%5D'),
+messageSends: ["ifNil:ifNotNil:", "module", "name"],
 referencedClasses: []
 }),
 smalltalk.Class);
@@ -1392,11 +1443,11 @@ selector: 'subclass:instanceVariableNames:',
 category: 'class creation',
 fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, anotherString, nil]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, anotherString, nil]);
 return self;},
 args: ["aString", "anotherString"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20category%3A%20nil'),
-messageSends: ["subclass:instanceVariableNames:category:"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%22Kept%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20module%3A%20nil'),
+messageSends: ["subclass:instanceVariableNames:module:"],
 referencedClasses: []
 }),
 smalltalk.Class);
@@ -1408,12 +1459,12 @@ selector: 'subclass:instanceVariableNames:category:',
 category: 'class creation',
 fn: function (aString, aString2, aString3){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_category_", [self, aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
 return self;},
 args: ["aString", "aString2", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3'),
-messageSends: ["superclass:subclass:instanceVariableNames:category:", "new"],
-referencedClasses: [smalltalk.ClassBuilder]
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3'),
+messageSends: ["subclass:instanceVariableNames:module:"],
+referencedClasses: []
 }),
 smalltalk.Class);
 
@@ -1476,15 +1527,63 @@ selector: 'subclass:instanceVariableNames:classVariableNames:poolDictionaries:ca
 category: 'class creation',
 fn: function (aString, aString2, classVars, pools, aString3){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
 return self;},
 args: ["aString", "aString2", "classVars", "pools", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20classVariableNames%3A%20classVars%20poolDictionaries%3A%20pools%20category%3A%20aString3%0A%09%22Just%20ignore%20class%20variables%20and%20pools.%20Added%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3'),
-messageSends: ["subclass:instanceVariableNames:category:"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20classVariableNames%3A%20classVars%20poolDictionaries%3A%20pools%20category%3A%20aString3%0A%09%22Just%20ignore%20class%20variables%20and%20pools.%20Added%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3'),
+messageSends: ["subclass:instanceVariableNames:module:"],
 referencedClasses: []
 }),
 smalltalk.Class);
 
+smalltalk.addMethod(
+'_module',
+smalltalk.method({
+selector: 'module',
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.module;
+return self;},
+args: [],
+source: unescape('module%0A%09%3Creturn%20self.module%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_module_',
+smalltalk.method({
+selector: 'module:',
+category: 'accessing',
+fn: function (aModule){
+var self=this;
+self.module = aModule;
+return self;},
+args: ["aModule"],
+source: unescape('module%3A%20aModule%0A%09%3Cself.module%20%3D%20aModule%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Class);
+
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:module:',
+category: 'class creation',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_module_", [self, aString, aString2, aString3]);
+return self;},
+args: ["aString", "aString2", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3'),
+messageSends: ["superclass:subclass:instanceVariableNames:module:", "new"],
+referencedClasses: [smalltalk.ClassBuilder]
+}),
+smalltalk.Class);
+
 
 
 smalltalk.addClass('Metaclass', smalltalk.Behavior, [], 'Kernel');
@@ -3453,11 +3552,11 @@ selector: 'subclass:instanceVariableNames:',
 category: 'class creation',
 fn: function (aString, anotherString){
 var self=this;
-return smalltalk.send(self, "_subclass_instanceVariableNames_category_", [aString, anotherString, nil]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, anotherString, nil]);
 return self;},
 args: ["aString", "anotherString"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20category%3A%20nil'),
-messageSends: ["subclass:instanceVariableNames:category:"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20anotherString%20module%3A%20nil'),
+messageSends: ["subclass:instanceVariableNames:module:"],
 referencedClasses: []
 }),
 smalltalk.UndefinedObject);
@@ -3469,12 +3568,12 @@ selector: 'subclass:instanceVariableNames:category:',
 category: 'class creation',
 fn: function (aString, aString2, aString3){
 var self=this;
-return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_category_", [self, aString, aString2, aString3]);
+return smalltalk.send(self, "_subclass_instanceVariableNames_module_", [aString, aString2, aString3]);
 return self;},
 args: ["aString", "aString2", "aString3"],
-source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3'),
-messageSends: ["superclass:subclass:instanceVariableNames:category:", "new"],
-referencedClasses: [smalltalk.ClassBuilder]
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%22Kept%20for%20compatibility.%22%0A%09%5Eself%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3'),
+messageSends: ["subclass:instanceVariableNames:module:"],
+referencedClasses: []
 }),
 smalltalk.UndefinedObject);
 
@@ -3622,6 +3721,22 @@ referencedClasses: []
 }),
 smalltalk.UndefinedObject);
 
+smalltalk.addMethod(
+'_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'subclass:instanceVariableNames:module:',
+category: 'class creation',
+fn: function (aString, aString2, aString3){
+var self=this;
+return smalltalk.send(smalltalk.send((smalltalk.ClassBuilder || ClassBuilder), "_new", []), "_superclass_subclass_instanceVariableNames_module_", [self, aString, aString2, aString3]);
+return self;},
+args: ["aString", "aString2", "aString3"],
+source: unescape('subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3%0A%09%5EClassBuilder%20new%0A%09%20%20%20%20superclass%3A%20self%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3'),
+messageSends: ["superclass:subclass:instanceVariableNames:module:", "new"],
+referencedClasses: [smalltalk.ClassBuilder]
+}),
+smalltalk.UndefinedObject);
+
 
 smalltalk.addMethod(
 '_new',
@@ -6609,30 +6724,11 @@ selector: 'superclass:subclass:',
 category: 'class creation',
 fn: function (aClass, aString){
 var self=this;
-smalltalk.send(self, "_superclass_subclass_instanceVariableNames_category_", [aClass, aString, "", nil]);
+return smalltalk.send(self, "_superclass_subclass_instanceVariableNames_module_", [aClass, aString, "", nil]);
 return self;},
 args: ["aClass", "aString"],
-source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%0A%09self%20superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20%27%27%20category%3A%20nil'),
-messageSends: ["superclass:subclass:instanceVariableNames:category:"],
-referencedClasses: []
-}),
-smalltalk.ClassBuilder);
-
-smalltalk.addMethod(
-'_superclass_subclass_instanceVariableNames_category_',
-smalltalk.method({
-selector: 'superclass:subclass:instanceVariableNames:category:',
-category: 'class creation',
-fn: function (aClass, aString, aString2, aString3){
-var self=this;
-var newClass=nil;
-newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2])]);
-smalltalk.send(self, "_setupClass_", [newClass]);
-smalltalk.send(newClass, "_category_", [(($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]);
-return self;},
-args: ["aClass", "aString", "aString2", "aString3"],
-source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20category%3A%20aString3%0A%09%7C%20newClass%20%7C%0A%09newClass%20%3A%3D%20self%20addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20%28self%20instanceVariableNamesFor%3A%20aString2%29.%0A%09self%20setupClass%3A%20newClass.%0A%09newClass%20category%3A%20%28aString3%20ifNil%3A%20%5B%27unclassified%27%5D%29'),
-messageSends: ["addSubclassOf:named:instanceVariableNames:", "instanceVariableNamesFor:", "setupClass:", "category:", "ifNil:"],
+source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%0A%09%5Eself%20superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20%27%27%20module%3A%20nil'),
+messageSends: ["superclass:subclass:instanceVariableNames:module:"],
 referencedClasses: []
 }),
 smalltalk.ClassBuilder);
@@ -6704,6 +6800,41 @@ referencedClasses: []
 }),
 smalltalk.ClassBuilder);
 
+smalltalk.addMethod(
+'_superclass_subclass_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'superclass:subclass:instanceVariableNames:module:',
+category: 'class creation',
+fn: function (aClass, aString, aString2, aString3){
+var self=this;
+var newClass=nil;
+newClass=smalltalk.send(self, "_addSubclassOf_named_instanceVariableNames_module_", [aClass, aString, smalltalk.send(self, "_instanceVariableNamesFor_", [aString2]), (($receiver = aString3) == nil || $receiver == undefined) ? (function(){return "unclassified";})() : $receiver]);
+smalltalk.send(self, "_setupClass_", [newClass]);
+return self;},
+args: ["aClass", "aString", "aString2", "aString3"],
+source: unescape('superclass%3A%20aClass%20subclass%3A%20aString%20instanceVariableNames%3A%20aString2%20module%3A%20aString3%0A%09%7C%20newClass%20%7C%0A%09newClass%20%3A%3D%20self%20addSubclassOf%3A%20aClass%0A%09%09%09%09named%3A%20aString%20instanceVariableNames%3A%20%28self%20instanceVariableNamesFor%3A%20aString2%29%0A%09%09%09%09module%3A%20%28aString3%20ifNil%3A%20%5B%27unclassified%27%5D%29.%0A%09self%20setupClass%3A%20newClass'),
+messageSends: ["addSubclassOf:named:instanceVariableNames:module:", "instanceVariableNamesFor:", "ifNil:", "setupClass:"],
+referencedClasses: []
+}),
+smalltalk.ClassBuilder);
+
+smalltalk.addMethod(
+'_addSubclassOf_named_instanceVariableNames_module_',
+smalltalk.method({
+selector: 'addSubclassOf:named:instanceVariableNames:module:',
+category: 'private',
+fn: function (aClass, aString, aCollection, moduleName){
+var self=this;
+smalltalk.addClass(aString, aClass, aCollection, moduleName);
+	    return smalltalk[aString];
+return self;},
+args: ["aClass", "aString", "aCollection", "moduleName"],
+source: unescape('addSubclassOf%3A%20aClass%20named%3A%20aString%20instanceVariableNames%3A%20aCollection%20module%3A%20moduleName%0A%09%3Csmalltalk.addClass%28aString%2C%20aClass%2C%20aCollection%2C%20moduleName%29%3B%0A%09%20%20%20%20return%20smalltalk%5BaString%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassBuilder);
+
 
 
 smalltalk.addClass('ClassCategoryReader', smalltalk.Object, ['class', 'category', 'chunkParser'], 'Kernel');
@@ -7819,27 +7950,11 @@ selector: 'current',
 category: 'accessing',
 fn: function (){
 var self=this;
-return self['@current'];
-return self;},
-args: [],
-source: unescape('current%0A%09%5Ecurrent'),
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.ErrorHandler.klass);
-
-smalltalk.addMethod(
-'_initialize',
-smalltalk.method({
-selector: 'initialize',
-category: 'initialization',
-fn: function (){
-var self=this;
-smalltalk.send(self, "_register", []);
+return (($receiver = self['@current']) == nil || $receiver == undefined) ? (function(){return self['@current']=smalltalk.send(self, "_new", []);})() : $receiver;
 return self;},
 args: [],
-source: unescape('initialize%0A%09self%20register'),
-messageSends: ["register"],
+source: unescape('current%0A%09%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20self%20new%5D'),
+messageSends: ["ifNil:", "new"],
 referencedClasses: []
 }),
 smalltalk.ErrorHandler.klass);
@@ -7949,6 +8064,29 @@ referencedClasses: [smalltalk.Dictionary]
 }),
 smalltalk.JSObjectProxy);
 
+smalltalk.addMethod(
+'_doesNotUnderstand_',
+smalltalk.method({
+selector: 'doesNotUnderstand:',
+category: 'proxy',
+fn: function (aMessage){
+var self=this;
+var obj=nil;
+var selector=nil;
+var arguments=nil;
+obj=smalltalk.send(self, "_jsObject", []);
+selector=smalltalk.send(aMessage, "_selector", []);
+arguments=smalltalk.send(aMessage, "_arguments", []);
+if(obj[selector]) {return smalltalk.send(obj, selector, arguments)};
+smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
+return self;},
+args: ["aMessage"],
+source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5Bselector%5D%29%20%7Breturn%20smalltalk.send%28obj%2C%20selector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
+messageSends: ["jsObject", "selector", "arguments", "doesNotUnderstand:"],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
 
 smalltalk.addMethod(
 '_on_',

+ 33 - 33
js/SUnit.deploy.js

@@ -1,4 +1,26 @@
 smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
+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(
 '_signalFailure_',
 smalltalk.method({
@@ -101,28 +123,6 @@ 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',
@@ -157,17 +157,6 @@ 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({
@@ -193,6 +182,17 @@ 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.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
 

+ 51 - 51
js/SUnit.js

@@ -1,4 +1,36 @@
 smalltalk.addClass('TestCase', smalltalk.Object, ['testSelector'], 'SUnit');
+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(
 '_signalFailure_',
 smalltalk.method({
@@ -9,9 +41,9 @@ var self=this;
 (function($rec){smalltalk.send($rec, "_messageText_", [aString]);return smalltalk.send($rec, "_signal", []);})(smalltalk.send((smalltalk.TestFailure || TestFailure), "_new", []));
 return self;},
 args: ["aString"],
-source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal%20'),
+source: unescape('signalFailure%3A%20aString%0A%09TestFailure%20new%0A%09%09messageText%3A%20aString%3B%0A%09%09signal'),
 messageSends: ["messageText:", "signal", "new"],
-referencedClasses: [smalltalk.nil]
+referencedClasses: []
 }),
 smalltalk.TestCase);
 
@@ -78,7 +110,7 @@ return self;},
 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]
+referencedClasses: [smalltalk.Error]
 }),
 smalltalk.TestCase);
 
@@ -146,38 +178,6 @@ 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',
@@ -227,22 +227,6 @@ 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({
@@ -278,6 +262,22 @@ referencedClasses: []
 }),
 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.addClass('TestFailure', smalltalk.Error, [], 'SUnit');
 

+ 57 - 12
js/boot.js

@@ -38,6 +38,7 @@
 function SmalltalkObject(){};
 function SmalltalkBehavior(){};
 function SmalltalkClass(){};
+function SmalltalkModule(){};
 function SmalltalkMetaclass(){
     this.meta = true;
 };
@@ -49,6 +50,20 @@ function Smalltalk(){
     var st = this;
     this.thisContext = undefined;
 
+    
+    /* We hold all Modules in a separate Object */
+    st.modules = {};
+
+    /* Smalltalk Module object. To add a Module, use smalltalk.addModule() */
+
+    function mod(spec) {
+	var that = new SmalltalkModule();
+	that.moduleName        = spec.moduleName;
+	that.requires          = spec.requires || [];
+	that.fn                = spec.fn || function(){};
+	return that;
+    };
+
     /* Smalltalk class creation. A class is an instance of an automatically 
        created metaclass object. Newly created classes (not their metaclass) 
        should be added to the smalltalk object, see smalltalk.addClass().
@@ -72,7 +87,11 @@ function Smalltalk(){
 	if(that.superclass) {
 	    that.klass.superclass = that.superclass.klass;
 	}
-	that.category = spec.category || "";
+	that.module = spec.module;
+        // For a while we keep the category attribute...
+        if(!(spec.module === undefined)) {
+	    that.category = spec.module.moduleName;
+	}
 	that.fn.prototype.methods = {};
 	that.fn.prototype.inheritedMethods = {};
 	that.fn.prototype.klass = that;
@@ -123,6 +142,16 @@ function Smalltalk(){
 	}
     };
 
+    /* Answer all registered Modules */
+
+    st.modules.all = function() {
+	var modules = [];
+	for(var i in st.modules) {
+	    modules.push(st.modules[i]);
+	}
+	return modules
+    };
+
     /* Answer all registered Smalltalk classes */
 
     st.classes = function() {
@@ -131,7 +160,6 @@ function Smalltalk(){
 	    if(i.search(/^[A-Z]/g) != -1) {
 		classes.push(st[i]);
 	    }
-
 	}
 	return classes
     };
@@ -170,31 +198,47 @@ function Smalltalk(){
     };
 
     /* Create a new class wrapping a JavaScript constructor, and add it to the 
-       global smalltalk object. */
+       global smalltalk object. Module is lazily created if it does not exist with given name. */
 
-    st.mapClassName = function(className, category, fn, superclass) {
+    st.mapClassName = function(className, moduleName, fn, superclass) {
+	modul = st.addModule(moduleName);
 	st[className] = klass({
 	    className:  className, 
-	    category:   category, 
+	    module:     modul, 
 	    superclass: superclass,
 	    fn:         fn
 	});
     };
 
-    /* Add a class to the smalltalk object, creating a new one if needed. */
+    /* Add a module to the smalltalk.modules object, creating a new one if needed.
+       If moduleName is nil or empty we return nil, which is an allowed module for a class. */
 
-    st.addClass = function(className, superclass, iVarNames, category) {
+    st.addModule = function(moduleName) {
+	if(!moduleName) {return nil;}
+	if(!(st.modules[moduleName])) {
+	    st.modules[moduleName] = mod({
+		moduleName: moduleName
+	    });
+	}
+	return st.modules[moduleName];
+    };
+
+    /* Add a class to the smalltalk object, creating a new one if needed.
+       Module is lazily created if it does not exist with given name.*/
+
+    st.addClass = function(className, superclass, iVarNames, moduleName) {
+	modul = st.addModule(moduleName);
 	if(st[className]) {
 	    st[className].superclass = superclass;
 	    st[className].iVarNames = iVarNames;
-	    st[className].category = category || st[className].category;
-	} else {
+	    st[className].module = modul || st[className].module;
+	} else {    
 	    st[className] = klass({
 		className: className, 
 		iVarNames: iVarNames,
-		superclass: superclass
+		superclass: superclass,
+		module: modul
 	    });
-	    st[className].category = category || '';
 	}
     };
 
@@ -467,12 +511,13 @@ if(this.jQuery) {
 
 smalltalk.mapClassName("Object", "Kernel", SmalltalkObject);
 smalltalk.mapClassName("Smalltalk", "Kernel", Smalltalk, smalltalk.Object);
+smalltalk.mapClassName("Module", "Kernel", SmalltalkModule, smalltalk.Object);
 smalltalk.mapClassName("Behavior", "Kernel", SmalltalkBehavior, smalltalk.Object);
 smalltalk.mapClassName("Class", "Kernel", SmalltalkClass, smalltalk.Behavior);
 smalltalk.mapClassName("Metaclass", "Kernel", SmalltalkMetaclass, smalltalk.Behavior);
 smalltalk.mapClassName("CompiledMethod", "Kernel", SmalltalkMethod, smalltalk.Object);
 
-smalltalk.Object.klass.superclass = smalltalk.Class
+smalltalk.Object.klass.superclass = smalltalk.Class;
 
 smalltalk.mapClassName("Number", "Kernel", Number, smalltalk.Object);
 smalltalk.mapClassName("BlockClosure", "Kernel", Function, smalltalk.Object);

+ 0 - 0
st/Compiler.st


+ 89 - 49
st/IDE.st

@@ -1,5 +1,5 @@
 Widget subclass: #TabManager
-	instanceVariableNames: 'selectedTab tabs opened ul'
+	instanceVariableNames: 'selectedTab tabs opened ul input'
 	category: 'IDE'!
 
 !TabManager methodsFor: 'accessing'!
@@ -20,11 +20,11 @@ labelFor: aWidget
 !TabManager methodsFor: 'actions'!
 
 updateBodyMargin
-    self setBodyMargin: '#jtalk' asJQuery height + 27
+    self setBodyMargin: '#jtalk' asJQuery height
 !
 
 updatePosition
-    <jQuery('#jtalk').css('top', '').css('bottom', '27px')>
+    <jQuery('#jtalk').css('top', '').css('bottom', '0px')>
 !
 
 removeBodyMargin
@@ -86,6 +86,14 @@ closeTab: aWidget
     self selectTab: self tabs last.
     aWidget remove.
     self update
+!
+
+search: aString
+	| searchedClass |
+	searchedClass := Smalltalk current at: aString.
+		searchedClass isClass
+			ifTrue: [Browser openOn: searchedClass]
+			ifFalse: [ReferencesBrowser search: aString]
 ! !
 
 !TabManager methodsFor: 'adding/Removing'!
@@ -107,9 +115,9 @@ initialize
     super initialize.
     opened := true.
     'body' asJQuery 
-	append: self;
 	append: [:html | html div id: 'jtalk'];
 	addClass: 'jtalkBody'.
+    '#jtalk' asJQuery append: self.
     self 
 	addTab: Transcript current;
 	addTab: Workspace new;
@@ -123,6 +131,8 @@ initialize
 !TabManager methodsFor: 'rendering'!
 
 renderOn: html
+	html div id: 'logo'.
+	self renderToolbarOn: html.
 	ul := html ul
 		id: 'jtalkTabs';
 		yourself.
@@ -130,33 +140,49 @@ renderOn: html
 !
 
 renderTabFor: aWidget on: html
-    | li |
-    li := html li.
-    selectedTab = aWidget ifTrue: [
+	| li |
+	li := html li.
+	selectedTab = aWidget ifTrue: [
 	li class: 'selected'].
-    li with: [
-        aWidget canBeClosed ifTrue: [
-	    html span 
-		class: 'close';
-		with: 'x';
-		onClick: [self closeTab: aWidget]].
-	html span
-	    with: (self labelFor: aWidget);
-	    onClick: [self selectTab: aWidget]]
+	li with: [
+		html span class: 'ltab'.
+		html span
+     	    		class: 'mtab';
+      	    		with: [
+        			aWidget canBeClosed ifTrue: [
+	    				html span 
+						class: 'close';
+						with: 'x';
+					onClick: [self closeTab: aWidget]].
+	    		html span with: (self labelFor: aWidget)].
+        	html span class: 'rtab'];
+	onClick: [self selectTab: aWidget]
 !
 
 renderTabs
 	ul contents: [:html |
-	    html li 
-		class: 'closeAll';
-		with: 'x';
-		onClick: [self close].
 	    self tabs do: [:each |
 		self renderTabFor: each on: html].
 	    html li
 		class: 'newtab';
-		with: ' + ';
+		with: [
+                	html span class: 'ltab'.
+                	html span class: 'mtab'; with: ' + '.
+                	html span class: 'rtab'];
 		onClick: [self newBrowserTab]]
+!
+
+renderToolbarOn: html
+	html div 
+		id: 'jt_toolbar';
+		with: [
+			input := html input 
+				class: 'implementors';
+				yourself.
+			input onKeyPress: [:event |
+				event keyCode = 13 ifTrue: [
+				self search: input asJQuery val]].
+                	html div id: 'jt_close'; onClick: [self close]]
 ! !
 
 !TabManager methodsFor: 'updating'!
@@ -258,7 +284,7 @@ TabWidget subclass: #Workspace
 !Workspace methodsFor: 'accessing'!
 
 label
-    ^'[Workspace]'
+    ^'Workspace'
 ! !
 
 !Workspace methodsFor: 'actions'!
@@ -277,6 +303,10 @@ printIt
 
 inspectIt
     sourceArea inspectIt
+!
+
+fileIn
+    sourceArea fileIn
 ! !
 
 !Workspace methodsFor: 'rendering'!
@@ -299,6 +329,10 @@ renderButtonsOn: html
 	with: 'InspectIt';
 	title: 'ctrl+i';
 	onClick: [self inspectIt].
+    html button
+	with: 'FileIn';
+	title: 'ctrl+f';
+	onClick: [self fileIn].
     html button
 	with: 'Clear workspace';
 	onClick: [self clearWorkspace]
@@ -311,7 +345,7 @@ TabWidget subclass: #Transcript
 !Transcript methodsFor: 'accessing'!
 
 label
-    ^'[Transcript]'
+    ^'Transcript'
 ! !
 
 !Transcript methodsFor: 'actions'!
@@ -377,7 +411,7 @@ clear
 ! !
 
 TabWidget subclass: #Browser
-	instanceVariableNames: 'selectedCategory selectedClass selectedProtocol selectedMethod commitButton categoriesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges input'
+	instanceVariableNames: 'selectedCategory selectedClass selectedProtocol selectedMethod commitButton categoriesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges'
 	category: 'IDE'!
 
 !Browser methodsFor: 'accessing'!
@@ -385,7 +419,7 @@ TabWidget subclass: #Browser
 label
     ^selectedClass 
 	ifNil: ['Browser (nil)']
-	ifNotNil: [selectedClass name]
+	ifNotNil: ['Browser: ', selectedClass name]
 !
 
 categories
@@ -644,7 +678,7 @@ setMethodProtocol: aString
 addNewProtocol
     | newProtocol |
     newProtocol := self prompt: 'New method protocol'.
-    newProtocol notEmpty ifTrue: [
+    (newProtocol notNil and: [newProtocol notEmpty]) ifTrue: [
 	selectedMethod category: newProtocol.
 	self setMethodProtocol: newProtocol]
 !
@@ -751,7 +785,6 @@ renderTopPanelOn: html
     html div 
 	class: 'top'; 
 	with: [
-	    self renderInputOn: html.
 	    categoriesList := html ul class: 'jt_column browser categories'.
 	    commitButton := html button 
 		class: 'jt_commit';
@@ -771,7 +804,7 @@ renderTopPanelOn: html
 !
 
 renderTabsOn: html
-    tabsList := html ul class: 'jt_tabs'.
+    tabsList := html ul class: 'jt_tabs jt_browser'.
     self updateTabsList.
 !
 
@@ -803,15 +836,6 @@ renderButtonsOn: html
 		html button with: 'InspectIt';
 			onClick: [sourceArea inspectit]]. 
     self updateSourceAndButtons
-!
-
-renderInputOn: html 
-	input := html input 
-		class: 'implementors';
-		yourself.
-	input onKeyPress: [:event |
-		event keyCode = 13 ifTrue: [
-			self search: input asJQuery val]]
 ! !
 
 !Browser methodsFor: 'testing'!
@@ -876,17 +900,26 @@ updateTabsList
 	li := html li.
 	selectedTab = #instance ifTrue: [li class: 'selected'].
 	li
-	    with: 'Instance';
+	    with: [
+              	html span class: 'ltab'.
+              	html span class: 'mtab'; with: 'Instance'.
+              	html span class: 'rtab'];
 	    onClick: [self selectTab: #instance].
 	li := html li.
 	selectedTab = #class ifTrue: [li class: 'selected'].
 	li
-	    with: 'Class';
+	    with: [
+              	html span class: 'ltab'.
+              	html span class: 'mtab'; with: 'Class'.
+              	html span class: 'rtab'];
 	    onClick: [self selectTab: #class].
 	li := html li.
 	selectedTab = #comment ifTrue: [li class: 'selected'].
 	li
-	    with: 'Comment';
+	    with: [
+              	html span class: 'ltab'.
+              	html span class: 'mtab'; with: 'Comment'.
+              	html span class: 'rtab'];
 	    onClick: [self selectTab: #comment]]
 !
 
@@ -1047,7 +1080,7 @@ renderTopPanelOn: html
 		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 div class: 'jt_tabs inspector'; with: [
           			html button
                   			class: 'jt_button inspector refresh';
 					with: 'Refresh';
@@ -1144,7 +1177,7 @@ implementors
 !
 
 label
-	^'[ReferencesBrowser]'
+	^'[References]'
 !
 
 selector
@@ -1376,6 +1409,12 @@ onDoIt: aBlock
 
 onDoIt
 	^onDoIt
+!
+
+currentLineOrSelection
+    ^editor somethingSelected
+	ifFalse: [self currentLine]
+	ifTrue: [self selection]
 ! !
 
 !SourceArea methodsFor: 'actions'!
@@ -1385,11 +1424,8 @@ clear
 !
 
 doIt
-    | selection result |
-    editor somethingSelected
-	ifFalse: [selection := self currentLine]
-	ifTrue: [selection := self selection].
-    result := self eval: selection.
+    | result |
+    result := self eval: self currentLineOrSelection.
     self onDoIt ifNotNil: [self onDoIt value].
     ^result
 !
@@ -1441,6 +1477,10 @@ print: aString
 
 printIt
     self print: self doIt printString
+!
+
+fileIn
+    Importer new import: self currentLineOrSelection readStream
 ! !
 
 !SourceArea methodsFor: 'events'!
@@ -1889,7 +1929,7 @@ TabWidget subclass: #TestRunner
 !TestRunner methodsFor: 'accessing'!
 
 label
-    ^'[SUnit]'
+    ^'SUnit'
 !
 
 categories
@@ -2046,7 +2086,7 @@ renderClassesOn: html
 renderResultsOn: html
     	statusDiv := html div.
 	html with: self progressBar.
-   	methodsList := html ul class: 'jt_column sunit methods'.
+   	methodsList := html ul class: 'jt_column sunit results'.
 	self updateMethodsList.
 	self updateStatusDiv
 !

+ 74 - 26
st/Kernel.st

@@ -287,9 +287,13 @@ parseError: anException parsing: aString
 	badLine := (badLine copyFrom: 1 to: col - 1), ' ===>', (badLine copyFrom:  col to: badLine size).
 	lines at: row put: badLine.
 	code := String streamContents: [:s |
-                                        lines withIndexDo: [:l :i |
-                                                   s nextPutAll: i asString, ': ', l, String lf]].
+                  lines withIndexDo: [:l :i |
+                     s nextPutAll: i asString, ': ', l, String lf]].
 	^ Error new messageText: ('Parse error on line ' , row , ' column ' , col , ' : ' , message , ' Below is code with line numbers and ===> marker inserted:' , String lf, code)
+!
+
+modules
+	<return self.modules.all()>
 ! !
 
 Smalltalk class instanceVariableNames: 'current'!
@@ -300,6 +304,24 @@ current
 	<return smalltalk>
 ! !
 
+Object subclass: #Module
+	instanceVariableNames: ''
+	category: 'Kernel'!
+
+!Module methodsFor: 'accessing'!
+
+name
+	<return self.moduleName || nil>
+!
+
+requires
+	<return self.requires || nil>
+!
+
+name: aString
+	<return self.moduleName = aString>
+! !
+
 Object subclass: #Behavior
 	instanceVariableNames: ''
 	category: 'Kernel'!
@@ -456,11 +478,7 @@ Behavior subclass: #Class
 !Class methodsFor: 'accessing'!
 
 category
-	<return self.category>
-!
-
-category: aString
-	<self.category = aString>
+	^self module ifNil: ['unclassified'] ifNotNil: [self module name]
 !
 
 rename: aString
@@ -469,22 +487,36 @@ rename: aString
 		delete smalltalk[self.className];
 		self.className = aString;
 	>
+!
+
+module
+	<return self.module>
+!
+
+module: aModule
+	<self.module = aModule>
 ! !
 
 !Class methodsFor: 'class creation'!
 
 subclass: aString instanceVariableNames: anotherString
-	^self subclass: aString instanceVariableNames: anotherString category: nil
+	"Kept for compatibility."
+	^self subclass: aString instanceVariableNames: anotherString module: nil
 !
 
 subclass: aString instanceVariableNames: aString2 category: aString3
-	^ClassBuilder new
-	    superclass: self subclass: aString instanceVariableNames: aString2 category: aString3
+	"Kept for compatibility."
+	^self subclass: aString instanceVariableNames: aString2 module: aString3
 !
 
 subclass: aString instanceVariableNames: aString2 classVariableNames: classVars poolDictionaries: pools category: aString3
 	"Just ignore class variables and pools. Added for compatibility."
-	^self subclass: aString instanceVariableNames: aString2 category: aString3
+	^self subclass: aString instanceVariableNames: aString2 module: aString3
+!
+
+subclass: aString instanceVariableNames: aString2 module: aString3
+	^ClassBuilder new
+	    superclass: self subclass: aString instanceVariableNames: aString2 module: aString3
 ! !
 
 !Class methodsFor: 'printing'!
@@ -1132,12 +1164,17 @@ Object subclass: #UndefinedObject
 !UndefinedObject methodsFor: 'class creation'!
 
 subclass: aString instanceVariableNames: anotherString
-	^self subclass: aString instanceVariableNames: anotherString category: nil
+	^self subclass: aString instanceVariableNames: anotherString module: nil
 !
 
 subclass: aString instanceVariableNames: aString2 category: aString3
+	"Kept for compatibility."
+	^self subclass: aString instanceVariableNames: aString2 module: aString3
+!
+
+subclass: aString instanceVariableNames: aString2 module: aString3
 	^ClassBuilder new
-	    superclass: self subclass: aString instanceVariableNames: aString2 category: aString3
+	    superclass: self subclass: aString instanceVariableNames: aString2 module: aString3
 ! !
 
 !UndefinedObject methodsFor: 'copying'!
@@ -2264,20 +2301,21 @@ Object subclass: #ClassBuilder
 !ClassBuilder methodsFor: 'class creation'!
 
 superclass: aClass subclass: aString
-	self superclass: aClass subclass: aString instanceVariableNames: '' category: nil
-!
-
-superclass: aClass subclass: aString instanceVariableNames: aString2 category: aString3
-	| newClass |
-	newClass := self addSubclassOf: aClass named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2).
-	self setupClass: newClass.
-	newClass category: (aString3 ifNil: ['unclassified'])
+	^self superclass: aClass subclass: aString instanceVariableNames: '' module: nil
 !
 
 class: aClass instanceVariableNames: aString
 	aClass isMetaclass ifFalse: [self error: aClass name, ' is not a metaclass'].
 	aClass basicAt: 'iVarNames' put: (self instanceVariableNamesFor: aString).
 	self setupClass: aClass
+!
+
+superclass: aClass subclass: aString instanceVariableNames: aString2 module: aString3
+	| newClass |
+	newClass := self addSubclassOf: aClass
+				named: aString instanceVariableNames: (self instanceVariableNamesFor: aString2)
+				module: (aString3 ifNil: ['unclassified']).
+	self setupClass: newClass
 ! !
 
 !ClassBuilder methodsFor: 'private'!
@@ -2293,6 +2331,11 @@ addSubclassOf: aClass named: aString instanceVariableNames: aCollection
 
 setupClass: aClass
 	<smalltalk.init(aClass);>
+!
+
+addSubclassOf: aClass named: aString instanceVariableNames: aCollection module: moduleName
+	<smalltalk.addClass(aString, aClass, aCollection, moduleName);
+	    return smalltalk[aString]>
 ! !
 
 Object subclass: #ClassCategoryReader
@@ -2703,7 +2746,7 @@ ErrorHandler class instanceVariableNames: 'current'!
 !ErrorHandler class methodsFor: 'accessing'!
 
 current
-	^current
+	^current ifNil: [current := self new]
 !
 
 setCurrent: anHandler
@@ -2712,10 +2755,6 @@ setCurrent: anHandler
 
 !ErrorHandler class methodsFor: 'initialization'!
 
-initialize
-	self register
-!
-
 register
 	ErrorHandler setCurrent: self new
 ! !
@@ -2749,6 +2788,15 @@ inspectOn: anInspector
 		variables._at_put_(i, self['@jsObject'][i]);
 	}>.
 	anInspector setVariables: variables
+!
+
+doesNotUnderstand: aMessage
+	| obj selector arguments |
+	obj := self jsObject.
+	selector := aMessage selector.
+	arguments := aMessage arguments.
+	<if(obj[selector]) {return smalltalk.send(obj, selector, arguments)}>.
+	super doesNotUnderstand: aMessage
 ! !
 
 !JSObjectProxy class methodsFor: 'instance creation'!

Some files were not shown because too many files changed in this diff