diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2017-03-27 19:40:09 +0300 |
---|---|---|
committer | Vsevolod Kukol <sevoku@microsoft.com> | 2017-03-27 19:40:09 +0300 |
commit | bcf0f49ff6994d1dc2d06d53a7518ae1ed35c571 (patch) | |
tree | 160c92b456601f6a46d3660eb2bdbb2c4290f93c /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem | |
parent | 0be22f7c0a199f9ffb185386eb85b620d0f37f58 (diff) | |
parent | 252dc8bac40ca46bf020351e331aa477763a020d (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.cs | 29 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs | 22 |
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) {
|