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
diff options
context:
space:
mode:
authorLluis Sanchez <llsan@microsoft.com>2018-04-16 23:01:53 +0300
committerGitHub <noreply@github.com>2018-04-16 23:01:53 +0300
commit863bb04df92a85cd91df09b91324ff6ad4a64b91 (patch)
tree6179a9cfd55c20d9c27b51a7baac7834d54a5540 /main/src/core
parentb0d8b25f0185d8a6823eb0746d0bd847f93089e4 (diff)
parentcb86fde105aecedb879baba82665fcaff713c9e5 (diff)
Merge pull request #4576 from mono/backport-pr-4481-to-master
[master] Fix 594883: Goto Declaration is not available when creating an Android project
Diffstat (limited to 'main/src/core')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs64
1 files changed, 39 insertions, 25 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
index 1378da5b17..6397d0370f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
@@ -65,6 +65,7 @@ namespace MonoDevelop.Ide.TypeSystem
readonly MonoDevelop.Projects.Solution monoDevelopSolution;
object addLock = new object();
bool added;
+ object updatingProjectDataLock = new object ();
public MonoDevelop.Projects.Solution MonoDevelopSolution {
get {
@@ -470,10 +471,6 @@ namespace MonoDevelop.Ide.TypeSystem
var projectId = GetOrCreateProjectId (p);
- //when reloading e.g. after a save, preserve document IDs
- var oldProjectData = GetProjectData (projectId);
- var projectData = CreateProjectData (projectId);
-
var references = await CreateMetadataReferences (p, projectId, token).ConfigureAwait (false);
if (token.IsCancellationRequested)
return null;
@@ -485,29 +482,39 @@ namespace MonoDevelop.Ide.TypeSystem
if (fileName.IsNullOrEmpty)
fileName = new FilePath (p.Name + ".dll");
+ var projectReferences = await CreateProjectReferences (p, token);
if (token.IsCancellationRequested)
return null;
+
var sourceFiles = await p.GetSourceFilesAsync (config != null ? config.Selector : null).ConfigureAwait (false);
- var documents = CreateDocuments (projectData, p, token, sourceFiles, oldProjectData);
- if (documents == null)
+ if (token.IsCancellationRequested)
return null;
- var info = ProjectInfo.Create (
- projectId,
- VersionStamp.Create (),
- p.Name,
- fileName.FileNameWithoutExtension,
- LanguageNames.CSharp,
- p.FileName,
- fileName,
- cp != null ? cp.CreateCompilationOptions () : null,
- cp != null ? cp.CreateParseOptions (config) : null,
- documents.Item1,
- await CreateProjectReferences (p, token),
- references,
- additionalDocuments: documents.Item2
- );
- projectData.Info = info;
- return info;
+
+ lock (updatingProjectDataLock) {
+ //when reloading e.g. after a save, preserve document IDs
+ var oldProjectData = GetProjectData (projectId);
+ var projectData = CreateProjectData (projectId);
+ var documents = CreateDocuments (projectData, p, token, sourceFiles, oldProjectData);
+ if (documents == null)
+ return null;
+ var info = ProjectInfo.Create (
+ projectId,
+ VersionStamp.Create (),
+ p.Name,
+ fileName.FileNameWithoutExtension,
+ LanguageNames.CSharp,
+ p.FileName,
+ fileName,
+ cp != null ? cp.CreateCompilationOptions () : null,
+ cp != null ? cp.CreateParseOptions (config) : null,
+ documents.Item1,
+ projectReferences,
+ references,
+ additionalDocuments: documents.Item2
+ );
+ projectData.Info = info;
+ return info;
+ }
}
internal void UpdateProjectionEntry (MonoDevelop.Projects.ProjectFile projectFile, IReadOnlyList<Projection> projections)
@@ -1496,6 +1503,7 @@ namespace MonoDevelop.Ide.TypeSystem
List<MonoDevelop.Projects.DotNetProject> modifiedProjects = new List<MonoDevelop.Projects.DotNetProject> ();
object projectModifyLock = new object ();
bool freezeProjectModify;
+ Dictionary<MonoDevelop.Projects.DotNetProject, CancellationTokenSource> projectModifiedCts = new Dictionary<MonoDevelop.Projects.DotNetProject, CancellationTokenSource> ();
void OnProjectModified (object sender, MonoDevelop.Projects.SolutionItemModifiedEventArgs args)
{
lock (projectModifyLock) {
@@ -1508,14 +1516,20 @@ namespace MonoDevelop.Ide.TypeSystem
if (project == null)
return;
var projectId = GetProjectId (project);
+ if (projectModifiedCts.TryGetValue (project, out var cts))
+ cts.Cancel ();
+ cts = new CancellationTokenSource ();
+ projectModifiedCts [project] = cts;
if (CurrentSolution.ContainsProject (projectId)) {
- var projectInfo = LoadProject (project, CancellationToken.None, null).ContinueWith (t => {
+ var projectInfo = LoadProject (project, cts.Token, null).ContinueWith (t => {
+ if (t.IsCanceled)
+ return;
if (t.IsFaulted) {
LoggingService.LogError ("Failed to reload project", t.Exception);
return;
}
OnProjectReloaded (t.Result);
- });
+ }, cts.Token);
} else {
modifiedProjects.Add (project);
}