Beispiel #1
0
        public async Task SaveProjectFileExternally_TwoSolutionsOpened_NoCommonDirectories()
        {
            string solFile = Util.GetSampleProject("console-project", "ConsoleProject.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p     = (DotNetProject)sol.Items [0];
            var file1 = p.Files.First(f => f.FilePath.FileName == "Program.cs");

            solFile = Util.GetSampleProject("console-with-libs", "console-with-libs.sln");
            using (var sol2 = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile)) {
                var p2    = sol2.GetAllProjects().First(project => project.FileName.FileName == "console-with-libs.csproj");
                var file2 = p2.Files.First(f => f.FilePath.FileName == "Program.cs");
                ClearFileEventsCaptured();
                await FileWatcherService.Add(sol);

                await FileWatcherService.Add(sol2);

                TextFileUtility.WriteText(file1.FilePath, string.Empty, Encoding.UTF8);
                TextFileUtility.WriteText(file2.FilePath, string.Empty, Encoding.UTF8);
                await WaitForFilesChanged(new [] { file1.FilePath, file2.FilePath });

                AssertFileChanged(file1.FilePath);
                AssertFileChanged(file2.FilePath);
            }
        }
        async Task FormatFile(Project p, FilePath file)
        {
            string mime = DesktopService.GetMimeTypeForUri(file);

            if (mime == null)
            {
                return;
            }

            var formatter = CodeFormatterService.GetFormatter(mime);

            if (formatter != null)
            {
                try {
                    var content = await TextFileUtility.ReadAllTextAsync(file);

                    var formatted = formatter.FormatText(p.Policies, content.Text);
                    if (formatted != null)
                    {
                        TextFileUtility.WriteText(file, formatted, content.Encoding);
                    }
                } catch (Exception ex) {
                    LoggingService.LogError("File formatting failed", ex);
                }
            }
        }
Beispiel #3
0
        protected virtual Task OnSaveUserProperties()
        {
            FilePath file      = GetPreferencesFileName();
            var      userProps = userProperties;

            return(Task.Run(() => {
                if (userProps == null || userProps.IsEmpty)
                {
                    if (File.Exists(file))
                    {
                        File.Delete(file);
                    }
                    return;
                }
                using (var sw = new StringWriter()) {
                    XmlTextWriter writer = null;
                    try {
                        writer = new XmlTextWriter(sw);
                        writer.Formatting = Formatting.Indented;
                        XmlDataSerializer ser = new XmlDataSerializer(new DataContext());
                        ser.SerializationContext.BaseFile = file;
                        ser.Serialize(writer, userProps, typeof(PropertyBag));
                        TextFileUtility.WriteText(file, sw.ToString(), Encoding.UTF8);
                    } catch (Exception e) {
                        LoggingService.LogWarning("Could not save solution preferences: " + file, e);
                    } finally {
                        if (writer != null)
                        {
                            writer.Close();
                        }
                    }
                }
            }));
        }
Beispiel #4
0
        public async Task SaveProjectFileExternally_TwoSolutionsOpen_SolutionsHaveCommonDirectories()
        {
            FilePath rootProject = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   solFile     = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p1    = (DotNetProject)sol.Items [0];
            var file1 = p1.Files.First(f => f.FilePath.FileName == "MyClass.cs");

            solFile = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest2.sln");
            using (var sol2 = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile)) {
                var p2    = (DotNetProject)sol.Items [0];
                var file2 = p2.Files.First(f => f.FilePath.FileName == "MyClass.cs");
                ClearFileEventsCaptured();
                await FileWatcherService.Add(sol);

                await FileWatcherService.Add(sol2);

                TextFileUtility.WriteText(file1.FilePath, string.Empty, Encoding.UTF8);
                TextFileUtility.WriteText(file2.FilePath, string.Empty, Encoding.UTF8);
                await WaitForFilesChanged(new [] { file1.FilePath, file2.FilePath });

                AssertFileChanged(file1.FilePath);
                AssertFileChanged(file2.FilePath);
            }
        }
Beispiel #5
0
 internal void ApplyChanges()
 {
     if (loadingError)
     {
         return;
     }
     try {
         TextFileUtility.WriteText(TypeSystemService.RuleSetManager.GlobalRulesetFileName, TextEditor.Text, encoding);
     } catch (Exception e) {
         LoggingService.LogError("Error while saving global rule set file " + TypeSystemService.RuleSetManager.GlobalRulesetFileName, e);
         MessageService.ShowError(GettextCatalog.GetString("Error while saving global rule set file '{0}'.", TypeSystemService.RuleSetManager.GlobalRulesetFileName));
     }
 }
Beispiel #6
0
        /// <summary>
        /// Tries the fix the issues passed in <paramref name="issues"/>.
        /// </summary>
        /// <param name="issues">The issues to fix.</param>
        /// <returns>The fix issues.</returns>
        public IEnumerable <ActionSummary> TryFixIssues(IEnumerable <ActionSummary> actions)
        {
            if (actions == null)
            {
                throw new ArgumentNullException("actions");
            }

            // enumerate once
            var actionSummaries = actions as IList <ActionSummary> ?? actions.ToArray();
            var issueSummaries  = actionSummaries.Select(action => action.IssueSummary).ToArray();
            var files           = issueSummaries.Select(issue => issue.File).ToList();

            monitor.BeginTask("Applying fixes", files.Count);

            var appliedActions = new List <ActionSummary> (issueSummaries.Length);

            Parallel.ForEach(files, file => {
                monitor.Step(1);

                var fileSummaries = issueSummaries.Where(summary => summary.File == file);
                var inspectorIds  = new HashSet <string> (fileSummaries.Select(summary => summary.InspectorIdString));

                bool hadBom;
                Encoding encoding;
                bool isOpen;
                var data = TextFileProvider.Instance.GetTextEditorData(file.FilePath, out hadBom, out encoding, out isOpen);
                object refactoringContext;
                var realActions = GetIssues(data, file, inspectorIds, out refactoringContext).SelectMany(issue => issue.Actions).ToList();
                if (realActions.Count == 0 || refactoringContext == null)
                {
                    return;
                }

                var fileActionSummaries = actionSummaries.Where(summary => summary.IssueSummary.File == file).ToList();
                var matches             = matcher.Match(fileActionSummaries, realActions).ToList();

                var appliedFixes = RefactoringService.ApplyFixes(matches.Select(match => match.Action), refactoringContext);
                appliedActions.AddRange(matches.Where(match => appliedFixes.Contains(match.Action)).Select(match => match.Summary));

                if (!isOpen)
                {
                    // If the file is open we leave it to the user to explicitly save the file
                    TextFileUtility.WriteText(file.Name, data.Text, encoding, hadBom);
                }
            });
            return(appliedActions);
        }
Beispiel #7
0
        public async Task SaveFileInProjectExternally()
        {
            string solFile = Util.GetSampleProject("console-project", "ConsoleProject.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p    = (DotNetProject)sol.Items [0];
            var file = p.Files.First(f => f.FilePath.FileName == "Program.cs");

            ClearFileEventsCaptured();
            await FileWatcherService.Add(sol);

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);

            await WaitForFileChanged(file.FilePath);

            AssertFileChanged(file.FilePath);
        }
Beispiel #8
0
 public virtual void EndReplace()
 {
     if (textBuffer != null)
     {
         Gtk.Application.Invoke((o, args) => {
             textEdit.Apply();
             textEdit = null;
         });
         return;
     }
     if (buffer != null && somethingReplaced)
     {
         object attributes = IdeServices.DesktopService.GetFileAttributes(FileName);
         TextFileUtility.WriteText(FileName, buffer.ToString(), encoding ?? Encoding.UTF8);
         IdeServices.DesktopService.SetFileAttributes(FileName, attributes);
     }
     buffer = null;
 }
Beispiel #9
0
        public async Task CreateDirectory_AddFolderItemToProject_DirectoryDeletedEventIsNotFired()
        {
            FilePath rootProject = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   solFile     = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest2.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p = (DotNetProject)sol.Items [0];

            p.UseAdvancedGlobSupport = true;
            p.UseFileWatcher         = true;
            var file = p.Files.First(f => f.FilePath.FileName == "MyClass.cs");

            ClearFileEventsCaptured();
            await FileWatcherService.Add(sol);

            var newDirectory = p.BaseDirectory.Combine("NewFolder");

            Directory.CreateDirectory(newDirectory);

            var newFolderItem = new ProjectFile(newDirectory);

            newFolderItem.Subtype = Subtype.Directory;
            p.Files.Add(newFolderItem);

            var newDirectory2  = p.BaseDirectory.Combine("NewFolder2");
            var newFolderItem2 = new ProjectFile(newDirectory2);

            newFolderItem2.Subtype = Subtype.Directory;
            p.Files.Add(newFolderItem2);

            Directory.CreateDirectory(newDirectory2);

            await p.SaveAsync(Util.GetMonitor());

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
            await WaitForFileChanged(file.FilePath);

            AssertFileChanged(file.FilePath);
            Assert.IsTrue(p.Files.Contains(newFolderItem));
            Assert.IsTrue(p.Files.Contains(newFolderItem2));
            Assert.IsFalse(filesRemoved.Any(f => f.FileName == newDirectory));
            Assert.IsFalse(filesRemoved.Any(f => f.FileName == newDirectory2));
        }
Beispiel #10
0
        public async Task AddNewProjectToSolution_ChangeFileInNewProject()
        {
            FilePath rootProject = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   solFile     = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest3.sln");

            using var sol = (Solution) await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p         = (DotNetProject)sol.Items [0];
            var otherFile = p.Files.First(f => f.FilePath.FileName == "MyClass.cs");
            await FileWatcherService.Add(sol);

            var libraryProjectFile = rootProject.ParentDirectory.Combine("Library", "Library.csproj");

            ProjectFile file;

            using (var p2 = (DotNetProject)await sol.RootFolder.AddItem(Util.GetMonitor(), libraryProjectFile)) {
                await sol.SaveAsync(Util.GetMonitor());

                file = p2.Files.First(f => f.FilePath.FileName == "MyClass.cs");
                await FileWatcherService.Update();

                ClearFileEventsCaptured();

                TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
                await WaitForFileChanged(file.FilePath);

                AssertFileChanged(file.FilePath);
                Assert.IsFalse(file.FilePath.IsChildPathOf(sol.BaseDirectory));

                sol.RootFolder.Items.Remove(p2);
            }
            await sol.SaveAsync(Util.GetMonitor());

            await FileWatcherService.Update();

            ClearFileEventsCaptured();

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
            TextFileUtility.WriteText(otherFile.FilePath, string.Empty, Encoding.UTF8);
            await WaitForFilesChanged(new [] { file.FilePath, otherFile.FilePath });

            Assert.IsFalse(fileChanges.Any(f => f.FileName == file.FilePath));
        }
Beispiel #11
0
        public async Task AddSolutionToWorkspace_ChangeFileInAddedSolution()
        {
            FilePath rootProject   = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   workspaceFile = rootProject.ParentDirectory.Combine("Workspace", "FileWatcherTest.mdw");

            using (var workspace = (Workspace)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), workspaceFile)) {
                await FileWatcherService.Add(workspace);

                string solFile = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest3.sln");
                sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

                var p    = (DotNetProject)sol.Items [0];
                var file = p.Files.First(f => f.FilePath.FileName == "MyClass.cs");
                workspace.Items.Add(sol);
                await workspace.SaveAsync(Util.GetMonitor());

                var otherFile = workspace.FileName.ParentDirectory.Combine("test.txt");
                ClearFileEventsCaptured();

                // Make sure file watcher is updated since adding the new solution
                // will start a task and may not have finished. So force an update here.
                await FileWatcherService.Update();

                TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
                await WaitForFileChanged(file.FilePath);

                AssertFileChanged(file.FilePath);
                Assert.IsFalse(file.FilePath.IsChildPathOf(workspace.BaseDirectory));

                workspace.Items.Remove(sol);
                await workspace.SaveAsync(Util.GetMonitor());

                await FileWatcherService.Update();

                ClearFileEventsCaptured();

                TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
                TextFileUtility.WriteText(otherFile, string.Empty, Encoding.UTF8);
                await WaitForFilesChanged(new [] { file.FilePath, otherFile });

                Assert.IsFalse(fileChanges.Any(f => f.FileName == file.FilePath));
            }
        }
Beispiel #12
0
        public async Task AddFile_FileOutsideSolutionDirectory()
        {
            FilePath rootProject = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   solFile     = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest3.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p     = (DotNetProject)sol.Items [0];
            var file2 = p.Files.First(f => f.FilePath.FileName == "MyClass.cs");

            ClearFileEventsCaptured();
            await FileWatcherService.Add(sol);

            var newFile = rootProject.ParentDirectory.Combine("Library", "MyClass.cs");
            var file    = new ProjectFile(newFile);

            file.Link = "LinkedMyClass.cs";
            p.AddFile(file);
            await FileWatcherService.Update();

            ClearFileEventsCaptured();

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
            await WaitForFileChanged(file.FilePath);

            AssertFileChanged(file.FilePath);
            Assert.IsFalse(file.FilePath.IsChildPathOf(p.BaseDirectory));
            Assert.IsFalse(file.FilePath.IsChildPathOf(sol.BaseDirectory));

            // After removing the file no events should be generated for the file.
            p.Files.Remove(file);
            await FileWatcherService.Update();

            ClearFileEventsCaptured();

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
            TextFileUtility.WriteText(file2.FilePath, string.Empty, Encoding.UTF8);
            await WaitForFilesChanged(new [] { file.FilePath, file2.FilePath });

            AssertFileChanged(file2.FilePath);
            Assert.IsFalse(fileChanges.Any(f => f.FileName == file.FilePath));
        }
Beispiel #13
0
        public async Task SaveProjectFileExternally_FileOutsideSolutionDirectory()
        {
            FilePath rootProject = Util.GetSampleProject("FileWatcherTest", "Root.csproj");
            string   solFile     = rootProject.ParentDirectory.Combine("FileWatcherTest", "FileWatcherTest2.sln");

            sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile);

            var p    = (DotNetProject)sol.Items [0];
            var file = p.Files.First(f => f.FilePath.FileName == "MyClass.cs");

            ClearFileEventsCaptured();
            await FileWatcherService.Add(sol);

            TextFileUtility.WriteText(file.FilePath, string.Empty, Encoding.UTF8);
            await WaitForFileChanged(file.FilePath);

            AssertFileChanged(file.FilePath);
            Assert.IsFalse(file.FilePath.IsChildPathOf(p.BaseDirectory));
            Assert.IsFalse(file.FilePath.IsChildPathOf(sol.BaseDirectory));
        }
        public static void FormatFile(PolicyContainer policies, FilePath fileName)
        {
            CodeFormatter formatter = GetFormatter(fileName);

            if (formatter == null)
            {
                return;
            }

            try {
                string content   = File.ReadAllText(fileName);
                string formatted = formatter.FormatText(policies, content);
                if (formatted != null)
                {
                    TextFileUtility.WriteText(fileName, formatted, Encoding.UTF8);
                }
            } catch (Exception ex) {
                TemplatingServices.LogError("File formatting failed", ex);
            }
        }
        public async Task TextFileUtility_WriteText_FileNotRemovedAndAddedBackToProject()
        {
            var project = await OpenProject();

            var fileAdded      = WaitForSingleFileAdded(project);
            var csharpFilePath = WriteFile(project.BaseDirectory, "CSharpFile.cs");

            await AssertFileAddedToProject(fileAdded, csharpFilePath, "Compile");

            fileAdded = WaitForSingleFileAdded(project);
            var fileRemoved = WaitForSingleFileRemoved(project);

            TextFileUtility.WriteText(csharpFilePath, "//", Encoding.UTF8);

            // Finished task should be the delay timeout. No file should be added or
            // removed when the C# file is saved.
            var finishedTask = await Task.WhenAny(fileAdded, fileRemoved, Task.Delay(500));

            Assert.AreNotEqual(fileAdded, finishedTask);
            Assert.AreNotEqual(fileRemoved, finishedTask);
        }
Beispiel #16
0
        public async Task WatchDirectories_TwoFilesChanged_OneClosed()
        {
            FilePath rootSolFile = Util.GetSampleProject("FileWatcherTest", "Root.sln");
            var      file1       = rootSolFile.ParentDirectory.Combine("FileWatcherTest", "MyClass.cs");
            var      file2       = rootSolFile.ParentDirectory.Combine("Library", "Properties", "AssemblyInfo.cs");
            var      id          = new object();

            try {
                var directories = new [] {
                    file1.ParentDirectory,
                    file2.ParentDirectory
                };
                await FileWatcherService.WatchDirectories(id, directories);

                TextFileUtility.WriteText(file1, string.Empty, Encoding.UTF8);
                TextFileUtility.WriteText(file2, string.Empty, Encoding.UTF8);
                await WaitForFilesChanged(new [] { file1, file2 });

                AssertFileChanged(file1);
                AssertFileChanged(file2);

                // Unwatch one directory.
                directories = new [] {
                    file1.ParentDirectory
                };
                await FileWatcherService.WatchDirectories(id, directories);

                ClearFileEventsCaptured();
                fileChangesTask = new TaskCompletionSource <bool> ();

                TextFileUtility.WriteText(file2, string.Empty, Encoding.UTF8);
                TextFileUtility.WriteText(file1, string.Empty, Encoding.UTF8);
                await WaitForFilesChanged(new [] { file1, file2 });

                AssertFileChanged(file1);
                Assert.IsFalse(fileChanges.Any(f => f.FileName == file2));
            } finally {
                await FileWatcherService.WatchDirectories(id, null);
            }
        }
Beispiel #17
0
 public virtual void EndReplace()
 {
     if (document != null)
     {
         Gtk.Application.Invoke((o, args) => {
             if (undoGroup != null)
             {
                 undoGroup.Dispose();
                 undoGroup = null;
             }
             /*document.Editor.Document.CommitUpdateAll (); */
         });
         return;
     }
     if (buffer != null && somethingReplaced)
     {
         object attributes = DesktopService.GetFileAttributes(FileName);
         TextFileUtility.WriteText(FileName, buffer.ToString(), encoding ?? Encoding.UTF8);
         DesktopService.SetFileAttributes(FileName, attributes);
     }
     buffer = null;
 }
Beispiel #18
0
 public void EndReplace()
 {
     if (document != null)
     {
         Gtk.Application.Invoke(delegate {
             if (undoGroup != null)
             {
                 undoGroup.Dispose();
                 undoGroup = null;
             }
             /*document.Editor.Document.CommitUpdateAll (); */
         });
         return;
     }
     if (buffer != null && somethingReplaced)
     {
         object attributes = DesktopService.GetFileAttributes(FileName);
         TextFileUtility.WriteText(FileName, buffer.ToString(), encoding, hadBom);
         DesktopService.SetFileAttributes(FileName, attributes);
     }
     FileService.NotifyFileChanged(FileName);
     buffer = null;
 }
Beispiel #19
0
        async Task <bool> SaveAsTask(string filename)
        {
            if (Window.ViewContent.IsViewOnly || !Window.ViewContent.IsFile)
            {
                return(false);
            }

            Encoding encoding = null;

            var tbuffer = GetContent <ITextSource> ();

            if (tbuffer != null)
            {
                encoding = tbuffer.Encoding;
                if (encoding == null)
                {
                    encoding = Encoding.UTF8;
                }
            }

            if (filename == null)
            {
                var dlg = new OpenFileDialog(GettextCatalog.GetString("Save as..."), MonoDevelop.Components.FileChooserAction.Save)
                {
                    TransientFor         = IdeApp.Workbench.RootWindow,
                    Encoding             = encoding,
                    ShowEncodingSelector = (tbuffer != null),
                };
                if (Window.ViewContent.IsUntitled)
                {
                    dlg.InitialFileName = Window.ViewContent.UntitledName;
                }
                else
                {
                    dlg.CurrentFolder   = Path.GetDirectoryName((string)Window.ViewContent.ContentName);
                    dlg.InitialFileName = Path.GetFileName((string)Window.ViewContent.ContentName);
                }

                if (!dlg.Run())
                {
                    return(false);
                }

                filename = dlg.SelectedFile;
                encoding = dlg.Encoding;
            }

            if (!FileService.IsValidPath(filename))
            {
                MessageService.ShowMessage(GettextCatalog.GetString("File name {0} is invalid", filename));
                return(false);
            }
            // detect preexisting file
            if (File.Exists(filename))
            {
                if (!MessageService.Confirm(GettextCatalog.GetString("File {0} already exists. Overwrite?", filename), AlertButton.OverwriteFile))
                {
                    return(false);
                }
            }

            // save backup first
            if (IdeApp.Preferences.CreateFileBackupCopies)
            {
                if (tbuffer != null && encoding != null)
                {
                    TextFileUtility.WriteText(filename + "~", tbuffer.Text, encoding);
                }
                else
                {
                    await Window.ViewContent.Save(new FileSaveInformation (filename + "~", encoding));
                }
            }
            TypeSystemService.RemoveSkippedfile(FileName);

            // do actual save
            Window.ViewContent.ContentName = filename;
            Window.ViewContent.Project     = Workbench.GetProjectContainingFile(filename);
            await Window.ViewContent.Save(new FileSaveInformation (filename, encoding));

            DesktopService.RecentFiles.AddFile(filename, (Project)null);

            OnSaved(EventArgs.Empty);

            await UpdateParseDocument();

            return(true);
        }