private String generateMethodBody(MethodDeclaration m) { String methodBody; if (Modifier.isNative(m.getModifiers())) { if (hasNativeCode(m, true)) { methodBody = extractNativeMethodBody(m); } else if (Options.generateNativeStubs()) { return generateNativeStub(m); } else { return null; } } else if (Modifier.isAbstract(m.getModifiers())) { // Generate a body which throws a NSInvalidArgumentException. String body = "{\n // can't call an abstract method\n " + "[self doesNotRecognizeSelector:_cmd];\n "; if (!Types.isVoidType(m.getReturnType2())) { body += "return 0;\n"; // Never executes, but avoids a gcc warning. } return body + "}"; } else { // generate a normal method body methodBody = generateStatement(m.getBody(), false); } boolean isStatic = (m.getModifiers() & Modifier.STATIC) != 0; boolean isSynchronized = (m.getModifiers() & Modifier.SYNCHRONIZED) != 0; if (isStatic && isSynchronized) { methodBody = "{\n@synchronized([self class]) {\n" + methodBody + "}\n}\n"; } else if (isSynchronized) { methodBody = "{\n@synchronized(self) {\n" + methodBody + "}\n}\n"; } return methodBody; }
@Override protected void printFunctionDeclaration(FunctionDeclaration function) { newline(); // We expect native functions to be defined externally. if (!Modifier.isNative(function.getModifiers())) { print("__attribute__((unused)) static "); } print(getFunctionSignature(function)); if (function.returnsRetained()) { print(" NS_RETURNS_RETAINED"); } println(";"); // TODO(kstanger): Remove when users have migrated. String name = function.getName(); String oldName = function.getOldName(); if (!oldName.equals(name)) { println("#ifdef J2OBJC_RENAME2_ALIASES"); printf("#define %s %s\n", oldName, name); println("#endif // J2OBJC_RENAME2_ALIASES"); } }
public static boolean isNative(IBinding binding) { return Modifier.isNative(binding.getModifiers()); }