def generate_manager_implementation(self): if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = 'LCC{0}Manager.mm'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif') output_impl.write(_OBJC_BR) output_impl.write('#import "LCC{0}Manager.h"\n#import "LCC{0}Manager_CoreAddition.h"\n\n'.format(self.class_name)) output_impl.write('#import "LCCDirector.h"\n#import "LCCObjcAdapter.h"\n#import "LCCUtils.h"\n\n') output_impl.write('#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"'.format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('@implementation LCC{0}Manager'.format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Lifecycle') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_constructor_implementation()) output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_default_manager_implementation()) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - HTTP') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_web_api_implementations()) output_impl.write('#pragma mark - Persistent store') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_fetch_implementations()) output_impl.write('@end\n')
def generate_core_addition_header(self, config): """Generates Objective-C++ private header file. (eg: LCCTopic_CoreAddition.h) Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}_CoreAddition.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface {1}{0} () {{'.format(self.class_name, config.objc_prefix)) output_header.write('\n') output_header.write(' @package') output_header.write('\n') output_header.write(_OBJC_SPACE) output_header.write('std::unique_ptr<{1}::{0}> _coreHandle;'.format(self.class_name, config.cpp_namespace)) output_header.write('\n') output_header.write('}') output_header.write(_OBJC_BR) output_header.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1};' .format(string_utils.first_char_to_lower(self.class_name), self.class_name, config.cpp_namespace)) output_header.write(_OBJC_BR) output_header.write('@end')
def generate_header(self, config): """Generates Objective-C++ object header file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) for objc_enum in self.objc_enum_list: output_header.write(objc_enum.generate_objc_enum(self.class_name, config)) output_header.write(_OBJC_BR) output_header.write('NS_ASSUME_NONNULL_BEGIN\n@interface {1}{0} : NSObject'.format(self.class_name, config.objc_prefix)) output_header.write(_OBJC_BR) for objc_var in self.objc_var_list: output_header.write(objc_var.property(config)) output_header.write(_OBJC_BR) output_header.write('@end\nNS_ASSUME_NONNULL_END') output_header.write(_OBJC_BR)
def generate_implementation(self): file_name = 'LCC{0}.mm'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif') output_impl.write(_OBJC_BR) output_impl.write('#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"\n\n#import "LCCObjcAdapter.h"'.format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('@implementation LCC{0}'.format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Property') output_impl.write(_OBJC_BR) for objc_var in self.objc_var_list: output_impl.write(objc_var.getter_impl()) output_impl.write(_OBJC_BR) output_impl.write(objc_var.setter_impl()) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Core Addition') output_impl.write(_OBJC_BR) output_impl.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1} {{\n' .format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_impl.write(_OBJC_SPACE) output_impl.write('LCC{0} *{1} = [[LCC{0} alloc] init];\n'.format(self.class_name, string_utils.first_char_to_lower(self.class_name))) output_impl.write(_OBJC_SPACE) output_impl.write('{0}->_coreHandle = core{1}.Clone();\n'.format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_impl.write(_OBJC_SPACE) output_impl.write('return {0};\n}}'.format(string_utils.first_char_to_lower(self.class_name))) output_impl.write(_OBJC_BR) output_impl.write('@end\n')
def generate_core_addition_header(self): file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}.h"'.format( cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface LCC{0} () {{'.format(self.class_name)) output_header.write('\n') output_header.write('@package') output_header.write('\n') output_header.write(_OBJC_SPACE) output_header.write( 'std::unique_ptr<lesschat::{0}> _coreHandle;'.format( self.class_name)) output_header.write('\n') output_header.write('}') output_header.write(_OBJC_BR) output_header.write( '+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};'. format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_header.write(_OBJC_BR) output_header.write('@end')
def generate_manager_core_addition_header(self): file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface LCC{0}Manager () {{\n@private\n'.format(self.class_name)) output_header.write(_OBJC_SPACE) output_header.write('const lesschat::{0}Manager *_coreManagerHandler;\n'.format(self.class_name)) output_header.write('}') output_header.write(_OBJC_BR) output_header.write('@end\n')
def generate_manager_header(self, config): """Generates Objective-C++ object manager header file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = '{1}{0}Manager.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) output_header.write('@class {1}{0};'.format(self.class_name, config.objc_prefix)) output_header.write(_OBJC_BR) output_header.write('NS_ASSUME_NONNULL_BEGIN\n') output_header.write('@interface {1}{0}Manager : NSObject'.format(self.class_name, config.objc_prefix)) output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Lifecycle\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write('+ (instancetype)defaultManager;') output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name HTTP\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_web_api_declarations(config)) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Persistent store\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_fetch_declarations(config)) output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
def generate_implementation(self): file_name = 'LCC{0}.mm'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write( '#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif' ) output_impl.write(_OBJC_BR) output_impl.write( '#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"\n\n#import "LCCObjcAdapter.h"' .format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('@implementation LCC{0}'.format(self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Property') output_impl.write(_OBJC_BR) for objc_var in self.objc_var_list: output_impl.write(objc_var.getter_impl()) output_impl.write(_OBJC_BR) output_impl.write(objc_var.setter_impl()) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Core Addition') output_impl.write(_OBJC_BR) output_impl.write( '+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1} {{\n' .format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_impl.write(_OBJC_SPACE) output_impl.write('LCC{0} *{1} = [[LCC{0} alloc] init];\n'.format( self.class_name, string_utils.first_char_to_lower(self.class_name))) output_impl.write(_OBJC_SPACE) output_impl.write('{0}->_coreHandle = core{1}.Clone();\n'.format( string_utils.first_char_to_lower(self.class_name), self.class_name)) output_impl.write(_OBJC_SPACE) output_impl.write('return {0};\n}}'.format( string_utils.first_char_to_lower(self.class_name))) output_impl.write(_OBJC_BR) output_impl.write('@end\n')
def generate_implementation(self, config): """Generates Objective-C++ object header file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}.mm'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif') output_impl.write(_OBJC_BR) output_impl.write('#import "{1}{0}.h"\n#import "{1}{0}_CoreAddition.h"\n\n#import "{1}ObjcAdapter.h"'.format( self.class_name, config.objc_prefix)) output_impl.write(_OBJC_BR) output_impl.write('@implementation {1}{0}'.format(self.class_name, config.objc_prefix)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Property') output_impl.write(_OBJC_BR) for objc_var in self.objc_var_list: output_impl.write(objc_var.getter_impl(config)) output_impl.write(_OBJC_BR) output_impl.write(objc_var.setter_impl(config)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Core Addition') output_impl.write(_OBJC_BR) output_impl.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1} {{\n' .format(string_utils.first_char_to_lower(self.class_name), self.class_name, config.cpp_namespace)) output_impl.write(_OBJC_SPACE) output_impl.write('{2}{0} *{1} = [[{2}{0} alloc] init];\n' .format(self.class_name, string_utils.first_char_to_lower(self.class_name), config.objc_prefix)) output_impl.write(_OBJC_SPACE) output_impl.write('{0}->_coreHandle = core{1}.Clone();\n' .format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_impl.write(_OBJC_SPACE) output_impl.write('return {0};\n}}'.format(string_utils.first_char_to_lower(self.class_name))) output_impl.write(_OBJC_BR) output_impl.write('@end\n')
def generate_manager_core_addition_header(self, config): """Generates Objective-C++ object manager private header file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ file_name = '{1}{0}Manager_CoreAddition.h'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format( string_utils.cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface {1}{0}Manager () {{\n @private\n'.format(self.class_name, config.objc_prefix)) output_header.write(_OBJC_SPACE) output_header.write('const {1}::{0}Manager *_coreManagerHandler;\n'.format(self.class_name, config.cpp_namespace)) output_header.write('}') output_header.write(_OBJC_BR) output_header.write('@end\n')
def generate_manager_implementation(self): if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = 'LCC{0}Manager.mm'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write( '#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif' ) output_impl.write(_OBJC_BR) output_impl.write( '#import "LCC{0}Manager.h"\n#import "LCC{0}Manager_CoreAddition.h"\n\n' .format(self.class_name)) output_impl.write( '#import "LCCDirector.h"\n#import "LCCObjcAdapter.h"\n#import "LCCUtils.h"\n\n' ) output_impl.write( '#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"'.format( self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('@implementation LCC{0}Manager'.format( self.class_name)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Lifecycle') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_constructor_implementation()) output_impl.write(_OBJC_BR) output_impl.write( objc_manager.generate_default_manager_implementation()) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - HTTP') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_web_api_implementations()) output_impl.write('#pragma mark - Persistent store') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_fetch_implementations()) output_impl.write('@end\n')
def generate_manager_header(self): if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = 'LCC{0}Manager.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) output_header.write('@class LCC{0};'.format(self.class_name)) output_header.write(_OBJC_BR) output_header.write('NS_ASSUME_NONNULL_BEGIN\n') output_header.write('@interface LCC{0}Manager : NSObject'.format( self.class_name)) output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Lifecycle\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write('+ (instancetype)defaultManager;') output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name HTTP\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_web_api_declarations()) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Persistent store\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_fetch_declarations()) output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
def generate_manager_core_addition_header(self): file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write( '#include "{0}_manager.h"\n#include "director.h"'.format( string_utils.cpp_class_name_to_cpp_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write( '@interface LCC{0}Manager () {{\n@private\n'.format( self.class_name)) output_header.write(_OBJC_SPACE) output_header.write( 'const lesschat::{0}Manager *_coreManagerHandler;\n'.format( self.class_name)) output_header.write('}') output_header.write(_OBJC_BR) output_header.write('@end\n')
def generate_core_addition_header(self): file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#include "{0}.h"'.format(CppClass.convert_class_name_to_file_name(self.class_name))) output_header.write(_OBJC_BR) output_header.write('@interface LCC{0} () {{'.format(self.class_name)) output_header.write('\n') output_header.write('@package') output_header.write('\n') output_header.write(_OBJC_SPACE) output_header.write('std::unique_ptr<lesschat::{0}> _coreHandle;'.format(self.class_name)) output_header.write('\n') output_header.write('}') output_header.write(_OBJC_BR) output_header.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};' .format(string_utils.first_char_to_lower(self.class_name), self.class_name)) output_header.write(_OBJC_BR) output_header.write('@end')
def generate_header(self): file_name = 'LCC{0}.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) for objc_enum in self.objc_enum_list: output_header.write(objc_enum.generate_objc_enum(self.class_name)) output_header.write(_OBJC_BR) output_header.write('NS_ASSUME_NONNULL_BEGIN\n@interface LCC{0} : NSObject'.format(self.class_name)) output_header.write(_OBJC_BR) for objc_var in self.objc_var_list: output_header.write(objc_var.property()) output_header.write(_OBJC_BR) output_header.write('@end\nNS_ASSUME_NONNULL_END') output_header.write(_OBJC_BR)
def generate_manager_header(self): if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = 'LCC{0}Manager.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) output_header.write('@class LCC{0};'.format(self.class_name)) output_header.write(_OBJC_BR) output_header.write('NS_ASSUME_NONNULL_BEGIN\n') output_header.write('@interface LCC{0}Manager : NSObject'.format(self.class_name)) output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Lifecycle\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write('+ (instancetype)defaultManager;') output_header.write(_OBJC_BR) output_header.write('///-----------------------------------------\n') output_header.write('/// @name HTTP\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_web_api_declarations()) output_header.write('///-----------------------------------------\n') output_header.write('/// @name Persistent store\n') output_header.write('///-----------------------------------------\n') output_header.write('\n') output_header.write(objc_manager.generate_fetch_declarations()) output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
def generate_manager_implementation(self, config): """Generates Objective-C++ object manager implementation file. Args: config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used. """ if self.objc_manager_or_none is None: return objc_manager = self.objc_manager_or_none file_name = '{1}{0}Manager.mm'.format(self.class_name, config.objc_prefix) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name output_impl = open(file_path, 'w') output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif') output_impl.write(_OBJC_BR) output_impl.write('#import "{1}{0}Manager.h"\n#import "{1}{0}Manager_CoreAddition.h"\n\n' .format(self.class_name, config.objc_prefix)) output_impl.write('#import "{0}Director.h"\n#import "{0}ObjcAdapter.h"\n#import "{0}Utils.h"\n\n' .format(config.objc_prefix)) output_impl.write('#import "{1}{0}.h"\n#import "{1}{0}_CoreAddition.h"'.format(self.class_name, config.objc_prefix)) output_impl.write(_OBJC_BR) output_impl.write('@implementation {1}{0}Manager'.format(self.class_name, config.objc_prefix)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - Lifecycle') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_constructor_implementation(config)) output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_default_manager_implementation(config)) output_impl.write(_OBJC_BR) output_impl.write('#pragma mark - HTTP') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_web_api_implementations(config)) output_impl.write('#pragma mark - Persistent store') output_impl.write(_OBJC_BR) output_impl.write(objc_manager.generate_fetch_implementations(config)) output_impl.write('@end\n')
def generate_header(self): file_name = 'LCC{0}.h'.format(self.class_name) file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name( self.group_name) + '/' + file_name output_header = open(file_path, 'w') output_header.write('#import <Foundation/Foundation.h>') output_header.write(_OBJC_BR) for objc_enum in self.objc_enum_list: output_header.write(objc_enum.generate_objc_enum(self.class_name)) output_header.write(_OBJC_BR) output_header.write( 'NS_ASSUME_NONNULL_BEGIN\n@interface LCC{0} : NSObject'.format( self.class_name)) output_header.write(_OBJC_BR) for objc_var in self.objc_var_list: output_header.write(objc_var.property()) output_header.write(_OBJC_BR) output_header.write('@end\nNS_ASSUME_NONNULL_END') output_header.write(_OBJC_BR)
def parse(self, directory, config): """Parse the input file with user-defined config. Args: directory: A string represents module.xml file. config: A <Config> object represents user-defined info, such as class prefix. """ # create core folder if not exists and remove last build objc_dir_path = 'build/ObjectiveCppWrapper' io_utils.make_directory_if_not_exists(objc_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name( group_name) io_utils.make_directory_if_not_exists(objc_group_name) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find objc class {0} under "{1}" group'.format( class_name, group_name) # parse all <enum/> objc_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') objc_enum = ObjcEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') objc_enum.append(int_value, alias) objc_enum_list.append(objc_enum) # parse all <variable/> objc_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') objc_var = ObjcVariable(variable_name, variable_type) objc_var.set_enum_class_name(variable_enum_or_none) objc_var_list.append(objc_var) # parse <manager/> objc_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') objc_manager = ObjcManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True alias_attr = save_node.get('alias') save_command = CppManagerSaveCommand( is_plural, [], alias_attr) objc_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') alias_attr = delete_node.get('alias') delete_command = CppManagerDeleteCommand( is_plural, by, [], alias_attr) objc_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') sort_by_or_none = fetch_node.get('sort') is_asc = True if sort_by_or_none is not None: desc_desciption_or_none = fetch_node.get('desc') if desc_desciption_or_none is not None: if desc_desciption_or_none == 'true': is_asc = False alias_attr = fetch_node.get('alias') fetch_command = CppManagerFetchCommand( is_plural, by, sort_by_or_none, is_asc, [], alias_attr) objc_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, []) objc_manager.add_api_description(api) # write objective-c++ wrapper core addition header objc_wrapper = ObjcClass(group_name, class_name, objc_var_list, objc_enum_list, objc_manager) objc_wrapper.generate_core_addition_header(config) # write objective-c++ wrapper header objc_wrapper.generate_header(config) # write objective-c++ wrapper implementation objc_wrapper.generate_implementation(config) # write objective-c++ wrapper manager category header objc_wrapper.generate_manager_core_addition_header(config) # write objective-c++ wrapper manager header objc_wrapper.generate_manager_header(config) # write objective-c++ wrapper manager implementation objc_wrapper.generate_manager_implementation(config)
def parse(self, directory, config): """Parse the input file with user-defined config. Args: directory: A string represents module.xml file. config: A <Config> object represents user-defined info, such as class prefix. """ # create core folder if not exists and remove last build objc_dir_path = 'build/ObjectiveCppWrapper' io_utils.make_directory_if_not_exists(objc_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name(group_name) io_utils.make_directory_if_not_exists(objc_group_name) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find objc class {0} under "{1}" group'.format(class_name, group_name) # parse all <enum/> objc_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') objc_enum = ObjcEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') objc_enum.append(int_value, alias) objc_enum_list.append(objc_enum) # parse all <variable/> objc_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') objc_var = ObjcVariable(variable_name, variable_type) objc_var.set_enum_class_name(variable_enum_or_none) objc_var_list.append(objc_var) # parse <manager/> objc_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') objc_manager = ObjcManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True alias_attr = save_node.get('alias') save_command = CppManagerSaveCommand(is_plural, [], alias_attr) objc_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') alias_attr = delete_node.get('alias') delete_command = CppManagerDeleteCommand(is_plural, by, [], alias_attr) objc_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') sort_by_or_none = fetch_node.get('sort') is_asc = True if sort_by_or_none is not None: desc_desciption_or_none = fetch_node.get('desc') if desc_desciption_or_none is not None: if desc_desciption_or_none == 'true': is_asc = False alias_attr = fetch_node.get('alias') fetch_command = CppManagerFetchCommand(is_plural, by, sort_by_or_none, is_asc, [], alias_attr) objc_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, []) objc_manager.add_api_description(api) # write objective-c++ wrapper core addition header objc_wrapper = ObjcClass(group_name, class_name, objc_var_list, objc_enum_list, objc_manager) objc_wrapper.generate_core_addition_header(config) # write objective-c++ wrapper header objc_wrapper.generate_header(config) # write objective-c++ wrapper implementation objc_wrapper.generate_implementation(config) # write objective-c++ wrapper manager category header objc_wrapper.generate_manager_core_addition_header(config) # write objective-c++ wrapper manager header objc_wrapper.generate_manager_header(config) # write objective-c++ wrapper manager implementation objc_wrapper.generate_manager_implementation(config)