Esempio n. 1
0
        /// <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);
        }