diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2013-08-22 12:45:11 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2013-08-22 12:45:11 +0400 |
commit | f38ae79fe64ce3410218cc8afccc5e23e2a01144 (patch) | |
tree | aa6ad024a5381c148a7df5e7d59381e413d879d4 /main/src | |
parent | 943e8d8536357756e5780300e210063729481cfe (diff) |
Improved 'Bug 14158 - Error while looking up framework types '.
Diffstat (limited to 'main/src')
-rw-r--r-- | main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ResolveCommandHandler.cs | 9 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs | 46 |
2 files changed, 45 insertions, 10 deletions
diff --git a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ResolveCommandHandler.cs b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ResolveCommandHandler.cs index daf9f3a843..82f7404953 100644 --- a/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ResolveCommandHandler.cs +++ b/main/src/addins/MonoDevelop.Refactoring/MonoDevelop.Refactoring/ResolveCommandHandler.cs @@ -329,7 +329,8 @@ namespace MonoDevelop.Refactoring compilations.Add (Tuple.Create (TypeSystemService.GetCompilation (systemAssembly, doc.Compilation), new MonoDevelop.Projects.ProjectReference (systemAssembly))); } } catch (Exception e) { - LoggingService.LogError ("Error while looking up framework extension methods.", e); + if (!TypeSystemService.RecreateFrameworkLookup (netProject)) + LoggingService.LogError ("Error while looking up framework extension methods.", e); } } bool foundIdentifier = false; @@ -427,7 +428,8 @@ namespace MonoDevelop.Refactoring lookups.Add (Tuple.Create (r, systemAssembly)); } } catch (Exception e) { - LoggingService.LogError ("Error while looking up framework types.", e); + if (!TypeSystemService.RecreateFrameworkLookup (netProject)) + LoggingService.LogError ("Error while looking up framework types.", e); } foreach(var kv in lookups) yield return new PossibleNamespace (kv.Item1.Namespace, true, new MonoDevelop.Projects.ProjectReference (kv.Item2)); @@ -447,7 +449,8 @@ namespace MonoDevelop.Refactoring lookups.Add (Tuple.Create (r, systemAssembly)); } } catch (Exception e) { - LoggingService.LogError ("Error while looking up framework types.", e); + if (!TypeSystemService.RecreateFrameworkLookup (netProject)) + LoggingService.LogError ("Error while looking up framework types.", e); } foreach(var kv in lookups) yield return new PossibleNamespace (kv.Item1.Namespace, true, new MonoDevelop.Projects.ProjectReference (kv.Item2)); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs index be87bba685..9a4a5c542f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs @@ -2150,15 +2150,29 @@ namespace MonoDevelop.Ide.TypeSystem return assemblies.Values; } - readonly static Dictionary<string, Task<FrameworkLookup>> frameworkLookup = new Dictionary<string, Task<FrameworkLookup>> (); + class FrameworkTask + { + public int RetryCount { get; set; } + public Task<FrameworkLookup> Task { get; set; } + + } + + readonly static Dictionary<string, FrameworkTask> frameworkLookup = new Dictionary<string, FrameworkTask> (); static void StartFrameworkLookup (DotNetProject netProject) { + if (netProject == null) + throw new ArgumentNullException ("netProject"); lock (frameworkLookup) { - Task<FrameworkLookup> result; - if (frameworkLookup.TryGetValue (netProject.TargetFramework.Name, out result)) + FrameworkTask result; + if (netProject.TargetFramework == null) return; - frameworkLookup[netProject.TargetFramework.Name] = Task.Factory.StartNew (delegate { + var frameworkName = netProject.TargetFramework.Name; + if (!frameworkLookup.TryGetValue (frameworkName, out result)) + frameworkLookup [frameworkName] = result = new FrameworkTask (); + if (result.Task != null) + return; + result.Task = Task.Factory.StartNew (delegate { return GetFrameworkLookup (netProject); }); } @@ -2167,13 +2181,13 @@ namespace MonoDevelop.Ide.TypeSystem public static bool TryGetFrameworkLookup (DotNetProject project, out FrameworkLookup lookup) { lock (frameworkLookup) { - Task<FrameworkLookup> result; + FrameworkTask result; if (frameworkLookup.TryGetValue (project.TargetFramework.Name, out result)) { - if (!result.IsCompleted) { + if (!result.Task.IsCompleted) { lookup = null; return false; } - lookup = result.Result; + lookup = result.Task.Result; return true; } } @@ -2181,6 +2195,23 @@ namespace MonoDevelop.Ide.TypeSystem return false; } + public static bool RecreateFrameworkLookup (DotNetProject netProject) + { + lock (frameworkLookup) { + FrameworkTask result; + if (!frameworkLookup.TryGetValue (netProject.TargetFramework.Name, out result)) + return false; + if (result.RetryCount > 5) { + LoggingService.LogError ("Can't create framework lookup for:" + netProject.TargetFramework.Name); + return false; + } + result.RetryCount++; + LoggingService.LogInfo ("Trying to recreate framework lookup for {0}, try {1}.", netProject.TargetFramework.Name, result.RetryCount); + StartFrameworkLookup (netProject); + return true; + } + } + static FrameworkLookup GetFrameworkLookup (DotNetProject netProject) { FrameworkLookup result; @@ -2597,6 +2628,7 @@ namespace MonoDevelop.Ide.TypeSystem } } #endregion + } internal sealed class AssemblyLoadedEventArgs : EventArgs |