Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@xamarin.com>2019-07-16 16:54:11 +0300
committerGitHub <noreply@github.com>2019-07-16 16:54:11 +0300
commitf8ffeba24afbb19e2ba2bce65247472a5963e559 (patch)
tree6459ead32cd0355e2cc6cda3331c22da628bf384 /main
parentd2a3faf68c0dfc5cd00f0a7362f4ba1775f15529 (diff)
parentfade89670f0703d508dbe7b61c8967f1560c52e4 (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')
-rw-r--r--main/src/addins/TextTemplating/MonoDevelop.TextTemplating/GenerateCommandHandler.cs12
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/LoggingService.cs6
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs14
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs25
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/MenuButton.cs32
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CustomTools/CustomToolService.cs106
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/RootWorkspace.cs3
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);
}