private void ProcessReplace(IEnumerable<string> replacePathes, ProjectScanItem projectScanItem) { foreach (var replacePath in replacePathes) { var lines = File.ReadAllLines(replacePath); var newLines = new List<string>(); foreach (var line in lines) { var isFound = false; foreach (var file in projectScanItem.Files.Where(x => x.NewId.HasValue)) { var r = Regex.Match(line, $" m_Script: {{fileID: {file.OldId}, guid: {projectScanItem.ProjectGuid.ToString("n").ToLower()}, type: 3}}", RegexOptions.IgnoreCase); if (r.Success) { newLines.Add( r.Result( $" m_Script: {{fileID: {file.NewId}, guid: {projectScanItem.ProjectGuid.ToString("n").ToLower()}, type: 3}}")); isFound = true; break; } } if (!isFound) newLines.Add(line); } File.WriteAllLines(replacePath, newLines.ToArray()); } }
private void ProcessProjectScanItem(ProjectScanItem projectScanItem) { var renamed = projectScanItem.Files.Where(x => x.NewId.HasValue); foreach (var r in renamed) { r.OldId = r.NewId.Value; r.NewId = null; } CommonService.SaveSyncProjectItemsToCache(); }
private void ProcessFiles(ProjectScanItem projectScanItem) { var path = Cache.Instance.Settings.UnityProjectPath; var scenes = GetFilePathes(path, "*.unity"); var prefabs = GetFilePathes(path, "*.prefab"); var replaceIn = new List<string>(); replaceIn.AddRange(scenes); replaceIn.AddRange(prefabs); ProcessReplace(replaceIn, projectScanItem); ProcessProjectScanItem(projectScanItem); }
private static string ExamineProjectItem(ProjectItem item, ProjectScanItem projectScan, IVsHierarchy projectHierarchy) { var fileName = item.FileNames[1]; if (Path.GetExtension(fileName) != ".cs") return null; var code = item.FileCodeModel; if (code == null) return null; var className = string.Empty; var namespaceName = string.Empty; foreach (CodeElement codeElement in code.CodeElements) { if (string.IsNullOrEmpty(className)) className = ExamineCodeElement(codeElement, vsCMElement.vsCMElementClass); if (string.IsNullOrEmpty(namespaceName)) namespaceName = ExamineCodeElement(codeElement, vsCMElement.vsCMElementNamespace); if (!string.IsNullOrEmpty(className) && !string.IsNullOrEmpty(namespaceName)) break; } if (string.IsNullOrEmpty(className)) return null; uint itemId; if (projectHierarchy.ParseCanonicalName(item.FileNames[0], out itemId) == VSConstants.S_OK) { var buildPropertyStorage = projectHierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage == null) return null; string fileGuid; buildPropertyStorage.GetItemAttribute(itemId, PersistentFileGuidName, out fileGuid); if (string.IsNullOrEmpty(fileGuid)) { fileGuid = Guid.NewGuid().ToString(); buildPropertyStorage.SetItemAttribute(itemId, PersistentFileGuidName, fileGuid); item.ContainingProject.Save(); } if (string.IsNullOrEmpty(fileGuid)) return null; var file = projectScan.Files.FirstOrDefault(x => x.ProjectFileId == fileGuid); var fileId = FileIdGenerator.Compute(namespaceName, className); if (file == null) { projectScan.Files.Add(new FileScanItem { ProjectFileId = fileGuid, OldId = fileId }); } else { var newId = fileId; if (file.OldId != newId) file.NewId = newId; } return fileGuid; } return null; }
private static IEnumerable<string> NavigateProjectItems(ProjectItems projectItems, ProjectScanItem projectScan, IVsHierarchy projectHierarchy) { var fileGuids = new List<string>(); if (projectItems == null) return fileGuids; foreach (ProjectItem item in projectItems) { fileGuids.AddRange(NavigateProjectItems(item.ProjectItems, projectScan, projectHierarchy)); if (item.Kind != "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}") // VSConstants.GUID_ItemType_PhysicalFile continue; var fileGuid = ExamineProjectItem(item, projectScan, projectHierarchy); if (!string.IsNullOrEmpty(fileGuid)) fileGuids.Add(fileGuid); } return fileGuids; }