Skip to content

Commit b2e258c

Browse files
committed
Merge ICsharpMemberProvider with ICsharpParameterProvider
1 parent a7425e1 commit b2e258c

6 files changed

Lines changed: 70 additions & 92 deletions

File tree

Abc.MoqComplete/Abc.MoqComplete/ContextActions/FillWithMock/FillParamWithMockContextAction.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public class FillParamWithMockContextAction : ContextActionBase
3333
private IBlock _block;
3434
private IConstructor _constructor;
3535
private ICsharpMemberProvider _csharpMemberProvider;
36-
private ICsharpParameterProvider _parameterProvider;
3736
[NotNull]
3837
private static readonly IAnchor _anchor = new SubmenuAnchor(IntentionsAnchors.ContextActionsAnchor, SubmenuBehavior.Executable);
3938
[NotNull]
@@ -57,7 +56,6 @@ public override bool IsAvailable(IUserDataHolder cache)
5756
if (!testProjectProvider.IsTestProject(_dataProvider.PsiModule))
5857
return false;
5958

60-
_parameterProvider = ComponentResolver.GetComponent<ICsharpParameterProvider>(_dataProvider);
6159
_csharpMemberProvider = ComponentResolver.GetComponent<ICsharpMemberProvider>(_dataProvider);
6260
_selectedElement = _dataProvider.GetSelectedElement<IObjectCreationExpression>(false, false);
6361
_block = _dataProvider.GetSelectedElement<IBlock>();
@@ -99,7 +97,7 @@ public override bool IsAvailable(IUserDataHolder cache)
9997
if (!isAvailable)
10098
return false;
10199

102-
_parameterNumber = _parameterProvider.GetCurrentParameterNumber(_selectedElement, _dataProvider);
100+
_parameterNumber = _csharpMemberProvider.GetCurrentParameterNumber(_selectedElement, _dataProvider);
103101
var parameter = _constructor.Parameters[_parameterNumber];
104102

105103
if (!_csharpMemberProvider.IsAbstractOrInterface(parameter))
@@ -132,7 +130,7 @@ protected override Action<ITextControl> ExecutePsiTransaction(ISolution solution
132130
_block.AddStatementBefore(statement, _selectedElement.GetContainingStatement());
133131
}
134132

135-
return _parameterProvider.FillCurrentParameterWithMock(name, argumentList, _selectedElement, _parameterNumber, _dataProvider);
133+
return _csharpMemberProvider.FillCurrentParameterWithMock(name, argumentList, _selectedElement, _parameterNumber, _dataProvider);
136134
}
137135

138136
public override string Text => "Fill current parameter with Mock";

Abc.MoqComplete/Abc.MoqComplete/ContextActions/FillWithMock/FillParamWithMockLocalVariableContextAction.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,21 @@ public override IEnumerable<IntentionAction> CreateBulbItems()
4444
protected override Action<ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
4545
{
4646
var csharpMemberProvider = ComponentResolver.GetComponent<ICsharpMemberProvider>(_dataProvider);
47-
var parameterProvider = ComponentResolver.GetComponent<ICsharpParameterProvider>(_dataProvider);
4847
var selectedElement = _dataProvider.GetSelectedElement<IObjectCreationExpression>(false, false);
4948
var argumentList = selectedElement.ArgumentList;
5049
var @class = (IClass)selectedElement.TypeReference?.Resolve().DeclaredElement;
5150
var parameterCount = selectedElement.ArgumentList?.Arguments.Count(x => x.Kind != ParameterKind.UNKNOWN);
5251
var constructor = @class.Constructors.ToArray().FirstOrDefault(x => !x.IsParameterless && x.Parameters.Count > parameterCount);
5352
var parameters = csharpMemberProvider.GetConstructorParameters(constructor.ToString()).ToArray();
54-
var parameterNumber = parameterProvider.GetCurrentParameterNumber(selectedElement, _dataProvider);
53+
var parameterNumber = csharpMemberProvider.GetCurrentParameterNumber(selectedElement, _dataProvider);
5554
var shortName = constructor.Parameters[parameterNumber].ShortName;
5655
var currentParam = parameters[parameterNumber];
5756
var block = _dataProvider.GetSelectedElement<IBlock>();
5857
var localVariableStatement = _dataProvider.ElementFactory.CreateStatement("var $0 = new Mock<$1>();", (object)shortName, currentParam);
5958

6059
block.AddStatementBefore(localVariableStatement, selectedElement.GetContainingStatement());
6160

62-
return parameterProvider.FillCurrentParameterWithMock(shortName, argumentList, selectedElement, parameterNumber, _dataProvider);
61+
return csharpMemberProvider.FillCurrentParameterWithMock(shortName, argumentList, selectedElement, parameterNumber, _dataProvider);
6362
}
6463
}
6564
}

Abc.MoqComplete/Abc.MoqComplete/ContextActions/Services/CsharpMemberProvider.cs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Text;
45
using JetBrains.ProjectModel;
6+
using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs;
57
using JetBrains.ReSharper.Psi;
68
using JetBrains.ReSharper.Psi.CSharp.Tree;
9+
using JetBrains.TextControl;
10+
using JetBrains.Util;
711

812
namespace Abc.MoqComplete.ContextActions.Services
913
{
@@ -67,5 +71,56 @@ public bool IsAbstractOrInterface(IParameter parameter)
6771
{
6872
return parameter.Type.GetScalarType()?.Resolve().DeclaredElement is IModifiersOwner modif && modif.IsAbstract;
6973
}
74+
75+
public int GetCurrentParameterNumber(IObjectCreationExpression selectedElement, ICSharpContextActionDataProvider dataProvider)
76+
{
77+
var delimiterPositions = selectedElement.Delimiters.Select(x => x.GetNavigationRange().StartOffset.Offset).ToArray();
78+
var currentPosition = dataProvider.DocumentSelection.StartOffset.Offset;
79+
80+
var parameterNumber = 0;
81+
while (parameterNumber < delimiterPositions.Length && currentPosition > delimiterPositions[parameterNumber])
82+
parameterNumber++;
83+
84+
return parameterNumber;
85+
}
86+
87+
public Action<ITextControl> FillCurrentParameterWithMock(string shortName,
88+
IArgumentList argumentList,
89+
IObjectCreationExpression selectedElement,
90+
int parameterNumber,
91+
ICSharpContextActionDataProvider dataProvider)
92+
{
93+
var argument = dataProvider.ElementFactory.CreateArgument(ParameterKind.VALUE, dataProvider.ElementFactory.CreateExpression($"{shortName}.Object"));
94+
ICSharpArgument arg;
95+
var shouldRemoveEndComma = true;
96+
97+
if (argumentList.Arguments.Count <= 1)
98+
arg = selectedElement.AddArgumentAfter(argument, null);
99+
else if (parameterNumber != 0)
100+
arg = selectedElement.AddArgumentAfter(argument, argumentList.Arguments[parameterNumber - 1]);
101+
else
102+
{
103+
arg = selectedElement.AddArgumentBefore(argument, argumentList.Arguments[1]);
104+
shouldRemoveEndComma = false;
105+
}
106+
107+
var argumentRange = arg.GetDocumentRange();
108+
109+
// Remove last comma Hack!
110+
return textControl =>
111+
{
112+
TextRange range;
113+
114+
if (shouldRemoveEndComma)
115+
range = new TextRange(argumentRange.EndOffset.Offset, argumentRange.EndOffset.Offset + 1);
116+
else
117+
range = new TextRange(argumentRange.StartOffset.Offset - 2, argumentRange.StartOffset.Offset);
118+
119+
var text = textControl.Document.GetText(range);
120+
121+
if (text.Contains(","))
122+
textControl.Document.DeleteText(range);
123+
};
124+
}
70125
}
71126
}

Abc.MoqComplete/Abc.MoqComplete/ContextActions/Services/CsharpParameterProvider.cs

Lines changed: 0 additions & 66 deletions
This file was deleted.

Abc.MoqComplete/Abc.MoqComplete/ContextActions/Services/ICsharpMemberProvider.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs;
24
using JetBrains.ReSharper.Psi;
35
using JetBrains.ReSharper.Psi.CSharp.Tree;
6+
using JetBrains.TextControl;
47

58
namespace Abc.MoqComplete.ContextActions.Services
69
{
@@ -10,5 +13,11 @@ public interface ICsharpMemberProvider
1013
Dictionary<string, string> GetClassFields(IClassBody classBody, PsiLanguageType languageType);
1114
string GetGenericMock(string typeStr);
1215
bool IsAbstractOrInterface(IParameter parameter);
16+
int GetCurrentParameterNumber(IObjectCreationExpression selectedElement, ICSharpContextActionDataProvider dataProvider);
17+
Action<ITextControl> FillCurrentParameterWithMock(string shortName,
18+
IArgumentList argumentList,
19+
IObjectCreationExpression selectedElement,
20+
int parameterNumber,
21+
ICSharpContextActionDataProvider dataProvider);
1322
}
1423
}

Abc.MoqComplete/Abc.MoqComplete/ContextActions/Services/ICsharpParameterProvider.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)