public XcodeSyncBackContext GetChanges(IProgressMonitor monitor, NSObjectInfoService infoService, DotNetProject project) { var ctx = new XcodeSyncBackContext(projectDir, syncTimeCache, infoService, project); var needsSync = new List <XcodeSyncedItem> (items.Where(i => i.NeedsSyncBack(monitor, ctx))); var knownFiles = GetKnownFiles(); if (Directory.Exists(projectDir)) { monitor.BeginTask("Scanning for newly-added files in the Xcode project...", 0); ScanForAddedFiles(monitor, ctx, knownFiles, projectDir, null); monitor.EndTask(); } if (needsSync.Count > 0) { monitor.BeginStepTask(GettextCatalog.GetString("Synchronizing changes made to known files in Xcode back to MonoDevelop..."), needsSync.Count, 1); for (int i = 0; i < needsSync.Count; i++) { var item = needsSync [i]; item.SyncBack(monitor, ctx); monitor.Step(1); } monitor.EndTask(); } return(ctx); }
public XcodeSyncBackContext(FilePath projectDir, Dictionary <string, DateTime> syncTimes, NSObjectInfoService infoService, DotNetProject project) : base(projectDir, syncTimes) { InfoService = infoService; Project = project; }
public XcodeProjectTracker(DotNetProject dnp, NSObjectInfoService infoService) { if (dnp == null) { throw new ArgumentNullException("dnp"); } this.dnp = dnp; this.infoService = infoService; AppleSdkSettings.Changed += AppleSdkSettingsChanged; }
//FIXME: report errors SyncObjcBackJob ReadTypeFromXcode(FilePath hFile, ref NSObjectProjectInfo pinfo) { var parsed = NSObjectInfoService.ParseHeader(hFile); if (pinfo == null) { pinfo = NSObjectInfoService.GetProjectInfo(dnp); } var objcType = pinfo.GetType(hFile.FileNameWithoutExtension); if (objcType == null) { Console.WriteLine("Missing objc type {0}", hFile.FileNameWithoutExtension); return(null); } if (parsed.ObjCName != objcType.ObjCName) { Console.WriteLine("Parsed type name {0} does not match original {1}", parsed.ObjCName, objcType.ObjCName); return(null); } if (!objcType.IsUserType) { Console.WriteLine("Parsed type {0} is not a user type", objcType); return(null); } //FIXME: fix data loss when there are multiple designer types in one designer file, like MT templates var designerFile = objcType.GetDesignerFile(); //FIXME: add a designer file if there are any designer outlets and actions if (designerFile == null) { return(null); } //FIXME: detect unresolved types parsed.MergeCliInfo(objcType); pinfo.ResolveTypes(parsed); return(new SyncObjcBackJob() { HFile = hFile, DesignerFile = designerFile, Type = parsed, }); }
public override void SyncBack(IProgressMonitor monitor, XcodeSyncBackContext context) { monitor.Log.WriteLine("Queueing sync-back of changes made to the {0} class from Xcode.", Type.CliName); var objcType = context.ProjectInfo.GetType(Type.ObjCName); var hFile = GetObjCHeaderPath(context); if (objcType == null) { context.ReportError("Missing Objective-C type: {0}", Type.ObjCName); return; } if (!objcType.IsUserType) { context.ReportError("Parsed Objective-C type '{0}' is not a user type", objcType); return; } var parsed = NSObjectInfoService.ParseHeader(hFile); if (parsed == null) { context.ReportError("Error parsing Objective-C type: {0}", Type.ObjCName); return; } if (parsed.ObjCName != objcType.ObjCName) { context.ReportError("Parsed type name '{0}' does not match original: {1}", parsed.ObjCName, objcType.ObjCName); return; } parsed.MergeCliInfo(objcType); context.TypeSyncJobs.Add(XcodeSyncObjcBackJob.UpdateType(parsed, objcType.GetDesignerFile())); }
void UpdateTypes(bool rescan) { var pinfo = NSObjectInfoService.GetProjectInfo(dnp); pinfo.Update(rescan); var currentUTs = new Dictionary <string, NSObjectTypeInfo> (); foreach (var ut in pinfo.GetTypes().Where(t => t.IsUserType)) { currentUTs.Add(ut.ObjCName, ut); } foreach (var removed in this.userClasses.Where(c => !currentUTs.ContainsKey(c)).ToList()) { RemoveUserType(removed); } foreach (var ut in currentUTs) { UpdateUserType(ut.Value); } }
public XcodeSyncBackContext GetChanges(IProgressMonitor monitor, NSObjectInfoService infoService, DotNetProject project) { var ctx = new XcodeSyncBackContext(projectDir, syncTimeCache, infoService, project); var needsSync = new List <XcodeSyncedItem> (items.Where(i => i.NeedsSyncBack(ctx))); var knownFiles = GetKnownFiles(); ScanForAddedFiles(ctx, knownFiles, projectDir, null); if (needsSync.Count > 0) { monitor.BeginStepTask(GettextCatalog.GetString("Synchronizing Xcode project changes"), needsSync.Count, 1); for (int i = 0; i < needsSync.Count; i++) { var item = needsSync [i]; item.SyncBack(ctx); monitor.Step(1); } monitor.Log.WriteLine(GettextCatalog.GetPluralString("Synchronized {0} file", "Synchronized {0} files", needsSync.Count), needsSync.Count); monitor.EndTask(); } return(ctx); }
public override void SyncBack(XcodeSyncBackContext context) { var hFile = context.ProjectDir.Combine(Type.ObjCName + ".h"); var objcType = context.ProjectInfo.GetType(Type.ObjCName); if (objcType == null) { context.ReportError("Missing objc type {0}", Type.ObjCName); return; } if (!objcType.IsUserType) { context.ReportError("Parsed type {0} is not a user type", objcType); return; } var parsed = NSObjectInfoService.ParseHeader(hFile); if (parsed == null) { context.ReportError("Error parsing objc type {0}", Type.ObjCName); return; } if (parsed.ObjCName != objcType.ObjCName) { context.ReportError("Parsed type name {0} does not match original {1}", parsed.ObjCName, objcType.ObjCName); return; } parsed.MergeCliInfo(objcType); context.TypeSyncJobs.Add(XcodeSyncObjcBackJob.UpdateType(parsed, objcType.GetDesignerFile())); }
void ScanForAddedFiles(XcodeSyncBackContext ctx, HashSet <string> knownFiles, string directory, string relativePath) { foreach (var file in Directory.EnumerateFiles(directory)) { if (file.EndsWith("~") || file.EndsWith(".m")) { continue; } if (knownFiles.Contains(file)) { continue; } if (file.EndsWith(".h")) { NSObjectTypeInfo parsed = NSObjectInfoService.ParseHeader(file); ctx.TypeSyncJobs.Add(XcodeSyncObjcBackJob.NewType(parsed, relativePath)); } else { FilePath original, relative; if (relativePath != null) { relative = new FilePath(Path.Combine(relativePath, Path.GetFileName(file))); } else { relative = new FilePath(Path.GetFileName(file)); } original = ctx.Project.BaseDirectory.Combine(relative); ctx.FileSyncJobs.Add(new XcodeSyncFileBackJob(original, relative, true)); } } foreach (var dir in Directory.EnumerateDirectories(directory)) { string relative; // Ignore *.xcodeproj directories and any directories named DerivedData at the toplevel if (dir.EndsWith(".xcodeproj") || (relativePath == null && Path.GetFileName(dir) == "DerivedData")) { continue; } if (relativePath != null) { relative = Path.Combine(relativePath, Path.GetFileName(dir)); } else { relative = Path.GetFileName(dir); } ScanForAddedFiles(ctx, knownFiles, dir, relative); } }
public XcodeProjectTracker(DotNetProject dnp, NSObjectInfoService infoService) { this.dnp = dnp; this.infoService = infoService; AppleSdkSettings.Changed += DisableSyncing; }