|
@@ -310,6 +310,29 @@ define(function () {
|
|
|
emit.behaviorMethodRemoved(method, this);
|
|
|
});
|
|
|
|
|
|
+ function setInstanceVariables (klass, instanceVariableNames) {
|
|
|
+ instanceVariableNames.forEach(function (name) {
|
|
|
+ if (!name.match(/^[a-zA-Z][a-zA-Z0-9]*$/))
|
|
|
+ throw new Error("Wrong identifier name: " + name);
|
|
|
+ });
|
|
|
+
|
|
|
+ klass.instanceVariableNames = instanceVariableNames;
|
|
|
+ }
|
|
|
+
|
|
|
+ st.setInstanceVariables = setInstanceVariables;
|
|
|
+
|
|
|
+
|
|
|
+ Object.defineProperty(SmalltalkBehavior.prototype, "iVarNames", {
|
|
|
+ enumerable: true,
|
|
|
+ configurable: true,
|
|
|
+ get: function () {
|
|
|
+ return this.instanceVariableNames;
|
|
|
+ },
|
|
|
+ set: function (instanceVariableNames) {
|
|
|
+ setInstanceVariables(this, instanceVariableNames);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
this.bootstrapHierarchy = function () {
|
|
|
var nilSubclasses = [globals.ProtoObject];
|
|
|
nilAsClass.a$cls = globals.Class;
|
|
@@ -324,7 +347,7 @@ define(function () {
|
|
|
should be added to the system, see smalltalk.addClass().
|
|
|
Superclass linking is *not* handled here, see api.initialize() */
|
|
|
|
|
|
- function classBuilder (className, superclass, iVarNames, fn) {
|
|
|
+ function classBuilder (className, superclass, fn) {
|
|
|
var logicalSuperclass = superclass;
|
|
|
if (superclass == null || superclass.a$nil) {
|
|
|
superclass = nilAsClass;
|
|
@@ -337,7 +360,7 @@ define(function () {
|
|
|
that.superclass = logicalSuperclass;
|
|
|
that.fn = fn || inherits(function () {
|
|
|
}, superclass.fn);
|
|
|
- that.iVarNames = iVarNames || [];
|
|
|
+ that.instanceVariableNames = [];
|
|
|
|
|
|
that.name = className;
|
|
|
that.subclasses = [];
|
|
@@ -352,7 +375,7 @@ define(function () {
|
|
|
that.superclass = superclass.a$cls;
|
|
|
that.fn = inherits(function () {
|
|
|
}, that.superclass.fn);
|
|
|
- that.iVarNames = [];
|
|
|
+ that.instanceVariableNames = [];
|
|
|
|
|
|
that.instanceClass = new that.fn();
|
|
|
|
|
@@ -365,9 +388,8 @@ define(function () {
|
|
|
name: className,
|
|
|
make: klass,
|
|
|
updateExisting: function (klass) {
|
|
|
- if (klass.superclass == logicalSuperclass && (!fn || fn === klass.fn)) {
|
|
|
- if (iVarNames) klass.iVarNames = iVarNames;
|
|
|
- } else throw new Error("Incompatible change of class: " + klass.name);
|
|
|
+ if (klass.superclass != logicalSuperclass || fn && fn !== klass.fn)
|
|
|
+ throw new Error("Incompatible change of class: " + klass.name);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
@@ -384,13 +406,20 @@ define(function () {
|
|
|
|
|
|
A Package is lazily created if one with given name does not exist. */
|
|
|
|
|
|
- st.addClass = function (className, superclass, iVarNames, category) {
|
|
|
+ st.addClass = function (className, superclass, category) {
|
|
|
+
|
|
|
+ if (arguments[3]) {
|
|
|
+ var added = st.addClass(className, superclass, arguments[3]);
|
|
|
+ setInstanceVariables(added, category);
|
|
|
+ return added;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
if (typeof superclass === 'undefined' || superclass && superclass.a$nil) {
|
|
|
console.warn('Compiling ' + className + ' as a subclass of `nil`. A dependency might be missing.');
|
|
|
}
|
|
|
- return buildTraitOrClass(category, classBuilder(className, superclass, iVarNames, coreFns[className]));
|
|
|
+ return buildTraitOrClass(category, classBuilder(className, superclass, coreFns[className]));
|
|
|
};
|
|
|
|
|
|
st.removeClass = removeTraitOrClass;
|