require'fiddle'moduleXcodeprojmodulePlistmoduleFFImoduleDevToolsCoredefself.silence_stderrbeginorig_stderr=$stderr.clone$stderr.reopenFile.new('/dev/null','w')retval=yieldensure$stderr.reopenorig_stderrendretvalend# rubocop:disable Style/MethodName# rubocop:disable Style/VariableNameclassNSObjectprivatedefself.objc_class@objc_class||=CoreFoundation.objc_getClass(name.split('::').last)enddefself.image@image||=Fiddle::Handle.newenddefself.extern(symbol,parameter_types,return_type)CoreFoundation.extern_image(image,symbol,parameter_types,return_type)enddefself.objc_msgSend(args,return_type=CoreFoundation::VoidPointer)arguments=[CoreFoundation::VoidPointer,CoreFoundation::VoidPointer]+argsFiddle::Function.new(image['objc_msgSend'],arguments,return_type)enddefself.respondsToSelector(instance,sel)selector=CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(sel))respondsToSelector=objc_msgSend([CoreFoundation::CharPointer],CoreFoundation::Boolean)result=respondsToSelector.call(instance,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString('respondsToSelector:')),selector)result==CoreFoundation::TRUE?true:falseendClass=CoreFoundation::VoidPointerID=CoreFoundation::VoidPointerSEL=CoreFoundation::VoidPointerextern:NSSelectorFromString,[CoreFoundation::CFTypeRef],SELextern:objc_getClass,[CoreFoundation::CharPointer],Classextern:class_getName,[Class],CoreFoundation::CharPointerendXCODE_PATH=Pathname.new(`xcrun xcode-select --print-path`.strip).dirnamedefself.load_xcode_framework(framework)Fiddle.dlopen(XCODE_PATH.join(framework).to_s)rescueFiddle::DLErrornilend# @note The IB frameworks only seem to be necessary on Xcode 7+#defself.load_xcode_frameworksDevToolsCore.silence_stderrdoload_xcode_framework('SharedFrameworks/DVTFoundation.framework/DVTFoundation')load_xcode_framework('SharedFrameworks/DVTServices.framework/DVTServices')load_xcode_framework('SharedFrameworks/DVTPortal.framework/DVTPortal')load_xcode_framework('SharedFrameworks/DVTSourceControl.framework/DVTSourceControl')load_xcode_framework('SharedFrameworks/CSServiceClient.framework/CSServiceClient')load_xcode_framework('Frameworks/IBFoundation.framework/IBFoundation')load_xcode_framework('Frameworks/IBAutolayoutFoundation.framework/IBAutolayoutFoundation')load_xcode_framework('Frameworks/IDEFoundation.framework/IDEFoundation')load_xcode_framework('PlugIns/Xcode3Core.ideplugin/Contents/MacOS/Xcode3Core')endendclassCFDictionary<NSObjectpublicdefinitialize(dictionary)@dictionary=dictionaryenddefplistDescriptionUTF8Dataselector='plistDescriptionUTF8Data'returnnilunlessNSObject.respondsToSelector(@dictionary,selector)plistDescriptionUTF8Data=CFDictionary.objc_msgSend([])plistDescriptionUTF8Data.call(@dictionary,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(selector)))enddefself.image@image||=DevToolsCore.load_xcode_frameworksendendclassNSData<NSObjectpublicdefinitialize(data)@data=dataenddefwriteToFileAtomically(path)selector='writeToFile:atomically:'returnfalseunlessNSObject.respondsToSelector(@data,selector)writeToFileAtomically=NSData.objc_msgSend([CoreFoundation::VoidPointer,CoreFoundation::Boolean],CoreFoundation::Boolean)result=writeToFileAtomically.call(@data,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(selector)),CoreFoundation.RubyStringToCFString(path),1)result==CoreFoundation::TRUE?true:falseendendclassPBXProject<NSObjectpublicdefinitialize(path)DevToolsCore.silence_stderrdoCoreFoundation.IDEInitialize(1,CoreFoundation::NULL)# The parameter is whether UI must be initialized (which we don't need)CoreFoundation.XCInitializeCoreIfNeeded(0)endselector='projectWithFile:'ifNSObject.respondsToSelector(PBXProject.objc_class,selector)projectWithFile=PBXProject.objc_msgSend([CoreFoundation::VoidPointer])@project=projectWithFile.call(PBXProject.objc_class,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(selector)),CoreFoundation.RubyStringToCFString(path))endenddefcloseselector='close'returnunlessNSObject.respondsToSelector(@project,selector)close=PBXProject.objc_msgSend([],CoreFoundation::Void)close.call(@project,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(selector)))enddefwriteToFileSystemProjectFileselector='writeToFileSystemProjectFile:userFile:checkNeedsRevert:'returnunlessNSObject.respondsToSelector(@project,selector)writeToFile=PBXProject.objc_msgSend([CoreFoundation::Boolean,CoreFoundation::Boolean,CoreFoundation::Boolean],CoreFoundation::Boolean)result=writeToFile.call(@project,CoreFoundation.NSSelectorFromString(CoreFoundation.RubyStringToCFString(selector)),1,0,1)result==CoreFoundation::TRUE?true:falseendprivatedefself.image@image||=DevToolsCore.load_xcode_frameworksendextern:IDEInitialize,[CoreFoundation::Boolean,ID],CoreFoundation::Voidextern:XCInitializeCoreIfNeeded,[CoreFoundation::Boolean],CoreFoundation::Voidend# rubocop:enable Style/MethodName# rubocop:enable Style/VariableNameendendendend