diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2019-07-16 16:54:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-16 16:54:11 +0300 |
commit | f8ffeba24afbb19e2ba2bce65247472a5963e559 (patch) | |
tree | 6459ead32cd0355e2cc6cda3331c22da628bf384 /main | |
parent | d2a3faf68c0dfc5cd00f0a7362f4ba1775f15529 (diff) | |
parent | fade89670f0703d508dbe7b61c8967f1560c52e4 (diff) |
Merge pull request #8083 from mono/api-and-perf-cleanups
[Misc] Improve performance of some project APIs and remove some unused obsolete APIs
Diffstat (limited to 'main')
8 files changed, 73 insertions, 135 deletions
diff --git a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/GenerateCommandHandler.cs b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/GenerateCommandHandler.cs index 4ca656aef0..cafd2df9fd 100644 --- a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/GenerateCommandHandler.cs +++ b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/GenerateCommandHandler.cs @@ -45,19 +45,17 @@ namespace MonoDevelop.TextTemplating { var wob = IdeApp.ProjectOperations.CurrentSelectedItem; - var pf = wob as ProjectFile; - if (pf != null) { - CustomToolService.Update (pf, pf.Project, true); + if (wob is ProjectFile pf) { + await CustomToolService.UpdateAsync (pf, pf.Project, true); return; } IEnumerable<ProjectFile> files; - var solution = wob as Solution; - if (solution != null) { + if (wob is Solution solution) { files = solution.GetAllProjects ().SelectMany (GetFilesToUpdate); - } else if (wob is Project) { - files = GetFilesToUpdate ((Project)wob); + } else if (wob is Project proj) { + files = GetFilesToUpdate (proj); } else { return; } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs index c4d28b6590..d91175210f 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs @@ -541,12 +541,6 @@ namespace MonoDevelop.Core Log (LogLevel.Error, message + (ex != null? Environment.NewLine + ex : string.Empty)); } - [Obsolete ("Use LogError")] - public static void LogUserError (string message, Exception ex) - { - Log (LogLevel.Error, FormatExceptionText (message, ex)); - } - /// <summary> /// Reports that an unexpected error has occurred, but the IDE will continue executing. /// Error information is sent to the crash reporting service diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs index 43468d7148..c527edea1d 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs @@ -1751,11 +1751,9 @@ namespace MonoDevelop.Projects /// </param> public ProjectFile AddFile (string filename, string buildAction) { - foreach (ProjectFile fInfo in Files) { - if (fInfo.Name == filename) { - return fInfo; - } - } + var fInfo = Files.GetFileFromFullPath (filename); + if (fInfo != null) + return fInfo; ProjectFile newFile = CreateProjectFileForGlobItem (filename, buildAction); if (newFile != null) { @@ -1845,9 +1843,9 @@ namespace MonoDevelop.Projects { string newPath = Path.Combine (BaseDirectory, relativePath); - foreach (ProjectFile fInfo in Files) - if (fInfo.Name == newPath && fInfo.Subtype == Subtype.Directory) - return fInfo; + var fInfo = Files.GetFileFromFullPath (newPath); + if (fInfo != null && fInfo.Subtype == Subtype.Directory) + return fInfo; if (!Directory.Exists (newPath)) { if (File.Exists (newPath)) { diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs index 7a9bd79cef..725a7b2cf3 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs @@ -678,8 +678,7 @@ namespace MonoDevelop.Projects void RemoveAllInDirectory (string dirName) { foreach (Project projectEntry in GetAllProjects()) { - foreach (ProjectFile file in projectEntry.Files.GetFilesInPath (dirName)) - projectEntry.Files.Remove (file); + projectEntry.Files.RemoveFilesInPath (dirName); } } @@ -689,13 +688,7 @@ namespace MonoDevelop.Projects sf.Files.Remove (fileName); } foreach (Project projectEntry in GetAllProjects()) { - var toDelete = new List<ProjectFile> (); - foreach (ProjectFile fInfo in projectEntry.Files) { - if (fInfo.Name == fileName) - toDelete.Add (fInfo); - } - foreach (ProjectFile file in toDelete) - projectEntry.Files.Remove (file); + projectEntry.Files.Remove (fileName); } } @@ -711,13 +704,13 @@ namespace MonoDevelop.Projects void RenameFileInAllProjects (FilePath oldName, FilePath newName) { foreach (Project projectEntry in GetAllProjects()) { - foreach (ProjectFile fInfo in projectEntry.Files) { - if (fInfo.FilePath == oldName) { - if (fInfo.BuildAction == projectEntry.GetDefaultBuildAction (oldName)) - fInfo.BuildAction = projectEntry.GetDefaultBuildAction (newName); - fInfo.Name = newName; - } - } + var fInfo = projectEntry.Files.GetFile (oldName); + if (fInfo == null) + continue; + + if (fInfo.BuildAction == projectEntry.GetDefaultBuildAction (oldName)) + fInfo.BuildAction = projectEntry.GetDefaultBuildAction (newName); + fInfo.Name = newName; } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/MenuButton.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/MenuButton.cs index b5b170fa15..e06a15cef7 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/MenuButton.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/MenuButton.cs @@ -39,7 +39,6 @@ namespace MonoDevelop.Components [System.ComponentModel.ToolboxItem(true)] public class MenuButton : Button { - MenuCreator creator; ContextMenuCreator contextMenuCreator; Label label; ImageView image; @@ -74,12 +73,6 @@ namespace MonoDevelop.Components } - [Obsolete ("Use ContextMenuRequested")] - public MenuCreator MenuCreator { - get { return creator; } - set { creator = value; } - } - public ContextMenuCreator ContextMenuRequested { get { return contextMenuCreator; } set { contextMenuCreator = value; } @@ -113,30 +106,7 @@ namespace MonoDevelop.Components this.GrabFocus (); // Offset the menu by the height of the rect menu.Show (this, 0, rect.Height, () => MenuClosed (oldRelief)); - return; } - - if (creator != null) { - Menu menu = creator (this); - - if (menu != null) { - var oldRelief = MenuOpened (); - - //clean up after the menu's done - menu.Hidden += delegate { - MenuClosed (oldRelief); - - //FIXME: for some reason the menu's children don't get activated if we destroy - //directly here, so use a timeout to delay it - GLib.Timeout.Add (100, delegate { - menu.Destroy (); - return false; - }); - }; - menu.Popup (null, null, PositionFunc, 0, Gtk.Global.CurrentEventTime); - } - } - } protected override void OnStateChanged(StateType previous_state) @@ -188,7 +158,6 @@ namespace MonoDevelop.Components protected override void OnDestroyed () { - creator = null; contextMenuCreator = null; base.OnDestroyed (); @@ -227,6 +196,5 @@ namespace MonoDevelop.Components } } - public delegate Menu MenuCreator (MenuButton button); public delegate ContextMenu ContextMenuCreator (MenuButton button); } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs index b3ebc6f454..ef32d1a4ad 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs @@ -40,6 +40,7 @@ using MonoDevelop.Projects; using System.Threading.Tasks; using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.Gui.Pads; +using System.ComponentModel; namespace MonoDevelop.Ide.CustomTools { @@ -47,13 +48,13 @@ namespace MonoDevelop.Ide.CustomTools { static readonly Dictionary<string,CustomToolExtensionNode> nodes = new Dictionary<string,CustomToolExtensionNode> (); - class TaskInfo { + sealed class TaskInfo { public Task Task; public CancellationTokenSource CancellationTokenSource; public SingleFileCustomToolResult Result; } - static readonly Dictionary<string,TaskInfo> runningTasks = new Dictionary<string, TaskInfo> (); + static readonly Dictionary<FilePath,TaskInfo> runningTasks = new Dictionary<FilePath, TaskInfo> (); static CustomToolService () { @@ -76,24 +77,18 @@ namespace MonoDevelop.Ide.CustomTools if (IdeApp.Workspace == null) return; - IdeApp.Workspace.FileChangedInProject += delegate (object sender, ProjectFileEventArgs args) { - foreach (ProjectFileEventInfo e in args) - Update (e.ProjectFile, e.Project, false); - }; - IdeApp.Workspace.FilePropertyChangedInProject += delegate (object sender, ProjectFileEventArgs args) { - foreach (ProjectFileEventInfo e in args) - Update (e.ProjectFile, e.Project, false); - }; - IdeApp.Workspace.FileRemovedFromProject += delegate (object sender, ProjectFileEventArgs args) { - foreach (ProjectFileEventInfo e in args) - Update (e.ProjectFile, e.Project, false); - }; - IdeApp.Workspace.FileAddedToProject += delegate (object sender, ProjectFileEventArgs args) { - foreach (ProjectFileEventInfo e in args) - Update (e.ProjectFile, e.Project, false); - }; + IdeApp.Workspace.FileChangedInProject += DoUpdate; + IdeApp.Workspace.FilePropertyChangedInProject += DoUpdate; + IdeApp.Workspace.FileRemovedFromProject += DoUpdate; + IdeApp.Workspace.FileAddedToProject += DoUpdate; //FIXME: handle the rename //MonoDevelop.Ide.Gui.IdeApp.Workspace.FileRenamedInProject + + static void DoUpdate (object sender, ProjectFileEventArgs args) + { + foreach (ProjectFileEventInfo e in args) + UpdateAsync (e.ProjectFile, e.Project, false).Ignore (); + } } internal static void Init () @@ -259,15 +254,14 @@ namespace MonoDevelop.Ide.CustomTools monitor.Dispose (); } - [Obsolete("Use the overload that specifies the project explicitly")] - public static void Update (ProjectFile file, bool force) - { - Update (file, file.Project, force); - } - static WeakReference<Pad> monitorPad; - public static async void Update (ProjectFile file, Project project, bool force) + [Obsolete("Use UpdateAsync")] + [EditorBrowsable (EditorBrowsableState.Advanced)] + public static void Update (ProjectFile file, Project project, bool force) + => UpdateAsync (file, project, force).Ignore (); + + public static async Task UpdateAsync (ProjectFile file, Project project, bool force) { SingleProjectFileCustomTool tool; ProjectFile genFile; @@ -426,7 +420,7 @@ namespace MonoDevelop.Ide.CustomTools IdeServices.TaskService.Errors.Add (new TaskListEntry (file.FilePath, err.ErrorText, err.Column, err.Line, err.IsWarning? TaskSeverity.Warning : TaskSeverity.Error, TaskPriority.Normal, file.Project.ParentSolution, file)); - }); + }).Ignore (); } if (broken) @@ -449,7 +443,7 @@ namespace MonoDevelop.Ide.CustomTools return true; // add file to project, update file properties, etc - Gtk.Application.Invoke (async (o, args) => { + Runtime.RunInMainThread (async () => { bool projectChanged = false; if (genFile == null) { genFile = file.Project.AddFile (result.GeneratedFilePath, result.OverrideBuildAction); @@ -471,7 +465,7 @@ namespace MonoDevelop.Ide.CustomTools if (projectChanged) await IdeApp.ProjectOperations.SaveAsync (file.Project); - }); + }).Ignore (); return true; } @@ -491,44 +485,42 @@ namespace MonoDevelop.Ide.CustomTools string ns = file.CustomToolNamespace; if (!string.IsNullOrEmpty (ns) || string.IsNullOrEmpty (outputFile)) return ns; - var dnfc = file.Project as IDotNetFileContainer; - if (dnfc != null) - return dnfc.GetDefaultNamespace (outputFile, useVisualStudioNamingPolicy); - return ns; + + return file.Project is IDotNetFileContainer dnfc + ? dnfc.GetDefaultNamespace (outputFile, useVisualStudioNamingPolicy) + : ns; } - public static Task WaitForRunningTools (ProgressMonitor monitor) + public static async Task WaitForRunningTools (ProgressMonitor monitor) { - TaskInfo[] operations; - lock (runningTasks) { - operations = runningTasks.Values.ToArray (); - } - - if (operations.Length == 0) - return Task.FromResult (true); + Task [] operations; + int i; - monitor.BeginTask ("Waiting for custom tools...", operations.Length); - - List<Task> tasks = new List<Task> (); + lock (runningTasks) { + if (runningTasks.Count == 0) + return; - foreach (var t in operations) { - tasks.Add (t.Task.ContinueWith (ta => { - if (!monitor.CancellationToken.IsCancellationRequested) - monitor.Step (1); - })); + operations = new Task [runningTasks.Count]; + i = 0; + foreach (var kvp in runningTasks) { + operations [i++] = kvp.Value.Task; + } } - var cancelTask = new TaskCompletionSource<bool> (); - var allDone = Task.WhenAll (tasks); + using (monitor.BeginTask ("Waiting for custom tools…", operations.Length)) { + for (i = 0; i < operations.Length; ++i) { + operations [i] = operations [i].ContinueWith (ta => { + if (!monitor.CancellationToken.IsCancellationRequested) + monitor.Step (); + }); + } - var cancelReg = monitor.CancellationToken.Register (() => { - cancelTask.SetResult (true); - }); + var cancelTask = new TaskCompletionSource<bool> (); - return Task.WhenAny (allDone, cancelTask.Task).ContinueWith (t => { - monitor.EndTask (); - cancelReg.Dispose (); - }); + using (monitor.CancellationToken.Register (tcs => ((TaskCompletionSource<bool>)tcs).SetResult (true), cancelTask)) { + await Task.WhenAny (Task.WhenAll (operations), cancelTask.Task); + } + } } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs index 55d5cb2cdb..2a5cdc909b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs @@ -381,14 +381,10 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad nav.MoveToParent (); } - internal static bool PathExistsInProject (Project project, string path) + internal static bool PathExistsInProject (Project project, FilePath path) { - string basePath = path; - foreach (ProjectFile f in project.Files) - if (f.Name.StartsWith (basePath) - && (f.Name.Length == basePath.Length || f.Name[basePath.Length] == Path.DirectorySeparatorChar)) - return true; - return false; + string basePath = path.ToRelative (project.BaseDirectory); + return project.Files.GetFilesInVirtualPath (basePath).Any (); } internal static bool ContainsDirectorySeparator (string name) diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs index 68f4f7b00c..4f8628cf0f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs @@ -390,8 +390,7 @@ namespace MonoDevelop.Ide public async Task SaveAsync (ProgressMonitor monitor) { monitor.BeginTask (GettextCatalog.GetString ("Saving Workspace..."), Items.Count); - List<WorkspaceItem> items = new List<WorkspaceItem> (Items); - foreach (WorkspaceItem it in items) { + foreach (WorkspaceItem it in Items.ToList ()) { await it.SaveAsync (monitor); monitor.Step (1); } |