diff --git a/src/VisualStudio/CSharp/Test/CodeModel/AbstractFileCodeElementTests.cs b/src/VisualStudio/CSharp/Test/CodeModel/AbstractFileCodeElementTests.cs index 205841a00b0f7092f111267292a2af283a9397ef..9617e747148d3f82b58226766671ee63fda1026c 100644 --- a/src/VisualStudio/CSharp/Test/CodeModel/AbstractFileCodeElementTests.cs +++ b/src/VisualStudio/CSharp/Test/CodeModel/AbstractFileCodeElementTests.cs @@ -21,29 +21,34 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.UnitTests.CodeModel public abstract class AbstractFileCodeElementTests : IDisposable { private readonly string _contents; - private Tuple _workspaceAndCodeModel; + private (TestWorkspace workspace, VisualStudioWorkspace extraWorkspaceToDisposeButNotUse, FileCodeModel fileCodeModel)? _workspaceAndCodeModel; public AbstractFileCodeElementTests(string contents) { _contents = contents; } - public Tuple WorkspaceAndCodeModel + public (TestWorkspace workspace, VisualStudioWorkspace extraWorkspaceToDisposeButNotUse, FileCodeModel fileCodeModel) WorkspaceAndCodeModel { get { - return _workspaceAndCodeModel ?? (_workspaceAndCodeModel = CreateWorkspaceAndFileCodeModelAsync(_contents)); + return _workspaceAndCodeModel ??= CreateWorkspaceAndFileCodeModelAsync(_contents); } } protected TestWorkspace GetWorkspace() { - return WorkspaceAndCodeModel.Item1; + return WorkspaceAndCodeModel.workspace; + } + + private VisualStudioWorkspace GetExtraWorkspaceToDisposeButNotUse() + { + return WorkspaceAndCodeModel.extraWorkspaceToDisposeButNotUse; } protected FileCodeModel GetCodeModel() { - return WorkspaceAndCodeModel.Item2; + return WorkspaceAndCodeModel.fileCodeModel; } protected Microsoft.CodeAnalysis.Solution GetCurrentSolution() @@ -55,7 +60,7 @@ protected Microsoft.CodeAnalysis.Project GetCurrentProject() protected Microsoft.CodeAnalysis.Document GetCurrentDocument() => GetCurrentProject().Documents.Single(); - protected static Tuple CreateWorkspaceAndFileCodeModelAsync(string file) + protected static (TestWorkspace workspace, VisualStudioWorkspace extraWorkspaceToDisposeButNotUse, FileCodeModel fileCodeModel) CreateWorkspaceAndFileCodeModelAsync(string file) => FileCodeModelTestHelpers.CreateWorkspaceAndFileCodeModel(file); protected CodeElement GetCodeElement(params object[] path) @@ -79,6 +84,7 @@ protected CodeElement GetCodeElement(params object[] path) public void Dispose() { + GetExtraWorkspaceToDisposeButNotUse().Dispose(); GetWorkspace().Dispose(); } diff --git a/src/VisualStudio/CSharp/Test/CodeModel/FileCodeModelTestHelpers.cs b/src/VisualStudio/CSharp/Test/CodeModel/FileCodeModelTestHelpers.cs index e9356f55bce218ae1b343db73ead5ef61a9da7f3..382e7b3517993d91038cdd289231189ef9716fef 100644 --- a/src/VisualStudio/CSharp/Test/CodeModel/FileCodeModelTestHelpers.cs +++ b/src/VisualStudio/CSharp/Test/CodeModel/FileCodeModelTestHelpers.cs @@ -2,15 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Linq; using System.Runtime.ExceptionServices; using Microsoft.CodeAnalysis.Editor; using Microsoft.CodeAnalysis.Editor.Shared.Utilities; -using Microsoft.CodeAnalysis.Editor.UnitTests; using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; 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; @@ -27,7 +24,7 @@ internal static class FileCodeModelTestHelpers // 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 Tuple CreateWorkspaceAndFileCodeModel(string file) + public static (TestWorkspace workspace, VisualStudioWorkspace extraWorkspaceToDisposeButNotUse, EnvDTE.FileCodeModel fileCodeModel) CreateWorkspaceAndFileCodeModel(string file) { var workspace = TestWorkspace.CreateCSharp(file, composition: VisualStudioTestCompositions.LanguageServices); @@ -59,7 +56,7 @@ internal static class FileCodeModelTestHelpers var codeModel = FileCodeModel.Create(state, null, document, new MockTextManagerAdapter()).Handle; - return Tuple.Create(workspace, (EnvDTE.FileCodeModel)codeModel); + return (workspace, visualStudioWorkspaceMock, codeModel); } catch { diff --git a/src/VisualStudio/Core/Test/ObjectBrowser/AbstractObjectBrowserTests.vb b/src/VisualStudio/Core/Test/ObjectBrowser/AbstractObjectBrowserTests.vb index d57b8cfdea3e861b984752fb1a0bf105f80a4384..79bccbd8ab95cc6aba2e6116c2311044b155e5f7 100644 --- a/src/VisualStudio/Core/Test/ObjectBrowser/AbstractObjectBrowserTests.vb +++ b/src/VisualStudio/Core/Test/ObjectBrowser/AbstractObjectBrowserTests.vb @@ -48,7 +48,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.ObjectBrowser Dim mockServiceProvider = New MockServiceProvider(mockComponentModel) Dim libraryManager = CreateLibraryManager(mockServiceProvider, mockComponentModel, vsWorkspace) - result = New TestState(workspace, libraryManager) + result = New TestState(workspace, vsWorkspace, libraryManager) Finally If result Is Nothing Then workspace.Dispose() diff --git a/src/VisualStudio/Core/Test/ObjectBrowser/Helpers.vb b/src/VisualStudio/Core/Test/ObjectBrowser/Helpers.vb index 35c426bf66118d336ec3bfc8f690a8613b2cb959..4b01cb60f51818eda7558b4471dddaa1bcb1fb71 100644 --- a/src/VisualStudio/Core/Test/ObjectBrowser/Helpers.vb +++ b/src/VisualStudio/Core/Test/ObjectBrowser/Helpers.vb @@ -15,15 +15,18 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.ObjectBrowser Implements IDisposable Private ReadOnly _workspace As TestWorkspace + Private ReadOnly _visualStudioWorkspace As VisualStudioWorkspace Private ReadOnly _libraryManager As AbstractObjectBrowserLibraryManager - Public Sub New(workspace As TestWorkspace, libraryManager As AbstractObjectBrowserLibraryManager) + Public Sub New(workspace As TestWorkspace, visualStudioWorkspace As VisualStudioWorkspace, libraryManager As AbstractObjectBrowserLibraryManager) _workspace = workspace + _visualStudioWorkspace = visualStudioWorkspace _libraryManager = libraryManager End Sub Public Sub Dispose() Implements IDisposable.Dispose _libraryManager.Dispose() + _visualStudioWorkspace.Dispose() _workspace.Dispose() End Sub diff --git a/src/VisualStudio/TestUtilities2/CodeModel/CodeModelTestState.vb b/src/VisualStudio/TestUtilities2/CodeModel/CodeModelTestState.vb index 10f7367f2b47fc313ff40530e149185102a6e3bc..cc5803a6da2f3fe2d536f55b12e9509c94d3b1eb 100644 --- a/src/VisualStudio/TestUtilities2/CodeModel/CodeModelTestState.vb +++ b/src/VisualStudio/TestUtilities2/CodeModel/CodeModelTestState.vb @@ -86,6 +86,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel If Not Me._disposedValue Then If disposing Then + VisualStudioWorkspace.Dispose() Workspace.Dispose() End If End If