private static void TestDescriptorIsExceptionSafeCore(DiagnosticDescriptor descriptor) { var localizableTitle = descriptor.Title; var localizableMessage = descriptor.MessageFormat; var localizableDescription = descriptor.Description; // Verify exceptions from LocalizableResourceString don't go unhandled. var title = localizableTitle.ToString(); var message = localizableMessage.ToString(); var description = localizableDescription.ToString(); // Verify exceptions from LocalizableResourceString are raised if OnException is set. var exceptions = new List <Exception>(); var handler = new EventHandler <Exception>((sender, ex) => exceptions.Add(ex)); localizableTitle.OnException += handler; localizableMessage.OnException += handler; localizableDescription.OnException += handler; // Access and evaluate localizable fields. var unused1 = localizableTitle.ToString(); var unused2 = localizableMessage.ToString(); var unused3 = localizableDescription.ToString(); Assert.Equal(3, exceptions.Count); // Verify DiagnosticAnalyzer.SupportedDiagnostics is also exception safe. var analyzer = new MyAnalyzer(descriptor); var exceptionDiagnostics = new List <Diagnostic>(); Action <Exception, DiagnosticAnalyzer, Diagnostic> onAnalyzerException = (ex, a, diag) => exceptionDiagnostics.Add(diag); var analyzerManager = new AnalyzerManager(analyzer); var analyzerExecutor = AnalyzerExecutor.CreateForSupportedDiagnostics( onAnalyzerException, analyzerManager ); var descriptors = analyzerManager.GetSupportedDiagnosticDescriptors( analyzer, analyzerExecutor ); Assert.Equal(1, descriptors.Length); Assert.Equal(descriptor.Id, descriptors[0].Id); // Access and evaluate localizable fields. unused1 = descriptors[0].Title.ToString(); unused2 = descriptors[0].MessageFormat.ToString(); unused3 = descriptors[0].Description.ToString(); // Verify logged analyzer exception diagnostics. Assert.Equal(3, exceptionDiagnostics.Count); Assert.True( exceptionDiagnostics.TrueForAll(AnalyzerExecutor.IsAnalyzerExceptionDiagnostic) ); }