/// <summary> /// diagnostic instrument to find out race in MeftHostService /// </summary> private void CrashIfSyntaxTreeFactoryServiceDoesntExistForCSharpOrVB <TExtension, TMetadata>(IEnumerable <Lazy <TExtension, TMetadata> > services) { if (typeof(TExtension) != typeof(ILanguageServiceFactory)) { return; } var hasLanguageService = false; var hasCSharpService = false; var hasVBService = false; foreach (var lazy in services) { var metadata = lazy.Metadata as LanguageServiceMetadata; if (metadata == null) { continue; } if (metadata.Language != LanguageNames.CSharp && metadata.Language != LanguageNames.VisualBasic) { continue; } hasLanguageService = true; if (metadata.ServiceType != typeof(ISyntaxTreeFactoryService).AssemblyQualifiedName) { continue; } if (metadata.Language == LanguageNames.CSharp) { hasCSharpService = true; } if (metadata.Language == LanguageNames.VisualBasic) { hasVBService = true; } if (hasCSharpService && hasVBService) { break; } } if (!hasLanguageService || (hasVBService && hasCSharpService)) { return; } var tempLanguages = this.languages == null ? null : this.languages.ToArray(); var tempServices = services.Select(lz => ValueTuple.Create(lz.Value, lz.Metadata)).ToArray(); var tempExportMap = this.exportsMap.Select(kv => ValueTuple.Create(kv.Key, kv.Value == null ? null : kv.Value as IEnumerable <object>)) .Select(t => ValueTuple.Create(t.Item1, t.Item2 == null ? null : t.Item2.ToArray())).ToArray(); var tempServices2 = services; ExceptionHelpers.Crash(new Exception("Crash")); GC.KeepAlive(tempLanguages); GC.KeepAlive(tempServices); GC.KeepAlive(tempServices2); GC.KeepAlive(tempExportMap); }