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/src
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2013-08-22 12:45:11 +0400
committerMike Krüger <mkrueger@xamarin.com>2013-08-22 12:45:11 +0400
commitf38ae79fe64ce3410218cc8afccc5e23e2a01144 (patch)
treeaa6ad024a5381c148a7df5e7d59381e413d879d4 /main/src
parent943e8d8536357756e5780300e210063729481cfe (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.cs9
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs46
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