diff options
author | Lluis Sanchez <llsan@microsoft.com> | 2018-04-16 23:01:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-16 23:01:53 +0300 |
commit | 863bb04df92a85cd91df09b91324ff6ad4a64b91 (patch) | |
tree | 6179a9cfd55c20d9c27b51a7baac7834d54a5540 /main/src/core | |
parent | b0d8b25f0185d8a6823eb0746d0bd847f93089e4 (diff) | |
parent | cb86fde105aecedb879baba82665fcaff713c9e5 (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.cs | 64 |
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);
}
|