From f0e2daf6c75116631b4a261f4b42b9d1f2aee7f2 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Thu, 12 Sep 2013 21:54:57 +0200 Subject: [PATCH] Fixed: Add get and set instance methods to class definition when ivar has accessors. This caused 'Method is not implemented' warnings when a class implemented protocol declared set and get methods as 'accessors' on an ivar. --- Objective-J/ObjJAcornCompiler.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 9b1394f7a..da2b773c1 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -1662,7 +1662,8 @@ ClassDeclarationStatement: function(node, st, c) { ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null, ivarName = ivarDecl.id.name, ivars = classDef.ivars, - ivar = {"type": ivarType, "name": ivarName}; + ivar = {"type": ivarType, "name": ivarName}, + accessors = ivarDecl.accessors; if (ivars[ivarName]) throw compiler.error_message("Instance variable '" + ivarName + "'is already declared for class " + className, ivarDecl.id); @@ -1687,8 +1688,26 @@ ClassDeclarationStatement: function(node, st, c) { classScope.ivars = Object.create(null); classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarDecl.id, ivar: ivar}; - if (!hasAccessors && ivarDecl.accessors) + if (accessors) { + // TODO: This next couple of lines for getting getterName and setterName are duplicated from below. Create functions for this. + var property = (accessors.property && accessors.property.name) || ivarName, + getterName = (accessors.getter && accessors.getter.name) || property; + + classDef.addInstanceMethod(new MethodDef(getterName, [ivarType])); + + if (!accessors.readonly) { + var setterName = accessors.setter ? accessors.setter.name : null; + + if (!setterName) + { + var start = property.charAt(0) == '_' ? 1 : 0; + + setterName = (start ? "_" : "") + "set" + property.substr(start, 1).toUpperCase() + property.substring(start + 1) + ":"; + } + classDef.addInstanceMethod(new MethodDef(setterName, ["void", ivarType])); + } hasAccessors = true; + } } if (!firstIvarDeclaration)