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:
authorVsevolod Kukol <sevoku@microsoft.com>2017-03-27 19:40:09 +0300
committerVsevolod Kukol <sevoku@microsoft.com>2017-03-27 19:40:09 +0300
commitbcf0f49ff6994d1dc2d06d53a7518ae1ed35c571 (patch)
tree160c92b456601f6a46d3660eb2bdbb2c4290f93c /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem
parent0be22f7c0a199f9ffb185386eb85b620d0f37f58 (diff)
parent252dc8bac40ca46bf020351e331aa477763a020d (diff)
Merge remote-tracking branch 'origin/master' into native-popups
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopSourceTextContainer.cs29
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs22
2 files changed, 32 insertions, 19 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopSourceTextContainer.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopSourceTextContainer.cs
index e61f30a19e..2c877d5f69 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopSourceTextContainer.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopSourceTextContainer.cs
@@ -34,6 +34,7 @@ using System.Reflection;
using MonoDevelop.Ide.Editor;
using MonoDevelop.Core.Text;
using Microsoft.CodeAnalysis.Text;
+using System.Threading.Tasks;
namespace MonoDevelop.Ide.TypeSystem
{
@@ -58,21 +59,27 @@ namespace MonoDevelop.Ide.TypeSystem
this.document = document;
this.document.TextChanging += HandleTextReplacing;
}
-
+ object replaceLock = new object ();
void HandleTextReplacing (object sender, Core.Text.TextChangeEventArgs e)
{
var handler = TextChanged;
if (handler != null) {
- var oldText = CurrentText;
- var insertedText = e.InsertedText.Text;
- if (e.RemovalLength == 0 && string.IsNullOrEmpty (insertedText))
- return;
- var newText = oldText.Replace (e.Offset, e.RemovalLength, insertedText);
- currentText = newText;
- try {
- handler (this, new Microsoft.CodeAnalysis.Text.TextChangeEventArgs (oldText, newText, new TextChangeRange (TextSpan.FromBounds (e.Offset, e.Offset + e.RemovalLength), e.InsertionLength)));
- } catch (Exception ex) {
- LoggingService.LogError ("Error while text replacing", ex);
+ lock (replaceLock) {
+ var oldText = CurrentText;
+ var changes = new List<Microsoft.CodeAnalysis.Text.TextChange> ();
+ var changeRanges = new List<TextChangeRange> ();
+ foreach (var c in e.TextChanges) {
+ var span = new TextSpan (c.Offset, c.RemovalLength);
+ changes.Add (new Microsoft.CodeAnalysis.Text.TextChange (span, c.InsertedText.Text));
+ changeRanges.Add (new TextChangeRange (span, c.InsertionLength));
+ }
+ var newText = oldText.WithChanges (changes);
+ currentText = newText;
+ try {
+ handler (this, new Microsoft.CodeAnalysis.Text.TextChangeEventArgs (oldText, newText, changeRanges));
+ } catch (Exception ex) {
+ LoggingService.LogError ("Error while text replacing", ex);
+ }
}
}
}
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 e069b451b8..5a822bedfe 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
@@ -110,7 +110,8 @@ namespace MonoDevelop.Ide.TypeSystem
if (assemblyNode == null)
continue;
try {
- var assembly = Assembly.LoadFrom (assemblyNode.FileName);
+ var assemblyFilePath = assemblyNode.Addin.GetFilePath(assemblyNode.FileName);
+ var assembly = Assembly.LoadFrom(assemblyFilePath);
assemblies.Add (assembly);
} catch (Exception e) {
LoggingService.LogError ("Workspace can't load assembly " + assemblyNode.FileName + " to host mef services.", e);
@@ -950,8 +951,10 @@ namespace MonoDevelop.Ide.TypeSystem
// Just to get sure if no insertion points -> go back to the formatted version.
var textChanges = editor.Version.GetChangesTo (formattedVersion).ToList ();
using (var undo2 = editor.OpenUndoGroup ()) {
- foreach (var v in textChanges) {
- editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
+ foreach (var textChange in textChanges) {
+ foreach (var v in textChange.TextChanges.Reverse ()) {
+ editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
+ }
}
}
return;
@@ -965,8 +968,10 @@ namespace MonoDevelop.Ide.TypeSystem
if (!isMethod) {
// atm only for generate field/property : remove all new lines generated & just insert the plain node.
// for methods it's not so easy because of "extract code" changes.
- foreach (var v in editor.Version.GetChangesTo (oldVersion).ToList ()) {
- editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
+ foreach (var textChange in editor.Version.GetChangesTo (oldVersion).ToList ()) {
+ foreach (var v in textChange.TextChanges.Reverse ()) {
+ editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
+ }
}
}
@@ -998,8 +1003,9 @@ namespace MonoDevelop.Ide.TypeSystem
if (!args.Success) {
var textChanges = editor.Version.GetChangesTo (oldVersion).ToList ();
using (var undo2 = editor.OpenUndoGroup ()) {
- foreach (var v in textChanges) {
- editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
+ foreach (var textChange in textChanges) {
+ foreach (var v in textChange.TextChanges.Reverse ())
+ editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
}
}
}
@@ -1057,7 +1063,7 @@ namespace MonoDevelop.Ide.TypeSystem
}
}
- static int ApplyChanges (Projection projection, ITextDocument data, List<TextChange> changes)
+ static int ApplyChanges (Projection projection, ITextDocument data, List<Microsoft.CodeAnalysis.Text.TextChange> changes)
{
int delta = 0;
foreach (var change in changes) {