Skip to content

Commit a91098d

Browse files
committed
consistency fixes; removed marker service interface
1 parent 7ffa623 commit a91098d

18 files changed

+82
-55
lines changed

Rubberduck.Core/AutoComplete/AutoCompleteBase.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,23 @@ protected AutoCompleteBase(string inputToken, string outputToken)
1414
public string InputToken { get; }
1515
public string OutputToken { get; }
1616

17+
private bool _executing;
18+
1719
public virtual bool Execute(AutoCompleteEventArgs e)
1820
{
1921
var selection = e.CodePane.Selection;
20-
if (selection.StartColumn < 2) { return false; }
22+
if (_executing || selection.StartColumn < 2) { return false; }
2123

2224
if (!e.IsCommitted && e.OldCode.Substring(selection.StartColumn - 2, 1) == InputToken)
2325
{
2426
using (var module = e.CodePane.CodeModule)
2527
{
28+
_executing = true;
2629
var newCode = e.OldCode.Insert(selection.StartColumn - 1, OutputToken);
2730
module.ReplaceLine(e.CodePane.Selection.StartLine, newCode);
2831
e.CodePane.Selection = selection;
2932
e.NewCode = newCode;
33+
_executing = false;
3034
return true;
3135
}
3236
}

Rubberduck.Core/AutoComplete/AutoCompleteBlockBase.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Rubberduck.SmartIndenter;
2+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
23
using Rubberduck.VBEditor.Events;
34
using System.Linq;
45
using System.Text.RegularExpressions;
@@ -7,37 +8,61 @@ namespace Rubberduck.AutoComplete
78
{
89
public abstract class AutoCompleteBlockBase : AutoCompleteBase
910
{
11+
/// <param name="api">Used for ensuring compilable resulting code.</param>
1012
/// <param name="indenterSettings">Used for auto-indenting blocks as per indenter settings.</param>
1113
/// <param name="inputToken">The token that starts the block, i.e. what to detect.</param>
1214
/// <param name="outputToken">The token that closes the block, i.e. what to insert.</param>
1315
/// <param name="committedOnly">Indicates whether line of code was committed, i.e. selection is on the line underneath the code string.</param>
14-
protected AutoCompleteBlockBase(IIndenterSettings indenterSettings, string inputToken, string outputToken, bool committedOnly = true)
16+
protected AutoCompleteBlockBase(IVBETypeLibsAPI api, IIndenterSettings indenterSettings, string inputToken, string outputToken, bool committedOnly = true)
1517
:base(inputToken, outputToken)
1618
{
19+
_api = api;
1720
_indenterSettings = indenterSettings;
1821
_committedOnly = committedOnly;
1922
}
2023

2124
protected virtual bool FindInputTokenAtBeginningOfCurrentLine => false;
2225

26+
private readonly IVBETypeLibsAPI _api;
2327
private readonly IIndenterSettings _indenterSettings;
2428
private readonly bool _committedOnly;
2529

30+
protected virtual bool ExecuteOnCommittedInputOnly => true;
31+
protected virtual bool MatchInputTokenAtEndOfLineOnly => false;
32+
33+
private string _pattern => MatchInputTokenAtEndOfLineOnly
34+
? $"\\b{InputToken}\\r\\n$"
35+
: $"\\b{InputToken}\\b";
36+
37+
private bool _executing;
2638
public override bool Execute(AutoCompleteEventArgs e)
2739
{
40+
if (_executing)
41+
{
42+
return false;
43+
}
44+
2845
var selection = e.CodePane.Selection;
2946
var stdIndent = _indenterSettings.IndentSpaces;
3047

31-
if ((!_committedOnly || e.IsCommitted) && Regex.IsMatch(e.OldCode.Trim(), $"\\b{InputToken}\\b"))
48+
if ((!_committedOnly || e.IsCommitted) && Regex.IsMatch(e.OldCode.Trim(), _pattern))
3249
{
3350
var indent = e.OldCode.TakeWhile(c => char.IsWhiteSpace(c)).Count();
3451
using (var module = e.CodePane.CodeModule)
3552
{
53+
_executing = true;
3654
var code = OutputToken.PadLeft(OutputToken.Length + indent, ' ');
55+
if (module.GetLines(selection.NextLine) == code)
56+
{
57+
return false;
58+
}
59+
3760
module.InsertLines(selection.StartLine + 1, code);
61+
3862
module.ReplaceLine(selection.StartLine, new string(' ', indent + stdIndent));
3963
e.CodePane.Selection = new VBEditor.Selection(selection.StartLine, indent + stdIndent + 1);
4064
e.NewCode = e.OldCode;
65+
_executing = false;
4166
return true;
4267
}
4368
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteDoBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteDoBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.Do}", Tokens.Loop) { }
9+
public AutoCompleteDoBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.Do}", Tokens.Loop) { }
1011
}
1112
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteEnumBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteEnumBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.Enum}", $"{Tokens.End} {Tokens.Enum}") { }
9+
public AutoCompleteEnumBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.Enum}", $"{Tokens.End} {Tokens.Enum}") { }
1011
}
1112
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteForBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteForBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.For}", Tokens.Next) { }
9+
public AutoCompleteForBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.For}", Tokens.Next) { }
1011
}
1112
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteIfBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteIfBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.Then}", $"{Tokens.End} {Tokens.If}") { }
9+
public AutoCompleteIfBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.Then}", $"{Tokens.End} {Tokens.If}") { }
11+
12+
protected override bool MatchInputTokenAtEndOfLineOnly => true;
1013
}
1114
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteOnErrorResumeNextBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteOnErrorResumeNextBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.On} {Tokens.Error} {Tokens.Resume} {Tokens.Next}", $"{Tokens.On} {Tokens.Error} {Tokens.GoTo} 0", false) { }
9+
public AutoCompleteOnErrorResumeNextBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.On} {Tokens.Error} {Tokens.Resume} {Tokens.Next}", $"{Tokens.On} {Tokens.Error} {Tokens.GoTo} 0", false) { }
1011
}
1112
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteSelectBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteSelectBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.Select} {Tokens.Case}", $"{Tokens.End} {Tokens.Select}") { }
9+
public AutoCompleteSelectBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.Select} {Tokens.Case}", $"{Tokens.End} {Tokens.Select}") { }
1011
}
1112
}

Rubberduck.Core/AutoComplete/AutoCompleteService.cs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,40 @@
66

77
namespace Rubberduck.AutoComplete
88
{
9-
public class AutoCompleteService : IAutoCompleteService, IDisposable
9+
public class AutoCompleteService : IDisposable
1010
{
11-
private readonly IReadOnlyList<IAutoComplete> _autoCompletions;
11+
private readonly IReadOnlyList<IAutoComplete> _autoCompletes;
12+
private QualifiedSelection? _lastSelection;
13+
private string _lastCode;
14+
private string _contentHash;
1215

1316
public AutoCompleteService(IReadOnlyList<IAutoComplete> autoCompletes)
1417
{
15-
_autoCompletions = autoCompletes;
18+
_autoCompletes = autoCompletes;
1619
VBENativeServices.CaretHidden += VBENativeServices_CaretHidden;
1720
}
1821

19-
public event EventHandler AutoCompleteTriggered;
20-
21-
private QualifiedSelection? _lastSelection;
22-
private string _lastCode;
23-
string _contentHash;
24-
2522
private void VBENativeServices_CaretHidden(object sender, AutoCompleteEventArgs e)
2623
{
27-
AutoCompleteTriggered?.Invoke(this, e);
28-
var selection = e.CodePane.Selection;
29-
var qualifiedSelection = e.CodePane.GetQualifiedSelection();
30-
31-
if (!selection.IsSingleCharacter || e.OldCode.Equals(_lastCode) || qualifiedSelection.Value.Equals(_lastSelection) || string.IsNullOrWhiteSpace(e.OldCode) || e.ContentHash == _contentHash)
24+
if (e.ContentHash == _contentHash)
3225
{
3326
return;
3427
}
3528

36-
foreach (var autoCompletion in _autoCompletions.Where(auto => auto.IsEnabled))
29+
var qualifiedSelection = e.CodePane.GetQualifiedSelection();
30+
var selection = qualifiedSelection.Value.Selection;
31+
32+
foreach (var autoComplete in _autoCompletes.Where(auto => auto.IsEnabled))
3733
{
38-
if (autoCompletion.Execute(e))
34+
if (autoComplete.Execute(e))
3935
{
4036
_lastSelection = qualifiedSelection;
4137
_lastCode = e.NewCode;
4238
using (var module = e.CodePane.CodeModule)
4339
{
4440
_contentHash = module.ContentHash();
4541
}
42+
4643
break;
4744
}
4845
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.SmartIndenter;
3+
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
34

45
namespace Rubberduck.AutoComplete
56
{
67
public class AutoCompleteTypeBlock : AutoCompleteBlockBase
78
{
8-
public AutoCompleteTypeBlock(IIndenterSettings indenterSettings)
9-
: base(indenterSettings, $"{Tokens.Type}", $"{Tokens.End} {Tokens.Type}") { }
9+
public AutoCompleteTypeBlock(IVBETypeLibsAPI api, IIndenterSettings indenterSettings)
10+
: base(api, indenterSettings, $"{Tokens.Type}", $"{Tokens.End} {Tokens.Type}") { }
1011
}
1112
}

0 commit comments

Comments
 (0)