Skip to content

Commit

Permalink
Fix partial class handling in VSSDK006
Browse files Browse the repository at this point in the history
AArnott committed Jun 30, 2020
1 parent 3e806f2 commit 4a88093
Showing 2 changed files with 34 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -923,6 +923,37 @@ protected override void Initialize() {
await Verify.VerifyAnalyzerAsync(test);
}

[Fact]
public async Task PartialClass()
{
var test1 = @"
using Microsoft;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
partial class Test : Package {
IVsBuildManagerAccessor svc;
protected override void Initialize() {
base.Initialize();
[|this.svc|] = this.GetService(typeof(SVsBuildManagerAccessor)) as IVsBuildManagerAccessor;
svc.BeginDesignTimeBuild();
Foo();
}
}
";
var test2 = @"
using System;
partial class Test {
void Foo() {
Console.WriteLine();
}
}
";
var test = new Verify.Test { TestState = { Sources = { test1, test2 } } };
await test.RunAsync();
}

private DiagnosticResult CreateDiagnostic(int line, int column, int length, params (int line, int column, int length)[] additionalLocations)
{
DiagnosticResult diagnostic = Verify.Diagnostic().WithSpan(line, column, line, column + length);
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@ public override void Initialize(AnalysisContext context)
start.Compilation.GetTypeByMetadataName(Types.Assumes.FullName)?.GetMembers(Types.Assumes.Present)));
if (state.ShouldAnalyze)
{
start.RegisterSyntaxNodeAction(state.AnalyzeInvocationExpression, SyntaxKind.InvocationExpression);
start.RegisterSyntaxNodeAction(Utils.DebuggableWrapper(state.AnalyzeInvocationExpression), SyntaxKind.InvocationExpression);
}
});
}
@@ -166,7 +166,7 @@ private ImmutableArray<Location> ScanBlockForDereferencesWithoutNullCheck(Syntax
if (symbol != null)
{
System.Collections.Generic.IEnumerable<MemberAccessExpressionSyntax> variableUses = from access in containingBlockOrExpression.DescendantNodes().OfType<MemberAccessExpressionSyntax>()
let symbolAccessed = context.SemanticModel.GetSymbolInfo(access.Expression, context.CancellationToken).Symbol
let symbolAccessed = context.Compilation.GetSemanticModel(access.SyntaxTree).GetSymbolInfo(access.Expression, context.CancellationToken).Symbol
where SymbolEqualityComparer.Default.Equals(symbol, symbolAccessed)
select access;
if (!containingBlockOrExpression.DescendantNodes().Any(n => this.IsNonNullCheck(n, symbol, context)))
@@ -216,7 +216,7 @@ bool IsPatternMatchNullCheck(IsPatternExpressionSyntax o) => o.Pattern is Consta
private bool IsThrowingNullCheck(SyntaxNode node, ISymbol symbol, SyntaxNodeAnalysisContext context)
{
if (node is InvocationExpressionSyntax invocationExpression &&
context.SemanticModel.GetSymbolInfo(invocationExpression.Expression).Symbol?.OriginalDefinition is { } item &&
context.Compilation.GetSemanticModel(invocationExpression.SyntaxTree).GetSymbolInfo(invocationExpression.Expression).Symbol?.OriginalDefinition is { } item &&
this.nullThrowingMethods.Contains(item))
{
ArgumentSyntax firstArg = invocationExpression.ArgumentList.Arguments.FirstOrDefault();

0 comments on commit 4a88093

Please sign in to comment.