mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-06 17:12:50 +00:00
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:
commit
371b660b33
4 files changed
+41
-3
No files matched your search
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user