in src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK002PackageRegistrationMatchesBaseTypeAnalyzer.cs [74:115]
private void AnalyzeClassDeclaration(SyntaxNodeAnalysisContext context, INamedTypeSymbol packageType, INamedTypeSymbol asyncPackageType)
{
var declaration = (ClassDeclarationSyntax)context.Node;
BaseTypeSyntax? baseType = declaration.BaseList?.Types.FirstOrDefault();
if (baseType == null)
{
return;
}
var baseTypeSymbol = context.SemanticModel.GetSymbolInfo(baseType.Type, context.CancellationToken).Symbol?.OriginalDefinition as ITypeSymbol;
if (Utils.IsEqualToOrDerivedFrom(baseTypeSymbol, packageType))
{
INamedTypeSymbol packageRegistrationType = context.Compilation.GetTypeByMetadataName(Types.PackageRegistrationAttribute.FullName);
INamedTypeSymbol userClassSymbol = context.SemanticModel.GetDeclaredSymbol(declaration, context.CancellationToken);
AttributeData? packageRegistrationInstance = userClassSymbol?.GetAttributes().FirstOrDefault(a => SymbolEqualityComparer.Default.Equals(a.AttributeClass, packageRegistrationType));
if (packageRegistrationInstance == null)
{
return;
}
if (!(packageRegistrationInstance.NamedArguments.FirstOrDefault(kv => kv.Key == Types.PackageRegistrationAttribute.AllowsBackgroundLoading).Value.Value is bool allowsBackgroundLoading))
{
allowsBackgroundLoading = false;
}
bool isAsyncPackageBaseType = Utils.IsEqualToOrDerivedFrom(baseTypeSymbol, asyncPackageType);
if (isAsyncPackageBaseType != allowsBackgroundLoading)
{
var attributeSyntax = packageRegistrationInstance.ApplicationSyntaxReference.GetSyntax(context.CancellationToken) as AttributeSyntax;
if (attributeSyntax is object)
{
AttributeArgumentSyntax? allowBackgroundLoadingSyntax = attributeSyntax.ArgumentList.Arguments.FirstOrDefault(a => a.NameEquals?.Name?.Identifier.Text == Types.PackageRegistrationAttribute.AllowsBackgroundLoading);
Location location = allowBackgroundLoadingSyntax?.GetLocation() ?? attributeSyntax.GetLocation();
ImmutableDictionary<string, string> properties = ImmutableDictionary.Create<string, string>()
.Add(BaseTypeDiagnosticPropertyName, isAsyncPackageBaseType ? Types.AsyncPackage.TypeName : Types.Package.TypeName);
context.ReportDiagnostic(Diagnostic.Create(Descriptor, location, properties));
}
}
}
}