/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/VisualStudio/CSharp/Test/CodeModel/FileCodeModelTestHelpers.cs
67 строк
3 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Linq; using System.Runtime.ExceptionServices; using Microsoft.CodeAnalysis.Collections; using Microsoft.CodeAnalysis.Editor.Shared.Utilities; using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Test.Utilities; using Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel; using Microsoft.VisualStudio.LanguageServices.Implementation.Interop; using Microsoft.VisualStudio.LanguageServices.UnitTests; using Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel; using Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel.Mocks; using static Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel.CodeModelTestHelpers; namespace Microsoft.VisualStudio.LanguageServices.CSharp.UnitTests.CodeModel; internal static class FileCodeModelTestHelpers { // If something is *really* wrong with our COM marshalling stuff, the creation of the CodeModel will probably // throw some sort of AV or other Very Bad exception. We still want to be able to catch them, so we can clean up // the workspace. If we don't, we leak the workspace and it'll take down the process when it throws in a // finalizer complaining we didn't clean it up. Catching AVs is of course not safe, but this is balancing // "probably not crash" as an improvement over "will crash when the finalizer throws." [HandleProcessCorruptedStateExceptions] public static (EditorTestWorkspace workspace, EnvDTE.FileCodeModel fileCodeModel) CreateWorkspaceAndFileCodeModel(string file) { var workspace = EditorTestWorkspace.CreateCSharp(file, composition: CodeModelTestHelpers.Composition); try { var project = workspace.CurrentSolution.Projects.Single(); var document = project.Documents.Single().Id; var serviceProvider = workspace.ExportProvider.GetExportedValue<MockServiceProvider>(); var componentModel = new MockComponentModel(workspace.ExportProvider); WrapperPolicy.s_ComWrapperFactory = MockComWrapperFactory.Instance; var visualStudioWorkspaceMock = workspace.ExportProvider.GetExportedValue<MockVisualStudioWorkspace>(); visualStudioWorkspaceMock.SetWorkspace(workspace); var threadingContext = workspace.ExportProvider.GetExportedValue<IThreadingContext>(); var listenerProvider = workspace.ExportProvider.GetExportedValue<AsynchronousOperationListenerProvider>(); var state = new CodeModelState( threadingContext, serviceProvider, project.Services, visualStudioWorkspaceMock, workspace.ExportProvider.GetExportedValue<ProjectCodeModelFactory>()); var codeModel = FileCodeModel.Create(state, null, document, isSourceGeneratorOutput: false, new MockTextManagerAdapter()).Handle; return (workspace, codeModel); } catch { // We threw during creation of the FileCodeModel. Make sure we clean up our workspace or else we leak it workspace.Dispose(); throw; } } }