Merge pull request #2072 from mrcarlberg/fix_accessors_in_categories_fails

Fixed: Ivars with accessors in a Category failed with duplicate ivar error
This commit is contained in:
Antoine Mercadal committed 2014-09-04 14:02:53 -07:00
commit 371b660b33
4 files changed
+41 -3

No files matched your search

+16 -3
View File
@@ -1705,6 +1705,8 @@ ClassDeclarationStatement: function(node, st, c) {
compiler.currentSuperMetaClass = "objj_getMetaClass(\"" + className + "\").super_class";
var firstIvarDeclaration = true,
ivars = classDef.ivars,
classDefIvars = [],
hasAccessors = false;
// Then we add all ivars
@@ -1714,7 +1716,6 @@ ClassDeclarationStatement: function(node, st, c) {
var ivarDecl = node.ivardeclarations[i],
ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null,
ivarName = ivarDecl.id.name,
ivars = classDef.ivars,
ivar = {"type": ivarType, "name": ivarName},
accessors = ivarDecl.accessors;
@@ -1736,7 +1737,10 @@ ClassDeclarationStatement: function(node, st, c) {
if (ivarDecl.outlet)
ivar.outlet = true;
ivars[ivarName] = ivar;
// Store the classDef ivars into array and add them later when accessors are created to prevent ivar duplicate error when generating accessors
classDefIvars.push(ivar);
if (!classScope.ivars)
classScope.ivars = Object.create(null);
classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarDecl.id, ivar: ivar};
@@ -1826,7 +1830,16 @@ ClassDeclarationStatement: function(node, st, c) {
compiler.imBuffer.concat(imBuffer);
}
// We will store the classDef first after accessors are done so we don't get a duplicate class error
// We will store the ivars into the classDef first after accessors are done so we don't get a duplicate ivars error when generating accessors
for (var ivarSize = classDefIvars.length, i = 0; i < ivarSize; i++) {
var ivar = classDefIvars[i],
ivarName = ivar.name;
// Store the ivar into the classDef
ivars[ivarName] = ivar;
}
// We will store the classDef first after accessors are done so we don't get a duplicate class error when generating accessors
compiler.classDefs[className] = classDef;
var bodies = node.body,
@@ -0,0 +1,11 @@
@implementation Class
{
}
@end
@implementation Class (Accessors)
{
Type ivar @accessors;
}
@end
@@ -0,0 +1,13 @@
var the_class=objj_allocateClassPair(Nil,"Class"),meta_class=the_class.isa;
objj_registerClassPair(the_class);
var the_class=objj_getClass("Class");
if(!the_class){
throw new SyntaxError("*** Could not find definition for class \"Class\"");
}
var meta_class=the_class.isa;
class_addIvars(the_class,[new objj_ivar("ivar")]);
class_addMethods(the_class,[new objj_method(sel_getUid("ivar"),function $Class__ivar(_1,_2){
return _1.ivar;
},["Type"]),new objj_method(sel_getUid("setIvar:"),function $Class__setIvar_(_3,_4,_5){
_3.ivar=_5;
},["void","Type"])]);
@@ -6,6 +6,7 @@ var FILENAMES = [
"Class/root-class",
"Class/root-class-one-ivar",
"Class/root-class-multiple-ivars",
"Class/accessors",
"Messages/no-parameters",
"Messages/one-parameter",