From 4a88093b41828db7826353b677a63633c09763d9 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 30 Jun 2020 16:40:50 -0600 Subject: [PATCH] Fix partial class handling in VSSDK006 --- ...VSSDK006CheckServicesExistAnalyzerTests.cs | 31 +++++++++++++++++++ .../VSSDK006CheckServicesExistAnalyzer.cs | 6 ++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.VisualStudio.SDK.Analyzers.Tests/VSSDK006CheckServicesExistAnalyzerTests.cs b/src/Microsoft.VisualStudio.SDK.Analyzers.Tests/VSSDK006CheckServicesExistAnalyzerTests.cs index 172705e7..d3ae5463 100644 --- a/src/Microsoft.VisualStudio.SDK.Analyzers.Tests/VSSDK006CheckServicesExistAnalyzerTests.cs +++ b/src/Microsoft.VisualStudio.SDK.Analyzers.Tests/VSSDK006CheckServicesExistAnalyzerTests.cs @@ -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); diff --git a/src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK006CheckServicesExistAnalyzer.cs b/src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK006CheckServicesExistAnalyzer.cs index f47d6de5..1c4c3957 100644 --- a/src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK006CheckServicesExistAnalyzer.cs +++ b/src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK006CheckServicesExistAnalyzer.cs @@ -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 ScanBlockForDereferencesWithoutNullCheck(Syntax if (symbol != null) { System.Collections.Generic.IEnumerable variableUses = from access in containingBlockOrExpression.DescendantNodes().OfType() - 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();