Browse Source

kernel: Shorter class creation code, without spec.

By defining `klass` and `superclass` inside `classBuilder`.
Herbert Vojčík 7 years ago
parent
commit
f5b1c2ac9b
1 changed files with 40 additions and 50 deletions
  1. 40 50
      support/kernel-language.js

+ 40 - 50
support/kernel-language.js

@@ -176,40 +176,54 @@ define(['./compatibility'], function () {
          should be added to the system, see smalltalk.addClass().
          Superclass linking is *not* handled here, see api.initialize()  */
 
-        function klass (spec) {
-            var setSuperClass = spec.superclass;
-            if (!spec.superclass) {
-                spec.superclass = nilAsClass;
+        function classBuilder (className, superclass, iVarNames, fn) {
+            var logicalSuperclass = superclass;
+            if (superclass == null || superclass.isNil) {
+                superclass = nilAsClass;
+                logicalSuperclass = null;
             }
-            var meta = metaclass(spec);
-            var that = meta.instanceClass;
 
-            that.superclass = setSuperClass;
-            that.fn = spec.fn || inherits(function () {
-                }, spec.superclass.fn);
-            that.iVarNames = spec.iVarNames || [];
+            function klass (pkg) {
+                var that = metaclass().instanceClass;
 
-            that.className = spec.className;
-            that.pkg = spec.pkg;
-            that.subclasses = [];
+                that.superclass = logicalSuperclass;
+                that.fn = fn || inherits(function () {
+                    }, superclass.fn);
+                that.iVarNames = iVarNames || [];
 
-            setupMethods(that);
-            return that;
-        }
+                that.className = className;
+                that.pkg = pkg;
+                that.subclasses = [];
+
+                setupMethods(that);
+                return that;
+            }
+
+            function metaclass () {
+                var that = new SmalltalkMetaclass();
 
-        function metaclass (spec) {
-            var that = new SmalltalkMetaclass();
+                that.superclass = superclass.klass;
+                that.fn = inherits(function () {
+                }, that.superclass.fn);
+                that.iVarNames = [];
 
-            that.superclass = spec.superclass.klass;
-            that.fn = inherits(function () {
-            }, that.superclass.fn);
-            that.iVarNames = [];
+                that.instanceClass = new that.fn();
 
-            that.instanceClass = new that.fn();
+                wireKlass(that);
+                setupMethods(that);
+                return that;
+            }
 
-            wireKlass(that);
-            setupMethods(that);
-            return that;
+            return {
+                className: className,
+                make: klass,
+                updateExisting: function (klass, pkg) {
+                    if (klass.superclass == superclass && (!fn || fn === klass.fn)) {
+                        if (iVarNames) klass.iVarNames = iVarNames;
+                        if (pkg) klass.pkg = pkg;
+                    } else throw new Error("Incompatible change of class: " + klass.className);
+                }
+            };
         }
 
         function wireKlass (klass) {
@@ -233,30 +247,6 @@ define(['./compatibility'], function () {
             return buildBehaviorBody(pkgName, classBuilder(className, superclass, iVarNames, coreFns[className]));
         };
 
-        function classBuilder (className, superclass, iVarNames, fn) {
-            if (superclass == null || superclass.isNil) {
-                superclass = null;
-            }
-            return {
-                className: className,
-                make: function (pkg) {
-                    return klass({
-                        className: className,
-                        pkg: pkg,
-                        superclass: superclass,
-                        iVarNames: iVarNames,
-                        fn: fn
-                    });
-                },
-                updateExisting: function (klass, pkg) {
-                    if (klass.superclass == superclass && (!fn || fn === klass.fn)) {
-                        if (iVarNames) klass.iVarNames = iVarNames;
-                        if (pkg) klass.pkg = pkg;
-                    } else throw new Error("Incompatible change of class: " + klass.className);
-                }
-            };
-        }
-
         st.removeClass = removeBehaviorBody;
 
         function addSubclass (klass) {