private bool OnItemRenamed(ProjectItemChange change) { myLogger.Trace("*** resharper-unity: Item renamed {0} -> {1}", change.OldLocation, change.ProjectItem.Location); var oldMetaFile = change.OldParentFolder.Location.Combine(change.OldLocation.Name + ".meta"); var newMetaFile = GetMetaFile(change.ProjectItem.Location); if (oldMetaFile.ExistsFile) { RenameMetaFile(oldMetaFile, newMetaFile, string.Empty); } else { CreateMetaFile(newMetaFile); } // Don't recurse for folder renames - the child contents will be "renamed", but // the old location will no longer be there, and the meta files don't need moving return(!(change.ProjectItem is IProjectFolder)); }
private void OnItemRemoved(ProjectItemChange change) { myLogger.Trace("*** resharper-unity: Item removed {0}", change.OldLocation); var metaFile = GetMetaFile(change.OldLocation); if (!metaFile.ExistsFile) return; if (IsMoveToFolderRefactoring(change)) { var newMetaFile = GetMetaFile(myMetaFileTracker.myLastAddedItem.Location); RenameMetaFile(metaFile, newMetaFile, " via add/remove"); } else { DeleteMetaFile(metaFile); } myMetaFileTracker.myLastAddedItem = null; }
private void VisitFileOrFolderDelta(ProjectItemChange fileOrFolderChange) { var shouldVisitChildren = true; if (IsRenamedAsset(fileOrFolderChange)) { shouldVisitChildren = OnItemRenamed(fileOrFolderChange); } else if (IsAddedAsset(fileOrFolderChange)) { OnItemAdded(fileOrFolderChange); } else if (IsRemovedAsset(fileOrFolderChange)) { OnItemRemoved(fileOrFolderChange); } if (shouldVisitChildren) { base.VisitItemDelta(fileOrFolderChange); } }
private void VisitProjectDelta(ProjectItemChange projectChange, IProject project) { // When a project is reloaded, we get a removal notification for it and all of its // files, followed by a load of addition notifications. If we don't handle this // properly, we'll delete a load of .meta files and create new ones, causing big problems. // So ignore any project removal messages. We can safely ignore them, as a) Unity will // never do this, and b) you can't delete a project from Visual Studio/Rider, only remove it if (projectChange.IsRemoved) { return; } // Don't recurse if this project isn't a Unity project. Note that we don't do this // for the IsRemoved case above, as the project doesn't have a solution at that point, // and IsUnityProject will throw if (!project.IsUnityProject()) { return; } base.VisitItemDelta(projectChange); }
private void FWithItemDelta(ProjectItemChange obj) { var item = obj.ProjectItem; var file = item as IProjectFile; if (file != null && item.ParentFolder != null && file.LanguageType.Is <XXLanguageXXFileType>()) { if (obj.IsRemoved || obj.IsMovedOut) { var project = GetProject(obj.OldParentFolder.GetProject()); project.TryRemoveFile(file); } else if (obj.IsAdded || obj.IsMovedIn) { var project = GetProject(file.GetProject()); var sourceFile = file.ToSourceFile(); if (sourceFile == null) { return; } var nitraFile = project.TryAddFile(file); if (IsOpened) { project.UpdateProperties(); } Action <File> oldHandler; if (_fileOpenNotifyRequest.TryGetValue(nitraFile.FullName, out oldHandler)) { oldHandler(nitraFile); } } } }
private static bool IsAssetOrPackage(ProjectItemChange change) { var rootFolder = GetRootFolder(change.OldParentFolder); var solution = change.GetSolution(); if (solution == null) { return(false); } if (rootFolder == null) { return(false); } if (rootFolder.Location.Equals(solution.SolutionDirectory.Combine(ProjectExtensions.AssetsFolder))) { return(true); } if (rootFolder.Location.Equals(solution.SolutionDirectory.Combine(ProjectExtensions.PackagesFolder)) && !change.OldParentFolder.Location.Equals(solution.SolutionDirectory.Combine(ProjectExtensions.PackagesFolder))) // exclude direct children of PackagesFolder { return(true); } return(change.OldParentFolder.IsLinked); // support local package linked by relative path }
private static bool IsItemMetaFile(ProjectItemChange change) { return(change.ProjectItem.Location.ExtensionWithDot.Equals(".meta", StringComparison.OrdinalIgnoreCase)); }
private static bool IsAsset(ProjectItemChange change) { var rootFolder = GetRootFolder(change.OldParentFolder); return(rootFolder != null && string.Compare(rootFolder.Name, "Assets", StringComparison.OrdinalIgnoreCase) == 0); }
private static bool ShouldHandleChange(ProjectItemChange change) { return(!(change.ProjectItem is IProject) && change.GetOldProject().IsUnityProject() && IsAsset(change) && !IsItemMetaFile(change)); }
private static bool IsRemovedAsset(ProjectItemChange change) { return(change.IsRemoved && ShouldHandleChange(change)); }
private static bool ShouldHandleChange(ProjectItemChange change) { // String comparisons, treat as expensive if we're doing this very frequently return(IsAsset(change) && !IsItemMetaFile(change)); }
private static bool IsItemMetaFile(ProjectItemChange change) { return(change.ProjectItem.Name.EndsWith(".meta", StringComparison.OrdinalIgnoreCase)); }
private void FWithItemDelta(ProjectItemChange obj) { var item = obj.ProjectItem; var file = item as IProjectFile; if (file != null && item.ParentFolder != null && file.LanguageType.Is<XXLanguageXXFileType>()) { if (obj.IsRemoved || obj.IsMovedOut) { var project = GetProject(obj.OldParentFolder.GetProject()); project.TryRemoveFile(file); } else if (obj.IsAdded || obj.IsMovedIn) { var project = GetProject(file.GetProject()); var sourceFile = file.ToSourceFile(); if (sourceFile == null) return; var nitraFile = project.TryAddFile(file); if (IsOpened) project.UpdateProperties(); Action<File> oldHandler; if (_fileOpenNotifyRequest.TryGetValue(nitraFile.FullName, out oldHandler)) oldHandler(nitraFile); } } }
private static bool IsRenamedAsset(ProjectItemChange change) { return change.IsMovedOut && ShouldHandleChange(change); }
public override void VisitItemDelta(ProjectItemChange change) { base.VisitItemDelta(change); var projectFile = change.ProjectItem as IProjectFile; if (projectFile != null && change.ContainsChangeType(ProjectModelChangeType.PROPERTIES)) { } }