Skip to content

Commit

Permalink
[GH-61] - AndDoes draf of checks for ordinary methods
Browse files Browse the repository at this point in the history
  • Loading branch information
tpodolak committed Feb 2, 2019
1 parent 9f52c20 commit 172d4ae
Show file tree
Hide file tree
Showing 7 changed files with 1,218 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ internal class CallInfoAnalyzer : AbstractCallInfoAnalyzer<SyntaxKind, Invocatio
{
private static ImmutableArray<Type> callHierarchy = ImmutableArray.Create(
typeof(MemberAccessExpressionSyntax),
typeof(InvocationExpressionSyntax),
typeof(MemberAccessExpressionSyntax));
typeof(InvocationExpressionSyntax));

public CallInfoAnalyzer()
: base(new DiagnosticDescriptorsProvider())
Expand All @@ -26,7 +25,7 @@ public CallInfoAnalyzer()

protected override SyntaxKind InvocationExpressionKind { get; } = SyntaxKind.InvocationExpression;

protected override SyntaxNode GetSubstituteCall(IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
protected override SyntaxNode GetSubstituteCall(SyntaxNodeAnalysisContext syntaxNodeContext, IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
{
if (methodSymbol.IsExtensionMethod)
{
Expand All @@ -53,8 +52,16 @@ protected override SyntaxNode GetSubstituteCall(IMethodSymbol methodSymbol, Invo
}
}

if (hierarchyEnumerator.MoveNext() == false && descendantNodesEnumerator.MoveNext())
if (hierarchyEnumerator.MoveNext() == false)
{
var symbol = syntaxNodeContext.SemanticModel.GetSymbolInfo(descendantNodesEnumerator.Current);

if (symbol.Symbol is IMethodSymbol mSymbol && mSymbol.ReducedFrom == null)
{
return ((InvocationExpressionSyntax)descendantNodesEnumerator.Current).ArgumentList.Arguments
.First().Expression;
}

return descendantNodesEnumerator.Current;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public override void Initialize(AnalysisContext context)

protected abstract TSyntaxKind InvocationExpressionKind { get; }

protected abstract SyntaxNode GetSubstituteCall(IMethodSymbol methodSymbol, TInvocationExpressionSyntax invocationExpressionSyntax);
protected abstract SyntaxNode GetSubstituteCall(SyntaxNodeAnalysisContext syntaxNodeContext, IMethodSymbol methodSymbol, TInvocationExpressionSyntax invocationExpressionSyntax);

protected abstract IEnumerable<TExpressionSyntax> GetArgumentExpressions(TInvocationExpressionSyntax invocationExpressionSyntax);

Expand Down Expand Up @@ -288,7 +288,7 @@ private bool SupportsCallInfo(SyntaxNodeAnalysisContext syntaxNodeContext, TInvo

private IList<IParameterSymbol> GetSubstituteCallParameters(SyntaxNodeAnalysisContext syntaxNodeContext, IMethodSymbol methodSymbol, TInvocationExpressionSyntax invocationExpression)
{
var parentMethodCallSyntax = GetSubstituteCall(methodSymbol, invocationExpression);
var parentMethodCallSyntax = GetSubstituteCall(syntaxNodeContext, methodSymbol, invocationExpression);
var symbol = syntaxNodeContext.SemanticModel.GetSymbolInfo(parentMethodCallSyntax).Symbol;

switch (symbol)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public CallInfoAnalyzer()

protected override SyntaxKind InvocationExpressionKind { get; } = SyntaxKind.InvocationExpression;

protected override SyntaxNode GetSubstituteCall(IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
protected override SyntaxNode GetSubstituteCall(SyntaxNodeAnalysisContext syntaxNodeContext, IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
{
if (methodSymbol.IsExtensionMethod)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
namespace NSubstitute.Analyzers.Tests.CSharp.DiagnosticAnalyzerTests.CallInfoAnalyzerTests
{
[CombinatoryData("AndDoes")]
public class AndDoesMethodTests : CallInfoDiagnosticVerifier
public class AndDoesMethodPrecededByExtensionMethodTests : CallInfoDiagnosticVerifier
{
public override async Task ReportsNoDiagnostics_WhenSubstituteMethodCannotBeInferred(string method, string call, string argAccess)
{
Expand Down
Loading

0 comments on commit 172d4ae

Please sign in to comment.