Пример #1
0
        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);
        }
Пример #2
0
 public XcodeSyncBackContext(FilePath projectDir, Dictionary <string, DateTime> syncTimes,
                             NSObjectInfoService infoService, DotNetProject project)
     : base(projectDir, syncTimes)
 {
     InfoService = infoService;
     Project     = project;
 }
Пример #3
0
 public XcodeProjectTracker(DotNetProject dnp, NSObjectInfoService infoService)
 {
     if (dnp == null)
     {
         throw new ArgumentNullException("dnp");
     }
     this.dnp                  = dnp;
     this.infoService          = infoService;
     AppleSdkSettings.Changed += AppleSdkSettingsChanged;
 }
Пример #4
0
        //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,
            });
        }
Пример #5
0
        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()));
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
        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()));
        }
Пример #9
0
        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);
            }
        }
Пример #10
0
 public XcodeProjectTracker(DotNetProject dnp, NSObjectInfoService infoService)
 {
     this.dnp                  = dnp;
     this.infoService          = infoService;
     AppleSdkSettings.Changed += DisableSyncing;
 }