rename and delete fs events for files
This commit is contained in:
@@ -803,4 +803,11 @@ public class RoslynAnalysis
|
|||||||
var updatedSolution = _workspace.CurrentSolution.WithDocumentFilePath(document, sharpIdeFile.Path);
|
var updatedSolution = _workspace.CurrentSolution.WithDocumentFilePath(document, sharpIdeFile.Path);
|
||||||
_workspace.TryApplyChanges(updatedSolution);
|
_workspace.TryApplyChanges(updatedSolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task RenameDocument(SharpIdeFile sharpIdeFile, string oldFilePath)
|
||||||
|
{
|
||||||
|
var documentId = _workspace!.CurrentSolution.GetDocumentIdsWithFilePath(oldFilePath).Single();
|
||||||
|
var updatedSolution = _workspace.CurrentSolution.WithDocumentName(documentId, sharpIdeFile.Name);
|
||||||
|
_workspace.TryApplyChanges(updatedSolution);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,15 @@ public class FileChangedService(RoslynAnalysis roslynAnalysis, IdeOpenTabsFileMa
|
|||||||
|
|
||||||
public SharpIdeSolutionModel SolutionModel { get; set; } = null!;
|
public SharpIdeSolutionModel SolutionModel { get; set; } = null!;
|
||||||
|
|
||||||
|
public async Task SharpIdeFileRenamed(SharpIdeFile file, string oldFilePath)
|
||||||
|
{
|
||||||
|
if (file.IsRoslynWorkspaceFile)
|
||||||
|
{
|
||||||
|
await HandleWorkspaceFileRenamed(file, oldFilePath);
|
||||||
|
}
|
||||||
|
// TODO: handle csproj moved
|
||||||
|
}
|
||||||
|
|
||||||
public async Task SharpIdeFileMoved(SharpIdeFile file, string oldFilePath)
|
public async Task SharpIdeFileMoved(SharpIdeFile file, string oldFilePath)
|
||||||
{
|
{
|
||||||
if (file.IsRoslynWorkspaceFile)
|
if (file.IsRoslynWorkspaceFile)
|
||||||
@@ -145,4 +154,15 @@ public class FileChangedService(RoslynAnalysis roslynAnalysis, IdeOpenTabsFileMa
|
|||||||
GlobalEvents.Instance.SolutionAltered.InvokeParallelFireAndForget();
|
GlobalEvents.Instance.SolutionAltered.InvokeParallelFireAndForget();
|
||||||
await _roslynAnalysis.UpdateSolutionDiagnostics(newCts.Token);
|
await _roslynAnalysis.UpdateSolutionDiagnostics(newCts.Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task HandleWorkspaceFileRenamed(SharpIdeFile file, string oldFilePath)
|
||||||
|
{
|
||||||
|
var newCts = new CancellationTokenSource();
|
||||||
|
var oldCts = Interlocked.Exchange(ref _updateSolutionDiagnosticsCts, newCts);
|
||||||
|
await oldCts.CancelAsync();
|
||||||
|
oldCts.Dispose();
|
||||||
|
await _roslynAnalysis.MoveDocument(file, oldFilePath);
|
||||||
|
GlobalEvents.Instance.SolutionAltered.InvokeParallelFireAndForget();
|
||||||
|
await _roslynAnalysis.UpdateSolutionDiagnostics(newCts.Token);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,11 +16,27 @@ public class IdeFileExternalChangeHandler
|
|||||||
_sharpIdeSolutionModificationService = sharpIdeSolutionModificationService;
|
_sharpIdeSolutionModificationService = sharpIdeSolutionModificationService;
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.Subscribe(OnFileChanged);
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.Subscribe(OnFileChanged);
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.FileCreated.Subscribe(OnFileCreated);
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileCreated.Subscribe(OnFileCreated);
|
||||||
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileDeleted.Subscribe(OnFileDeleted);
|
||||||
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileRenamed.Subscribe(OnFileRenamed);
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryCreated.Subscribe(OnFolderCreated);
|
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryCreated.Subscribe(OnFolderCreated);
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryDeleted.Subscribe(OnFolderDeleted);
|
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryDeleted.Subscribe(OnFolderDeleted);
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryRenamed.Subscribe(OnFolderRenamed);
|
GlobalEvents.Instance.FileSystemWatcherInternal.DirectoryRenamed.Subscribe(OnFolderRenamed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task OnFileRenamed(string oldFilePath, string newFilePath)
|
||||||
|
{
|
||||||
|
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == oldFilePath);
|
||||||
|
if (sharpIdeFile is null) return;
|
||||||
|
await _sharpIdeSolutionModificationService.RenameFile(sharpIdeFile, Path.GetFileName(newFilePath));
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnFileDeleted(string filePath)
|
||||||
|
{
|
||||||
|
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == filePath);
|
||||||
|
if (sharpIdeFile is null) return;
|
||||||
|
await _sharpIdeSolutionModificationService.RemoveFile(sharpIdeFile);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Test - this most likely only will ever be called on linux - windows and macos(?) does delete + create on rename of folders
|
// TODO: Test - this most likely only will ever be called on linux - windows and macos(?) does delete + create on rename of folders
|
||||||
private async Task OnFolderRenamed(string oldFolderPath, string newFolderPath)
|
private async Task OnFolderRenamed(string oldFolderPath, string newFolderPath)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -151,4 +151,14 @@ public class SharpIdeSolutionModificationService(FileChangedService fileChangedS
|
|||||||
await _fileChangedService.SharpIdeFileMoved(fileToMove, oldPath);
|
await _fileChangedService.SharpIdeFileMoved(fileToMove, oldPath);
|
||||||
return fileToMove;
|
return fileToMove;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<SharpIdeFile> RenameFile(SharpIdeFile fileToRename, string renamedFileName)
|
||||||
|
{
|
||||||
|
var oldPath = fileToRename.Path;
|
||||||
|
var newFilePath = Path.Combine(Path.GetDirectoryName(oldPath)!, renamedFileName);
|
||||||
|
fileToRename.Name = renamedFileName;
|
||||||
|
fileToRename.Path = newFilePath;
|
||||||
|
await _fileChangedService.SharpIdeFileRenamed(fileToRename, oldPath);
|
||||||
|
return fileToRename;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -282,6 +282,13 @@ public partial class SolutionExplorerPanel : MarginContainer
|
|||||||
fileItem.SetText(0, sharpIdeFile.Name);
|
fileItem.SetText(0, sharpIdeFile.Name);
|
||||||
fileItem.SetIcon(0, CsharpFileIcon);
|
fileItem.SetIcon(0, CsharpFileIcon);
|
||||||
fileItem.SetMetadata(0, new RefCountedContainer<SharpIdeFile>(sharpIdeFile));
|
fileItem.SetMetadata(0, new RefCountedContainer<SharpIdeFile>(sharpIdeFile));
|
||||||
|
|
||||||
|
Observable.EveryValueChanged(sharpIdeFile, folder => folder.Name)
|
||||||
|
.Skip(1).SubscribeAwait(async (s, ct) =>
|
||||||
|
{
|
||||||
|
await this.InvokeAsync(() => fileItem.SetText(0, s));
|
||||||
|
}).AddTo(this);
|
||||||
|
|
||||||
return fileItem;
|
return fileItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user