Skip to content

Commit 274aca9

Browse files
committed
Merge branch 'rubberduck-vba/next' into 4349_RenameClash_2
2 parents 41ef344 + dd6eae5 commit 274aca9

File tree

173 files changed

+4798
-5900
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

173 files changed

+4798
-5900
lines changed

Rubberduck.API/VBA/Parser.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
using System.Linq;
66
using System.Runtime.InteropServices;
77
using System.Threading;
8-
using Rubberduck.Common;
98
using Rubberduck.Parsing.ComReflection;
109
using Rubberduck.Parsing.PreProcessing;
1110
using Rubberduck.Parsing.Rewriter;
1211
using Rubberduck.Parsing.Symbols.DeclarationLoaders;
1312
using Rubberduck.Parsing.VBA;
14-
using Rubberduck.Parsing.Symbols;
1513
using Rubberduck.Parsing.UIContext;
1614
using Rubberduck.Parsing.VBA.ComReferenceLoading;
1715
using Rubberduck.Parsing.VBA.DeclarationCaching;
@@ -98,8 +96,6 @@ internal Parser(object vbe) : this()
9896
var projectRepository = new ProjectsRepository(_vbe);
9997
_state = new RubberduckParserState(_vbe, projectRepository, declarationFinderFactory, _vbeEvents);
10098
_state.StateChanged += _state_StateChanged;
101-
102-
var sourceFileHandler = _vbe.TempSourceFileHandler;
10399
var vbeVersion = double.Parse(_vbe.Version, CultureInfo.InvariantCulture);
104100
var predefinedCompilationConstants = new VBAPredefinedCompilationConstants(vbeVersion);
105101
var typeLibProvider = new TypeLibWrapperProvider(projectRepository);
@@ -112,7 +108,6 @@ internal Parser(object vbe) : this()
112108
var mainTokenStreamParser = new VBATokenStreamParser(mainParseErrorListenerFactory, mainParseErrorListenerFactory);
113109
var tokenStreamProvider = new SimpleVBAModuleTokenStreamProvider();
114110
var stringParser = new TokenStreamParserStringParserAdapterWithPreprocessing(tokenStreamProvider, mainTokenStreamParser, preprocessor);
115-
var attributesSourceCodeHandler = new SourceFileHandlerSourceCodeHandlerAdapter(sourceFileHandler, projectRepository);
116111
var projectManager = new RepositoryProjectManager(projectRepository);
117112
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
118113
var parserStateManager = new ParserStateManager(_state);
@@ -133,14 +128,12 @@ internal Parser(object vbe) : this()
133128
}
134129
);
135130
var codePaneSourceCodeHandler = new CodePaneSourceCodeHandler(projectRepository);
136-
var moduleRewriterFactory = new ModuleRewriterFactory(
137-
codePaneSourceCodeHandler,
138-
attributesSourceCodeHandler);
131+
var sourceFileHandler = _vbe.TempSourceFileHandler;
132+
var attributesSourceCodeHandler = new SourceFileHandlerSourceCodeHandlerAdapter(sourceFileHandler, projectRepository);
139133
var moduleParser = new ModuleParser(
140134
codePaneSourceCodeHandler,
141135
attributesSourceCodeHandler,
142-
stringParser,
143-
moduleRewriterFactory);
136+
stringParser);
144137
var parseRunner = new ParseRunner(
145138
_state,
146139
parserStateManager,

Rubberduck.CodeAnalysis/Inspections/Abstract/QuickFixBase.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
using System.Linq;
44
using NLog;
55
using Rubberduck.Parsing.Inspections.Abstract;
6-
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.Parsing.Rewriter;
77
using Rubberduck.Parsing.VBA.Extensions;
8+
using Rubberduck.Parsing.VBA.Parsing;
89

910
namespace Rubberduck.Inspections.Abstract
1011
{
@@ -39,7 +40,9 @@ public void RemoveInspections(params Type[] inspections)
3940
_supportedInspections = _supportedInspections.Except(inspections).ToHashSet();
4041
}
4142

42-
public abstract void Fix(IInspectionResult result);
43+
public virtual CodeKind TargetCodeKind => CodeKind.CodePaneCode;
44+
45+
public abstract void Fix(IInspectionResult result, IRewriteSession rewriteSession);
4346
public abstract string Description(IInspectionResult result);
4447

4548
public abstract bool CanFixInProcedure { get; }

Rubberduck.CodeAnalysis/Inspections/Concrete/VariableRequiresSetAssignmentEvaluator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public static class VariableRequiresSetAssignmentEvaluator
1313
/// Determines whether the 'Set' keyword is required (whether it's present or not) for the specified identifier reference.
1414
/// </summary>
1515
/// <param name="reference">The identifier reference to analyze</param>
16-
/// <param name="state">The parser state</param>
17-
public static bool RequiresSetAssignment(IdentifierReference reference, RubberduckParserState state)
16+
/// <param name="declarationFinderProvider">The parser state</param>
17+
public static bool RequiresSetAssignment(IdentifierReference reference, IDeclarationFinderProvider declarationFinderProvider)
1818
{
1919
if (!reference.IsAssignment)
2020
{
@@ -89,7 +89,7 @@ public static bool RequiresSetAssignment(IdentifierReference reference, Rubberdu
8989

9090
// todo resolve expression return type
9191

92-
var memberRefs = state.DeclarationFinder.IdentifierReferences(reference.ParentScoping.QualifiedName);
92+
var memberRefs = declarationFinderProvider.DeclarationFinder.IdentifierReferences(reference.ParentScoping.QualifiedName);
9393
var lastRef = memberRefs.LastOrDefault(r => !Equals(r, reference) && r.Context.GetAncestor<VBAParser.LetStmtContext>() == letStmtContext);
9494
if (lastRef?.Declaration.AsTypeDeclaration?.DeclarationType.HasFlag(DeclarationType.ClassModule) ?? false)
9595
{
@@ -104,7 +104,7 @@ public static bool RequiresSetAssignment(IdentifierReference reference, Rubberdu
104104
// is the reference referring to something else in scope that's a object?
105105
var project = Declaration.GetProjectParent(reference.ParentScoping);
106106
var module = Declaration.GetModuleParent(reference.ParentScoping);
107-
return state.DeclarationFinder.MatchName(expression.GetText().ToLowerInvariant())
107+
return declarationFinderProvider.DeclarationFinder.MatchName(expression.GetText().ToLowerInvariant())
108108
.Any(decl => (decl.DeclarationType.HasFlag(DeclarationType.ClassModule) || Tokens.Object.Equals(decl.AsTypeName))
109109
&& AccessibilityCheck.IsAccessible(project, module, reference.ParentScoping, decl));
110110
}

Rubberduck.CodeAnalysis/QuickFixes/AccessSheetUsingCodeNameQuickFix.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,26 @@
66
using Rubberduck.Parsing;
77
using Rubberduck.Parsing.Grammar;
88
using Rubberduck.Parsing.Inspections.Abstract;
9+
using Rubberduck.Parsing.Rewriter;
910
using Rubberduck.Parsing.VBA;
1011

1112
namespace Rubberduck.Inspections.QuickFixes
1213
{
13-
public class AccessSheetUsingCodeNameQuickFix : QuickFixBase
14+
public sealed class AccessSheetUsingCodeNameQuickFix : QuickFixBase
1415
{
15-
private readonly RubberduckParserState _state;
16+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
1617

17-
public AccessSheetUsingCodeNameQuickFix(RubberduckParserState state)
18+
public AccessSheetUsingCodeNameQuickFix(IDeclarationFinderProvider declarationFinderProvider)
1819
: base(typeof(SheetAccessedUsingStringInspection))
1920
{
20-
_state = state;
21+
_declarationFinderProvider = declarationFinderProvider;
2122
}
2223

23-
public override void Fix(IInspectionResult result)
24+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
2425
{
2526
var referenceResult = (IdentifierReferenceInspectionResult)result;
2627

27-
var rewriter = _state.GetRewriter(referenceResult.QualifiedName);
28+
var rewriter = rewriteSession.CheckOutModuleRewriter(referenceResult.QualifiedName);
2829

2930
var setStatement = referenceResult.Context.GetAncestor<VBAParser.SetStmtContext>();
3031
var isArgument = referenceResult.Context.GetAncestor<VBAParser.ArgumentContext>() != null;
@@ -36,14 +37,14 @@ public override void Fix(IInspectionResult result)
3637
var indexExprContext = referenceResult.Context.Parent.Parent as VBAParser.IndexExprContext ??
3738
referenceResult.Context.Parent as VBAParser.IndexExprContext;
3839

39-
rewriter.Replace(indexExprContext, referenceResult.Properties.CodeName);
40+
rewriter.Replace(indexExprContext, (string)referenceResult.Properties.CodeName);
4041
}
4142
else
4243
{
4344
// Sheet assigned to variable
4445

4546
var sheetVariableName = setStatement.lExpression().GetText();
46-
var sheetDeclaration = _state.DeclarationFinder.MatchName(sheetVariableName)
47+
var sheetDeclaration = _declarationFinderProvider.DeclarationFinder.MatchName(sheetVariableName)
4748
.First(declaration =>
4849
{
4950
var moduleBodyElement = declaration.Context.GetAncestor<VBAParser.ModuleBodyElementContext>();
@@ -71,7 +72,7 @@ public override void Fix(IInspectionResult result)
7172

7273
foreach (var reference in sheetDeclaration.References)
7374
{
74-
rewriter.Replace(reference.Context, referenceResult.Properties.CodeName);
75+
rewriter.Replace(reference.Context, (string)referenceResult.Properties.CodeName);
7576
}
7677

7778
rewriter.Remove(setStatement);

Rubberduck.CodeAnalysis/QuickFixes/AddIdentifierToWhiteListQuickFix.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Rubberduck.Inspections.Abstract;
33
using Rubberduck.Inspections.Concrete;
44
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Rewriter;
56
using Rubberduck.Settings;
67
using Rubberduck.SettingsProvider;
78

@@ -17,7 +18,8 @@ public AddIdentifierToWhiteListQuickFix(IPersistanceService<CodeInspectionSettin
1718
_settings = settings;
1819
}
1920

20-
public override void Fix(IInspectionResult result)
21+
//The rewriteSession is optional since it is not used in this particular quickfix.
22+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession = null)
2123
{
2224
var inspectionSettings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
2325
var whitelist = inspectionSettings.WhitelistedIdentifiers;

Rubberduck.CodeAnalysis/QuickFixes/AddStepOneQuickFix.cs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@
22
using Rubberduck.Inspections.Concrete;
33
using Rubberduck.Parsing.Inspections.Abstract;
44
using Rubberduck.Parsing.Rewriter;
5-
using Rubberduck.Parsing.VBA;
65
using System;
76
using static Rubberduck.Parsing.Grammar.VBAParser;
87

98
namespace Rubberduck.Inspections.QuickFixes
109
{
11-
public class AddStepOneQuickFix : QuickFixBase
10+
public sealed class AddStepOneQuickFix : QuickFixBase
1211
{
13-
private readonly RubberduckParserState _state;
14-
15-
public AddStepOneQuickFix(RubberduckParserState state)
12+
public AddStepOneQuickFix()
1613
: base(typeof(StepIsNotSpecifiedInspection))
17-
{
18-
_state = state;
19-
}
14+
{}
2015

2116
public override bool CanFixInProcedure => true;
2217

@@ -29,20 +24,20 @@ public override string Description(IInspectionResult result)
2924
return Resources.Inspections.QuickFixes.AddStepOneQuickFix;
3025
}
3126

32-
public override void Fix(IInspectionResult result)
27+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
3328
{
34-
IModuleRewriter rewriter = _state.GetRewriter(result.QualifiedSelection.QualifiedName);
35-
ForNextStmtContext context = result.Context as ForNextStmtContext;
29+
var rewriter = rewriteSession.CheckOutModuleRewriter(result.QualifiedSelection.QualifiedName);
30+
var context = result.Context as ForNextStmtContext;
3631

37-
int toExpressionEnd = this.GetToExpressionEnd(context);
32+
var toExpressionEnd = GetToExpressionEnd(context);
3833
rewriter.InsertAfter(toExpressionEnd, " Step 1");
3934
}
4035

41-
private int GetToExpressionEnd(ForNextStmtContext context)
36+
private static int GetToExpressionEnd(ForNextStmtContext context)
4237
{
43-
int toNodeIndex = context.TO().Symbol.TokenIndex;
38+
var toNodeIndex = context.TO().Symbol.TokenIndex;
4439

45-
foreach(ExpressionContext expressionChild in context.expression())
40+
foreach(var expressionChild in context.expression())
4641
{
4742
if (expressionChild.Stop.TokenIndex > toNodeIndex)
4843
{

Rubberduck.CodeAnalysis/QuickFixes/ApplicationWorksheetFunctionQuickFix.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
using Rubberduck.Inspections.Abstract;
22
using Rubberduck.Inspections.Concrete;
33
using Rubberduck.Parsing.Inspections.Abstract;
4-
using Rubberduck.Parsing.VBA;
4+
using Rubberduck.Parsing.Rewriter;
55

66
namespace Rubberduck.Inspections.QuickFixes
77
{
88
public sealed class ApplicationWorksheetFunctionQuickFix : QuickFixBase
99
{
10-
private readonly RubberduckParserState _state;
11-
12-
public ApplicationWorksheetFunctionQuickFix(RubberduckParserState state)
10+
public ApplicationWorksheetFunctionQuickFix()
1311
: base(typeof(ApplicationWorksheetFunctionInspection))
14-
{
15-
_state = state;
16-
}
12+
{}
1713

18-
public override void Fix(IInspectionResult result)
14+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
1915
{
20-
var rewriter = _state.GetRewriter(result.QualifiedSelection.QualifiedName);
16+
var rewriter = rewriteSession.CheckOutModuleRewriter(result.QualifiedSelection.QualifiedName);
2117
rewriter.InsertBefore(result.Context.Start.TokenIndex, "WorksheetFunction.");
2218
}
2319

Rubberduck.CodeAnalysis/QuickFixes/AssignedByValParameterMakeLocalCopyQuickFix.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ namespace Rubberduck.Inspections.QuickFixes
1919
public sealed class AssignedByValParameterMakeLocalCopyQuickFix : QuickFixBase
2020
{
2121
private readonly IAssignedByValParameterQuickFixDialogFactory _dialogFactory;
22-
private readonly RubberduckParserState _parserState;
22+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
2323
private Declaration _quickFixTarget;
2424

25-
public AssignedByValParameterMakeLocalCopyQuickFix(RubberduckParserState state, IAssignedByValParameterQuickFixDialogFactory dialogFactory)
25+
public AssignedByValParameterMakeLocalCopyQuickFix(IDeclarationFinderProvider declarationFinderProvider, IAssignedByValParameterQuickFixDialogFactory dialogFactory)
2626
: base(typeof(AssignedByValParameterInspection))
2727
{
2828
_dialogFactory = dialogFactory;
29-
_parserState = state;
29+
_declarationFinderProvider = declarationFinderProvider;
3030
}
3131

32-
public override void Fix(IInspectionResult result)
32+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
3333
{
3434
Debug.Assert(result.Target.Context.Parent is VBAParser.ArgListContext);
3535
Debug.Assert(null != ((ParserRuleContext)result.Target.Context.Parent.Parent).GetChild<VBAParser.EndOfStatementContext>());
@@ -42,7 +42,7 @@ public override void Fix(IInspectionResult result)
4242
return;
4343
}
4444

45-
var rewriter = _parserState.GetRewriter(result.Target);
45+
var rewriter = rewriteSession.CheckOutModuleRewriter(result.Target.QualifiedModuleName);
4646
ReplaceAssignedByValParameterReferences(rewriter, result.Target, localIdentifier);
4747
InsertLocalVariableDeclarationAndAssignment(rewriter, result.Target, localIdentifier);
4848
}
@@ -76,7 +76,7 @@ private string PromptForLocalVariableName(Declaration target)
7676
}
7777

7878
private bool IsNameCollision(string newName)
79-
=> _parserState.DeclarationFinder.FindNewDeclarationNameConflicts(newName, _quickFixTarget).Any();
79+
=> _declarationFinderProvider.DeclarationFinder.FindNewDeclarationNameConflicts(newName, _quickFixTarget).Any();
8080

8181
private string GetDefaultLocalIdentifier(Declaration target)
8282
{
@@ -116,7 +116,7 @@ private void InsertLocalVariableDeclarationAndAssignment(IModuleRewriter rewrite
116116
var localVariableDeclaration = $"{Tokens.Dim} {localIdentifier} {Tokens.As} {target.AsTypeName}";
117117

118118
var requiresAssignmentUsingSet =
119-
target.References.Any(refItem => VariableRequiresSetAssignmentEvaluator.RequiresSetAssignment(refItem, _parserState));
119+
target.References.Any(refItem => VariableRequiresSetAssignmentEvaluator.RequiresSetAssignment(refItem, _declarationFinderProvider));
120120

121121
var localVariableAssignment =
122122
$"{(requiresAssignmentUsingSet ? $"{Tokens.Set} " : string.Empty)}{localIdentifier} = {target.IdentifierName}";

Rubberduck.CodeAnalysis/QuickFixes/ChangeDimToPrivateQuickFix.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,19 @@
22
using Rubberduck.Inspections.Concrete;
33
using Rubberduck.Parsing.Grammar;
44
using Rubberduck.Parsing.Inspections.Abstract;
5-
using Rubberduck.Parsing.VBA;
5+
using Rubberduck.Parsing.Rewriter;
66

77
namespace Rubberduck.Inspections.QuickFixes
88
{
99
public sealed class ChangeDimToPrivateQuickFix : QuickFixBase
1010
{
11-
private readonly RubberduckParserState _state;
12-
13-
public ChangeDimToPrivateQuickFix(RubberduckParserState state)
11+
public ChangeDimToPrivateQuickFix()
1412
: base(typeof(ModuleScopeDimKeywordInspection))
15-
{
16-
_state = state;
17-
}
13+
{}
1814

19-
public override void Fix(IInspectionResult result)
15+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
2016
{
21-
var rewriter = _state.GetRewriter(result.QualifiedSelection.QualifiedName);
17+
var rewriter = rewriteSession.CheckOutModuleRewriter(result.QualifiedSelection.QualifiedName);
2218

2319
var context = (VBAParser.VariableStmtContext)result.Context.Parent.Parent;
2420
rewriter.Replace(context.DIM(), Tokens.Private);

0 commit comments

Comments
 (0)