Skip to content

Commit

Permalink
[GH-76] - convention test improvements, better WhenSubstituteCallFind…
Browse files Browse the repository at this point in the history
…er implementation
  • Loading branch information
tpodolak committed Mar 31, 2019
1 parent 7d508b5 commit 43d48ed
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace NSubstitute.Analyzers.CSharp.DiagnosticAnalyzers
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal class CallInfoDoAnalyzer : CallInfoAnalyzer
{
private readonly Lazy<WhenSubstituteCallFinder> _whenSubstituteCallFinderProxy = new Lazy<WhenSubstituteCallFinder>(() => new WhenSubstituteCallFinder());
Expand All @@ -34,16 +35,7 @@ protected override SyntaxNode GetSubstituteCall(SyntaxNodeAnalysisContext syntax
return null;
}

if (syntaxNodeContext.SemanticModel.GetSymbolInfo(parentInvocationExpression).Symbol is IMethodSymbol parentInvocationSymbol)
{
var argumentExpression = parentInvocationSymbol.MethodKind == MethodKind.ReducedExtension
? parentInvocationExpression.ArgumentList.Arguments.First().Expression
: parentInvocationExpression.ArgumentList.Arguments.Skip(1).First().Expression;

return WhenSubstituteCallFinder.Find(syntaxNodeContext, argumentExpression).FirstOrDefault();
}

return null;
return WhenSubstituteCallFinder.Find(syntaxNodeContext, parentInvocationExpression).FirstOrDefault();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ public NonSubstitutableMemberWhenAnalyzer()

protected override IEnumerable<SyntaxNode> GetExpressionsForAnalysys(SyntaxNodeAnalysisContext syntaxNodeAnalysisContext, IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
{
var argumentListArguments = invocationExpressionSyntax.ArgumentList.Arguments;
var argumentSyntax = methodSymbol.MethodKind == MethodKind.ReducedExtension ? argumentListArguments.First() : argumentListArguments.Skip(1).First();
return WhenSubstituteCallFinder.Find(syntaxNodeAnalysisContext, argumentSyntax.Expression);
return WhenSubstituteCallFinder.Find(syntaxNodeAnalysisContext, invocationExpressionSyntax, methodSymbol);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,21 @@ namespace NSubstitute.Analyzers.CSharp.DiagnosticAnalyzers
/// </summary>
internal class WhenSubstituteCallFinder
{
public IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, SyntaxNode argumentSyntax)
public IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, InvocationExpressionSyntax whenInvocationExpression, ISymbol whenInvocationSymbol = null)
{
if ((whenInvocationSymbol ?? syntaxNodeContext.SemanticModel.GetSymbolInfo(whenInvocationExpression).Symbol) is IMethodSymbol parentInvocationSymbol)
{
var argumentExpression = parentInvocationSymbol.MethodKind == MethodKind.ReducedExtension
? whenInvocationExpression.ArgumentList.Arguments.First().Expression
: whenInvocationExpression.ArgumentList.Arguments.Skip(1).First().Expression;

return Find(syntaxNodeContext, argumentExpression);
}

return null;
}

private IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, SyntaxNode argumentSyntax)
{
SyntaxNode body = null;
switch (argumentSyntax)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace NSubstitute.Analyzers.VisualBasic.DiagnosticAnalyzers
{
[DiagnosticAnalyzer(LanguageNames.VisualBasic)]
internal class CallInfoDoAnalyzer : CallInfoAnalyzer
{
private readonly Lazy<WhenSubstituteCallFinder> _whenSubstituteCallFinderProxy = new Lazy<WhenSubstituteCallFinder>(() => new WhenSubstituteCallFinder());
Expand All @@ -34,16 +35,7 @@ protected override SyntaxNode GetSubstituteCall(SyntaxNodeAnalysisContext syntax
return null;
}

if (syntaxNodeContext.SemanticModel.GetSymbolInfo(parentInvocationExpression).Symbol is IMethodSymbol parentInvocationSymbol)
{
var argumentExpression = parentInvocationSymbol.MethodKind == MethodKind.ReducedExtension
? parentInvocationExpression.ArgumentList.Arguments.First().GetExpression()
: parentInvocationExpression.ArgumentList.Arguments.Skip(1).First().GetExpression();

return WhenSubstituteCallFinder.Find(syntaxNodeContext, argumentExpression).FirstOrDefault();
}

return null;
return WhenSubstituteCallFinder.Find(syntaxNodeContext, parentInvocationExpression).FirstOrDefault();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ public NonSubstitutableMemberWhenAnalyzer()

protected override IEnumerable<SyntaxNode> GetExpressionsForAnalysys(SyntaxNodeAnalysisContext syntaxNodeAnalysisContext, IMethodSymbol methodSymbol, InvocationExpressionSyntax invocationExpressionSyntax)
{
var argumentListArguments = invocationExpressionSyntax.ArgumentList.Arguments;
var argumentSyntax = methodSymbol.MethodKind == MethodKind.ReducedExtension ? argumentListArguments.First() : argumentListArguments.Skip(1).First();
return WhenSubstituteCallFinder.Find(syntaxNodeAnalysisContext, argumentSyntax.GetExpression());
return WhenSubstituteCallFinder.Find(syntaxNodeAnalysisContext, invocationExpressionSyntax, methodSymbol);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,21 @@ namespace NSubstitute.Analyzers.VisualBasic.DiagnosticAnalyzers
{
internal class WhenSubstituteCallFinder
{
public IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, SyntaxNode argumentSyntax)
public IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, InvocationExpressionSyntax whenInvocationExpression, ISymbol whenInvocationSymbol = null)
{
if ((whenInvocationSymbol ?? syntaxNodeContext.SemanticModel.GetSymbolInfo(whenInvocationExpression).Symbol) is IMethodSymbol parentInvocationSymbol)
{
var argumentExpression = parentInvocationSymbol.MethodKind == MethodKind.ReducedExtension
? whenInvocationExpression.ArgumentList.Arguments.First().GetExpression()
: whenInvocationExpression.ArgumentList.Arguments.Skip(1).First().GetExpression();

return Find(syntaxNodeContext, argumentExpression);
}

return null;
}

private IEnumerable<SyntaxNode> Find(SyntaxNodeAnalysisContext syntaxNodeContext, SyntaxNode argumentSyntax)
{
SyntaxNode body = null;
switch (argumentSyntax)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public void AssertExportCodeFixProviderAttributeUsageFromAssemblyContaining(Type
{
var types = GetTypesAssignableTo<CodeFixProvider>(type.Assembly).ToList();

types.Should().OnlyContain(innerType => innerType.GetCustomAttributes<ExportCodeFixProviderAttribute>(true).Count() == 1, "because each code fix provider should be marked with only one attribute ExportCodeFixProviderAttribute");
types.SelectMany(innerType => innerType.GetCustomAttributes<ExportCodeFixProviderAttribute>(true)).Should()
types.Should().OnlyContain(innerType => innerType.GetCustomAttributes<ExportCodeFixProviderAttribute>(false).Count() == 1, "because each code fix provider should be marked with only one attribute ExportCodeFixProviderAttribute");
types.SelectMany(innerType => innerType.GetCustomAttributes<ExportCodeFixProviderAttribute>(false)).Should()
.OnlyContain(
attr => attr.Languages.Length == 1 && attr.Languages.Count(lang => lang == expectedLanguage) == 1,
$"because each code fix provider should support only selected language ${expectedLanguage}");
Expand All @@ -35,19 +35,13 @@ public void AssertDiagnosticAnalyzerAttributeUsageFromAssemblyContaining(Type ty
{
var types = GetTypesAssignableTo<DiagnosticAnalyzer>(type.Assembly).ToList();

types.Should().OnlyContain(innerType => innerType.GetCustomAttributes<DiagnosticAnalyzerAttribute>(true).Count() == 1, "because each analyzer should be marked with only one attribute DiagnosticAnalyzerAttribute");
types.SelectMany(innerType => innerType.GetCustomAttributes<DiagnosticAnalyzerAttribute>(true)).Should()
types.Should().OnlyContain(innerType => innerType.GetCustomAttributes<DiagnosticAnalyzerAttribute>(false).Count() == 1, "because each analyzer should be marked with only one attribute DiagnosticAnalyzerAttribute");
types.SelectMany(innerType => innerType.GetCustomAttributes<DiagnosticAnalyzerAttribute>(false)).Should()
.OnlyContain(
attr => attr.Languages.Length == 1 && attr.Languages.Count(lang => lang == expectedLanguage) == 1,
$"because each analyzer should support only selected language ${expectedLanguage}");
}

private static T CreateInstance<T>(Type analyzer)
{
var args = analyzer.GetConstructors().First().GetParameters().Select(parameter => Substitute.For(new[] { parameter.ParameterType }, null)).ToArray();
return (T)Activator.CreateInstance(analyzer, args);
}

private IEnumerable<Type> GetTypesAssignableTo<T>(Assembly assembly)
{
var type = typeof(T);
Expand Down

0 comments on commit 43d48ed

Please sign in to comment.