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:
authorMike Krüger <mikkrg@microsoft.com>2018-04-04 09:56:02 +0300
committerMike Krüger <mikkrg@microsoft.com>2018-04-04 09:56:02 +0300
commiteaefee679092f3392694d542f305bb06f77d09e7 (patch)
tree7c47d469b5335ea94c27eb5bee94475d55048070 /main/src/core
parent3c5ebce624fe23effc145219a2021a4ec8b1a5af (diff)
parentd392a2f269c74e77f478d6e26a23fe2d90b241a4 (diff)
Merge branch 'master' into master-fix591384
Diffstat (limited to 'main/src/core')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs75
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml1
2 files changed, 72 insertions, 4 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
index ff4e9112c5..8d0e626dd4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
@@ -2326,6 +2326,12 @@ namespace MonoDevelop.Projects
throw new InvalidOperationException (it.GetType ().Name + " already belongs to a project");
it.Project = this;
}
+
+ if (monitorItemsModifiedDuringReevaluation) {
+ if (itemsAddedDuringReevaluation == null)
+ itemsAddedDuringReevaluation = ImmutableList.CreateBuilder<ProjectItem> ();
+ itemsAddedDuringReevaluation.AddRange (objs);
+ }
NotifyModified ("Items");
if (ProjectItemAdded != null)
@@ -2338,6 +2344,12 @@ namespace MonoDevelop.Projects
{
foreach (var it in objs)
it.Project = null;
+
+ if (monitorItemsModifiedDuringReevaluation) {
+ if (itemsRemovedDuringReevaluation == null)
+ itemsRemovedDuringReevaluation = ImmutableList.CreateBuilder<ProjectItem> ();
+ itemsRemovedDuringReevaluation.AddRange (objs);
+ }
NotifyModified ("Items");
if (ProjectItemRemoved != null)
@@ -2346,6 +2358,10 @@ namespace MonoDevelop.Projects
NotifyFileRemovedFromProject (objs.OfType<ProjectFile> ());
}
+ bool monitorItemsModifiedDuringReevaluation;
+ internal ImmutableList<ProjectItem>.Builder itemsAddedDuringReevaluation;
+ internal ImmutableList<ProjectItem>.Builder itemsRemovedDuringReevaluation;
+
internal void NotifyFileChangedInProject (ProjectFile file)
{
OnFileChangedInProject (new ProjectFileEventArgs (this, file));
@@ -2955,9 +2971,16 @@ namespace MonoDevelop.Projects
}
}
}
- if (IsReevaluating)
+ if (IsReevaluating) {
+ if (itemsAddedDuringReevaluation != null) {
+ // Handle new items added whilst re-evaluating the MSBuildProject.
+ foreach (var item in itemsAddedDuringReevaluation) {
+ unusedItems.Remove (item);
+ localItems.Add (item);
+ }
+ }
Items.SetItems (localItems, newItems, unusedItems);
- else
+ } else
Items.AddRange (localItems);
}
@@ -2994,6 +3017,27 @@ namespace MonoDevelop.Projects
return (eit, false);
}
}
+
+ if (itemsRemovedDuringReevaluation != null) {
+ // Handle items removed whilst re-evaluating the MSBuildProject.
+ ProjectItem matchedRemovedItem = null;
+ foreach (var removedItem in itemsRemovedDuringReevaluation) {
+ if (ItemsAreEqual (buildItem, removedItem.BackingEvalItem) || CheckProjectReferenceItemsAreEqual (buildItem, removedItem)) {
+ matchedRemovedItem = removedItem;
+ break;
+ }
+ }
+
+ if (matchedRemovedItem != null) {
+ itemsRemovedDuringReevaluation.Remove (matchedRemovedItem);
+ if (usedMSBuildItems != null) {
+ foreach (var sourceItem in buildItem.SourceItems) {
+ usedMSBuildItems.Add (sourceItem);
+ }
+ }
+ return (null, false);
+ }
+ }
}
var item = CreateProjectItem (buildItem);
@@ -3728,13 +3772,25 @@ namespace MonoDevelop.Projects
{
// Compare only metadata, since item name and include can't change
+ MSBuildEvaluationContext context = null;
var n = 0;
foreach (var p in item.Metadata.GetProperties ()) {
var p2 = evalItem.Metadata.GetProperty (p.Name);
if (p2 == null)
return false;
- if (!p.ValueType.Equals (p.Value, p2.UnevaluatedValue))
- return false;
+ if (!p.ValueType.Equals (p.Value, p2.UnevaluatedValue)) {
+ if (p2.UnevaluatedValue != null && p2.UnevaluatedValue.Contains ('%')) {
+ // Check evaluated value is a match.
+ if (context == null) {
+ context = new MSBuildEvaluationContext ();
+ context.InitEvaluation (MSBuildProject);
+ }
+ string value = context.Evaluate (p.UnevaluatedValue);
+ if (!p.ValueType.Equals (p.Value, value))
+ return false;
+ } else
+ return false;
+ }
n++;
}
if (evalItem.Metadata.GetProperties ().Count () != n)
@@ -4012,6 +4068,12 @@ namespace MonoDevelop.Projects
{
return BindTask (ct => Runtime.RunInMainThread (async () => {
using (await writeProjectLock.EnterAsync ()) {
+
+ if (modifiedInMemory) {
+ await Task.Run (() => WriteProject (monitor));
+ modifiedInMemory = false;
+ }
+
var oldCapabilities = new HashSet<string> (projectCapabilities);
bool oldSupportsExecute = SupportsExecute ();
@@ -4019,7 +4081,9 @@ namespace MonoDevelop.Projects
IsReevaluating = true;
// Reevaluate the msbuild project
+ monitorItemsModifiedDuringReevaluation = true;
await sourceProject.EvaluateAsync ();
+ monitorItemsModifiedDuringReevaluation = false;
// Loads minimal data required to instantiate extensions and prepare for project loading
InitBeforeProjectExtensionLoad ();
@@ -4031,6 +4095,9 @@ namespace MonoDevelop.Projects
} finally {
IsReevaluating = false;
+ monitorItemsModifiedDuringReevaluation = false;
+ itemsAddedDuringReevaluation = null;
+ itemsRemovedDuringReevaluation = null;
}
if (resetCachedCompileItems)
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml
index 3846ff564c..e881821723 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml
@@ -407,6 +407,7 @@
<Extension path="/MonoDevelop/Ide/Composition">
<Assembly file="Microsoft.CodeAnalysis.CSharp.EditorFeatures.dll"/>
<Assembly file="Microsoft.CodeAnalysis.EditorFeatures.dll"/>
+ <Assembly file="Microsoft.CodeAnalysis.EditorFeatures.Text.dll"/>
<Assembly file="Microsoft.CodeAnalysis.Features.dll" />
<Assembly file="Microsoft.CodeAnalysis.Workspaces.dll" />
<Assembly file="Microsoft.CodeAnalysis.Workspaces.Desktop.dll" />