private static void AnalyzeCompilation(CompilationAnalysisContext context) { if (AssemblyHasPublicTypes(context.Compilation.Assembly)) { INamedTypeSymbol?comVisibleAttributeSymbol = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemRuntimeInteropServicesComVisibleAttribute); if (comVisibleAttributeSymbol == null) { return; } AttributeData?attributeInstance = context.Compilation.Assembly.GetAttributes().FirstOrDefault(a => a.AttributeClass.Equals(comVisibleAttributeSymbol)); if (attributeInstance != null) { if (!attributeInstance.ConstructorArguments.IsEmpty && attributeInstance.ConstructorArguments[0].Kind == TypedConstantKind.Primitive && attributeInstance.ConstructorArguments[0].Value != null & attributeInstance.ConstructorArguments[0].Value.Equals(true)) { // Has the attribute, with the value 'true'. context.ReportNoLocationDiagnostic(RuleChangeComVisible, context.Compilation.Assembly.Name); } } else { // No ComVisible attribute at all. context.ReportNoLocationDiagnostic(RuleAddComVisible, context.Compilation.Assembly.Name); } } return; }
private static void AnalyzeCompilation(CompilationAnalysisContext context) { if (AssemblyHasPublicTypes(context.Compilation.Assembly)) { INamedTypeSymbol comVisibleAttributeSymbol = WellKnownTypes.ComVisibleAttribute(context.Compilation); if (comVisibleAttributeSymbol == null) { return; } AttributeData attributeInstance = context.Compilation.Assembly.GetAttributes().FirstOrDefault(a => a.AttributeClass.Equals(comVisibleAttributeSymbol)); if (attributeInstance != null) { if (attributeInstance.ConstructorArguments.Length > 0 && attributeInstance.ConstructorArguments[0].Kind == TypedConstantKind.Primitive && attributeInstance.ConstructorArguments[0].Value != null & attributeInstance.ConstructorArguments[0].Value.Equals(true)) { // Has the attribute, with the value 'true'. context.ReportNoLocationDiagnostic(RuleA, context.Compilation.Assembly.Name); } } else { // No ComVisible attribute at all. context.ReportNoLocationDiagnostic(RuleB, context.Compilation.Assembly.Name); } } return; }
private static void AnalyzeCompilation(CompilationAnalysisContext context) { var assemblyVersionAttributeSymbol = WellKnownTypes.AssemblyVersionAttribute(context.Compilation); var assemblyComplianceAttributeSymbol = WellKnownTypes.CLSCompliantAttribute(context.Compilation); if (assemblyVersionAttributeSymbol == null && assemblyComplianceAttributeSymbol == null) { return; } bool assemblyVersionAttributeFound = false; bool assemblyComplianceAttributeFound = false; var razorCompiledItemAttribute = WellKnownTypes.RazorCompiledItemAttribute(context.Compilation); // Check all assembly level attributes for the target attribute foreach (AttributeData attribute in context.Compilation.Assembly.GetAttributes()) { if (attribute.AttributeClass.Equals(assemblyVersionAttributeSymbol)) { // Mark the version attribute as found assemblyVersionAttributeFound = true; } else if (attribute.AttributeClass.Equals(assemblyComplianceAttributeSymbol)) { // Mark the compliance attribute as found assemblyComplianceAttributeFound = true; } else if (razorCompiledItemAttribute != null && attribute.AttributeClass.Equals(razorCompiledItemAttribute)) { // Bail out for dummy compilation for Razor code behind file. return; } } if (!assemblyVersionAttributeFound && assemblyVersionAttributeSymbol != null) { context.ReportNoLocationDiagnostic(CA1016Rule); } if (!assemblyComplianceAttributeFound && assemblyComplianceAttributeSymbol != null) { context.ReportNoLocationDiagnostic(CA1014Rule); } }