Skip to content

Commit

Permalink
[GH-30] - First fully flagged test for VB
Browse files Browse the repository at this point in the history
  • Loading branch information
tpodolak committed Aug 24, 2018
1 parent 5d484b5 commit d188f6d
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,24 +33,17 @@ protected override AbstractCallInfoFinder<InvocationExpressionSyntax, ElementAcc
return new CallInfoCallFinder();
}

protected override SyntaxNode GetSafeCastTypeExpression(ElementAccessExpressionSyntax indexerExpressionSyntax)
protected override SyntaxNode GetCastTypeExpression(ElementAccessExpressionSyntax indexerExpressionSyntax)
{
if (indexerExpressionSyntax.Parent is BinaryExpressionSyntax binaryExpressionSyntax && binaryExpressionSyntax.OperatorToken.Kind() == SyntaxKind.AsKeyword)
switch (indexerExpressionSyntax.Parent)
{
return binaryExpressionSyntax.Right;
case BinaryExpressionSyntax binaryExpressionSyntax when binaryExpressionSyntax.OperatorToken.Kind() == SyntaxKind.AsKeyword:
return binaryExpressionSyntax.Right;
case CastExpressionSyntax castExpressionSyntax:
return castExpressionSyntax.Type;
default:
return null;
}

return null;
}

protected override SyntaxNode GetUnsafeCastTypeExpression(ElementAccessExpressionSyntax indexerExpressionSyntax)
{
if (indexerExpressionSyntax.Parent is CastExpressionSyntax castExpressionSyntax)
{
return castExpressionSyntax.Type;
}

return null;
}

protected override SyntaxNode GetAssignmentExpression(ElementAccessExpressionSyntax indexerExpressionSyntax)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@ public override void Initialize(AnalysisContext context)

protected abstract AbstractCallInfoFinder<TInvocationExpressionSyntax, TIndexerExpressionSyntax> GetCallInfoFinder();

protected abstract SyntaxNode GetSafeCastTypeExpression(TIndexerExpressionSyntax indexerExpressionSyntax);

protected abstract SyntaxNode GetUnsafeCastTypeExpression(TIndexerExpressionSyntax indexerExpressionSyntax);
protected abstract SyntaxNode GetCastTypeExpression(TIndexerExpressionSyntax indexerExpressionSyntax);

protected abstract SyntaxNode GetAssignmentExpression(TIndexerExpressionSyntax indexerExpressionSyntax);

Expand Down Expand Up @@ -171,26 +169,10 @@ symbolInfo.Symbol is IMethodSymbol argAtMethodSymbol &&
continue;
}

var safeCastTypeExpression = GetSafeCastTypeExpression(indexer);
if (indexerInfo.VerifyIndexerCast && safeCastTypeExpression != null)
{
var typeInfo = syntaxNodeContext.SemanticModel.GetTypeInfo(safeCastTypeExpression);
if (typeInfo.Type != null && !Equals(typeInfo.Type, parentCallInfo.Parameters[position.Value].Type))
{
var diagnostic = Diagnostic.Create(
DiagnosticDescriptorsProvider.CallInfoCouldNotConvertParameterAtPosition,
indexer.GetLocation(),
position.Value,
typeInfo.Type);
syntaxNodeContext.ReportDiagnostic(diagnostic);
continue;
}
}

var unsafeExpressionType = GetUnsafeCastTypeExpression(indexer);
if (indexerInfo.VerifyIndexerCast && unsafeExpressionType != null)
var castTypeExpression = GetCastTypeExpression(indexer);
if (indexerInfo.VerifyIndexerCast && castTypeExpression != null)
{
var typeInfo = syntaxNodeContext.SemanticModel.GetTypeInfo(unsafeExpressionType);
var typeInfo = syntaxNodeContext.SemanticModel.GetTypeInfo(castTypeExpression);
if (typeInfo.Type != null && !Equals(typeInfo.Type, parentCallInfo.Parameters[position.Value].Type))
{
var diagnostic = Diagnostic.Create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,26 +33,11 @@ protected override AbstractCallInfoFinder<InvocationExpressionSyntax, Invocation
return new CallInfoCallFinder();
}

protected override SyntaxNode GetSafeCastTypeExpression(InvocationExpressionSyntax indexerExpressionSyntax)
protected override SyntaxNode GetCastTypeExpression(InvocationExpressionSyntax indexerExpressionSyntax)
{
if (indexerExpressionSyntax.Parent is TryCastExpressionSyntax directCastExpressionSyntax)
if (indexerExpressionSyntax.Parent is CastExpressionSyntax castExpressionSyntax)
{
return directCastExpressionSyntax.Type;
}

return null;
}

protected override SyntaxNode GetUnsafeCastTypeExpression(InvocationExpressionSyntax indexerExpressionSyntax)
{
if (indexerExpressionSyntax.Parent is DirectCastExpressionSyntax directCastExpressionSyntax)
{
return directCastExpressionSyntax.Type;
}

if (indexerExpressionSyntax.Parent is CTypeExpressionSyntax cTypeExpressionSyntax)
{
return cTypeExpressionSyntax.Type;
return castExpressionSyntax.Type;
}

return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,13 @@ public void Test()
}

[Theory]
[InlineData("callInfo.ArgAt(Of Bar)(0)")]
[InlineData("Dim x = TryCast(callInfo.Args()(0), Bar)")]

// [InlineData("var x = (Bar)callInfo[0];")]
// [InlineData("var x = callInfo[0] as Bar;")]
// [InlineData("var x = (Bar)callInfo.Args()[0];")]
// [InlineData("var x = callInfo.Args()[0] as Bar;")]
[InlineData("Dim x = DirectCast(callInfo.Args()(0), Bar)")]
[InlineData("Dim x = CType(callInfo.Args()(0), Bar)")]
[InlineData("Dim x = TryCast(callInfo(0), Bar)")]
[InlineData("Dim x = DirectCast(callInfo(0), Bar)")]
[InlineData("Dim x = CType(callInfo(0), Bar)")]
public override async Task ReportsNoDiagnostic_WhenConvertingTypeToSupportedType(string argAccess)
{
var source = $@"Imports System
Expand Down

0 comments on commit d188f6d

Please sign in to comment.