Skip to content

Commit

Permalink
added autocompletion for #If...#EndIf blocks
Browse files Browse the repository at this point in the history
  • Loading branch information
retailcoder committed Jun 4, 2018
1 parent 07b15a5 commit c5ac600
Show file tree
Hide file tree
Showing 12 changed files with 54 additions and 8 deletions.
17 changes: 9 additions & 8 deletions Rubberduck.Core/AutoComplete/AutoCompleteBlockBase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Rubberduck.Parsing.Grammar;
using Rubberduck.Parsing.VBA;
using Rubberduck.SmartIndenter;
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
using Rubberduck.VBEditor.Events;
using System.Linq;
using System.Text.RegularExpressions;
Expand All @@ -19,6 +18,7 @@ protected AutoCompleteBlockBase(IIndenterSettings indenterSettings, string input
}

protected virtual bool FindInputTokenAtBeginningOfCurrentLine => false;
protected virtual bool SkipPreCompilerDirective => true;

protected readonly IIndenterSettings IndenterSettings;

Expand All @@ -30,22 +30,23 @@ protected AutoCompleteBlockBase(IIndenterSettings indenterSettings, string input
private bool _executing;
public override bool Execute(AutoCompleteEventArgs e)
{
if (_executing)
if (_executing || (SkipPreCompilerDirective && e.OldCode.Trim().StartsWith("#")))
{
return false;
}

var selection = e.CodePane.Selection;
var stdIndent = IndentBody ? IndenterSettings.IndentSpaces : 0;

var pattern = SkipPreCompilerDirective
? $"\\b{InputToken}\\b"
: $"{InputToken}\\b"; // word boundary marker (\b) would prevent matching the # character

var isMatch = MatchInputTokenAtEndOfLineOnly
? e.OldCode.EndsWith(InputToken)
: Regex.IsMatch(e.OldCode.Trim(), $"\\b{InputToken}\\b");

// todo: handle line-continuating and non-start-of-line comments
var isComment = e.OldCode.Trim().StartsWith("'") || e.OldCode.Trim().StartsWith(Tokens.Rem);
: Regex.IsMatch(e.OldCode.Trim(), pattern);

if (!isComment && isMatch && (!ExecuteOnCommittedInputOnly || e.IsCommitted))
if (!e.OldCode.HasComment(out _) && isMatch && (!ExecuteOnCommittedInputOnly || e.IsCommitted))
{
var indent = e.OldCode.TakeWhile(c => char.IsWhiteSpace(c)).Count();
using (var module = e.CodePane.CodeModule)
Expand Down
13 changes: 13 additions & 0 deletions Rubberduck.Core/AutoComplete/AutoCompletePrecompilerIfBlock.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Rubberduck.Parsing.Grammar;
using Rubberduck.SmartIndenter;

namespace Rubberduck.AutoComplete
{
public class AutoCompletePrecompilerIfBlock : AutoCompleteBlockBase
{
public AutoCompletePrecompilerIfBlock(IIndenterSettings indenterSettings)
: base(indenterSettings, $"#{Tokens.If}", $"#{Tokens.End} {Tokens.If}") { }

protected override bool SkipPreCompilerDirective => false;
}
}
1 change: 1 addition & 0 deletions Rubberduck.Core/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Rubberduck.Core/Properties/Settings.settings
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@
<AutoComplete Key="AutoCompleteForBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteIfBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteOnErrorResumeNextBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompletePrecompilerIfBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteSelectBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteTypeBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteWhileBlock" IsEnabled="true" />
Expand Down
1 change: 1 addition & 0 deletions Rubberduck.Core/Rubberduck.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@
<Compile Include="AutoComplete\AutoCompleteForBlock.cs" />
<Compile Include="AutoComplete\AutoCompleteIfBlock.cs" />
<Compile Include="AutoComplete\AutoCompleteOnErrorResumeNextBlock.cs" />
<Compile Include="AutoComplete\AutoCompletePrecompilerIfBlock.cs" />
<Compile Include="AutoComplete\AutoCompleteSelectBlock.cs" />
<Compile Include="AutoComplete\AutoCompleteTypeBlock.cs" />
<Compile Include="AutoComplete\AutoCompleteWhileBlock.cs" />
Expand Down
1 change: 1 addition & 0 deletions Rubberduck.Core/app.config
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@
<AutoComplete Key="AutoCompleteForBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteIfBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteOnErrorResumeNextBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompletePrecompilerIfBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteSelectBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteTypeBlock" IsEnabled="true" />
<AutoComplete Key="AutoCompleteWhileBlock" IsEnabled="true" />
Expand Down
9 changes: 9 additions & 0 deletions Rubberduck.Resources/Settings/AutoCompletesPage.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Rubberduck.Resources/Settings/AutoCompletesPage.cs.resx
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@
<data name="AutoCompleteOnErrorResumeNextBlockDescription" xml:space="preserve">
<value>Treat 'On Error Resume Next...GoTo 0' as a block</value>
</data>
<data name="AutoCompletePrecompilerIfBlockDescription" xml:space="preserve">
<value>Close precompiler '#If' blocks</value>
</data>
<data name="AutoCompleteSelectBlockDescription" xml:space="preserve">
<value>Close 'Select' blocks</value>
</data>
Expand Down
3 changes: 3 additions & 0 deletions Rubberduck.Resources/Settings/AutoCompletesPage.de.resx
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@
<data name="AutoCompleteOnErrorResumeNextBlockDescription" xml:space="preserve">
<value>Treat 'On Error Resume Next...GoTo 0' as a block</value>
</data>
<data name="AutoCompletePrecompilerIfBlockDescription" xml:space="preserve">
<value>Close precompiler '#If' blocks</value>
</data>
<data name="AutoCompleteSelectBlockDescription" xml:space="preserve">
<value>Close 'Select' blocks</value>
</data>
Expand Down
3 changes: 3 additions & 0 deletions Rubberduck.Resources/Settings/AutoCompletesPage.fr.resx
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@
<data name="AutoCompleteOnErrorResumeNextBlockDescription" xml:space="preserve">
<value>Traiter 'On Error Resume Next...GoTo 0' comme un bloc</value>
</data>
<data name="AutoCompletePrecompilerIfBlockDescription" xml:space="preserve">
<value>Fermer les blocs '#If' (préprocesseur)</value>
</data>
<data name="AutoCompleteSelectBlockDescription" xml:space="preserve">
<value>Fermer les blocs 'Select'</value>
</data>
Expand Down
3 changes: 3 additions & 0 deletions Rubberduck.Resources/Settings/AutoCompletesPage.resx
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@
<data name="AutoCompleteOnErrorResumeNextBlockDescription" xml:space="preserve">
<value>Treat 'On Error Resume Next...GoTo 0' as a block</value>
</data>
<data name="AutoCompletePrecompilerIfBlockDescription" xml:space="preserve">
<value>Close precompiler '#If' blocks</value>
</data>
<data name="AutoCompleteSelectBlockDescription" xml:space="preserve">
<value>Close 'Select' blocks</value>
</data>
Expand Down
7 changes: 7 additions & 0 deletions Rubberduck.VBEEditor/Events/AutoCompleteEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ public AutoCompleteEventArgs(ICodePane pane)
if (string.IsNullOrWhiteSpace(atSelection))
{
IsCommitted = true;
OldPrecedingLine = module.GetLines(selection.PreviousLine.PreviousLine);
OldCode = module.GetLines(selection.PreviousLine);
}
else
{
OldPrecedingLine = module.GetLines(selection.PreviousLine);
OldCode = module.GetLines(selection);
}
}
Expand Down Expand Up @@ -48,6 +50,11 @@ public AutoCompleteEventArgs(ICodePane pane)
/// </summary>
public string OldCode { get; }

/// <summary>
/// The line of code immediately above <see cref="OldCode"/>; used to determine whether we're looking at a line-continuated comment.
/// </summary>
public string OldPrecedingLine { get; }

/// <summary>
/// The autocompleted line of code, assigned by the autocomplete implementation. Used for caching, to prevent misfiring autocompletes.
/// If autocomplete works off committed input, this should match the <see cref="OldCode"/>.
Expand Down

0 comments on commit c5ac600

Please sign in to comment.