diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToDefinition.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToDefinition.cs index d27238aea05f9..4d2f538882a20 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToDefinition.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToDefinition.cs @@ -55,7 +55,7 @@ public void GoToDefinitionOpensProvisionalTabIfDocumentNotAlreadyOpen() { } "); - VisualStudio.SolutionExplorer.CloseFile(project, "FileDef.cs", saveFile: true); + VisualStudio.SolutionExplorer.CloseCodeFile(project, "FileDef.cs", saveFile: true); VisualStudio.SolutionExplorer.AddFile(project, "FileConsumer.cs"); VisualStudio.SolutionExplorer.OpenFile(project, "FileConsumer.cs"); VisualStudio.Editor.SetText( diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToImplementation.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToImplementation.cs index fc52c0844209f..89b7c6d66713f 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToImplementation.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpGoToImplementation.cs @@ -52,7 +52,7 @@ public void GoToImplementationOpensProvisionalTabIfDocumentNotOpen() { } "); - VisualStudio.SolutionExplorer.CloseFile(project, "FileImplementation.cs", saveFile: true); + VisualStudio.SolutionExplorer.CloseCodeFile(project, "FileImplementation.cs", saveFile: true); VisualStudio.SolutionExplorer.AddFile(project, "FileInterface.cs"); VisualStudio.SolutionExplorer.OpenFile(project, "FileInterface.cs"); VisualStudio.Editor.SetText( diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpWinForms.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpWinForms.cs index 3bf57e4445074..47a3c5add3a3d 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpWinForms.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpWinForms.cs @@ -39,7 +39,7 @@ public void ChangeControlProperty() VisualStudio.SolutionExplorer.OpenFileWithDesigner(project, "Form1.cs"); VisualStudio.Editor.AddWinFormButton("SomeButton"); VisualStudio.Editor.EditWinFormButtonProperty(buttonName: "SomeButton", propertyName: "Text", propertyValue: "NewButtonText"); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.cs", saveFile: true); + VisualStudio.SolutionExplorer.CloseDesignerFile(project, "Form1.cs", saveFile: true); VisualStudio.SolutionExplorer.OpenFile(project, "Form1.Designer.cs"); var actualText = VisualStudio.Editor.GetText(); Assert.Contains(@"this.SomeButton.Text = ""NewButtonText""", actualText); @@ -55,7 +55,7 @@ public void ChangeControlPropertyInCode() var expectedPropertyValue = "ButtonTextGoesHere"; var actualPropertyValue = VisualStudio.Editor.GetWinFormButtonPropertyValue(buttonName: "SomeButton", propertyName: "Text"); Assert.Equal(expectedPropertyValue, actualPropertyValue); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.cs", saveFile: true); + VisualStudio.SolutionExplorer.CloseDesignerFile(project, "Form1.cs", saveFile: true); // Change the control's text in designer.cs code VisualStudio.SolutionExplorer.OpenFile(project, "Form1.Designer.cs"); // Verify that the control's property was set correctly. The following text should appear in InitializeComponent(). @@ -64,7 +64,7 @@ public void ChangeControlPropertyInCode() // Replace text property with something else VisualStudio.Editor.SelectTextInCurrentDocument(@"this.SomeButton.Text = ""ButtonTextGoesHere"";"); VisualStudio.Editor.SendKeys(@"this.SomeButton.Text = ""GibberishText"";"); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.Designer.cs", saveFile: true); + VisualStudio.SolutionExplorer.CloseCodeFile(project, "Form1.Designer.cs", saveFile: true); // Verify that the control text has changed in the designer VisualStudio.SolutionExplorer.OpenFileWithDesigner(project, "Form1.cs"); expectedPropertyValue = "GibberishText"; diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicLineCommit.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicLineCommit.cs index 8023b93e9c685..1030a2e308d9a 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicLineCommit.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicLineCommit.cs @@ -107,7 +107,7 @@ End Sub VisualStudio.SolutionExplorer.AddFile(new ProjName(ProjectName), "TestZ.vb", open: true); // Cause focus lost VisualStudio.SolutionExplorer.OpenFile(new ProjName(ProjectName), "TestZ.vb"); // Work around https://github.com/dotnet/roslyn/issues/18488 VisualStudio.Editor.SendKeys(" "); - VisualStudio.SolutionExplorer.CloseFile(new ProjName(ProjectName), "TestZ.vb", saveFile: false); + VisualStudio.SolutionExplorer.CloseCodeFile(new ProjName(ProjectName), "TestZ.vb", saveFile: false); VisualStudio.Editor.Verify.TextContains(@" Sub M() End Sub @@ -130,7 +130,7 @@ End Sub VisualStudio.SolutionExplorer.AddFile(new ProjName(ProjectName), "TestZ.vb", open: true); // Cause focus lost VisualStudio.SolutionExplorer.OpenFile(new ProjName(ProjectName), "TestZ.vb"); // Work around https://github.com/dotnet/roslyn/issues/18488 VisualStudio.Editor.SendKeys(" "); - VisualStudio.SolutionExplorer.CloseFile(new ProjName(ProjectName), "TestZ.vb", saveFile: false); + VisualStudio.SolutionExplorer.CloseCodeFile(new ProjName(ProjectName), "TestZ.vb", saveFile: false); VisualStudio.Editor.Verify.TextContains(@" Sub M() End Sub diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicWinForms.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicWinForms.cs index f4094d1e82734..b99f608a6fa62 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicWinForms.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicWinForms.cs @@ -55,7 +55,7 @@ public void AddControl() var project = new ProjectUtils.Project(ProjectName); VisualStudio.SolutionExplorer.OpenFileWithDesigner(project, "Form1.vb"); VisualStudio.Editor.AddWinFormButton("SomeButton"); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.vb", saveFile: true); + VisualStudio.SolutionExplorer.CloseDesignerFile(project, "Form1.vb", saveFile: true); VisualStudio.SolutionExplorer.OpenFile(project, "Form1.Designer.vb"); var actualText = VisualStudio.Editor.GetText(); Assert.Contains(@"Me.SomeButton.Name = ""SomeButton""", actualText); @@ -69,7 +69,7 @@ public void ChangeControlProperty() VisualStudio.SolutionExplorer.OpenFileWithDesigner(project, "Form1.vb"); VisualStudio.Editor.AddWinFormButton("SomeButton"); VisualStudio.Editor.EditWinFormButtonProperty(buttonName: "SomeButton", propertyName: "Text", propertyValue: "NewButtonText"); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.vb", saveFile: true); + VisualStudio.SolutionExplorer.CloseDesignerFile(project, "Form1.vb", saveFile: true); VisualStudio.SolutionExplorer.OpenFile(project, "Form1.Designer.vb"); var actualText = VisualStudio.Editor.GetText(); Assert.Contains(@"Me.SomeButton.Text = ""NewButtonText""", actualText); @@ -85,7 +85,7 @@ public void ChangeControlPropertyInCode() var expectedPropertyValue = "ButtonTextGoesHere"; var actualPropertyValue = VisualStudio.Editor.GetWinFormButtonPropertyValue(buttonName: "SomeButton", propertyName: "Text"); Assert.Equal(expectedPropertyValue, actualPropertyValue); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.vb", saveFile: true); + VisualStudio.SolutionExplorer.CloseDesignerFile(project, "Form1.vb", saveFile: true); // Change the control's text in designer.vb code VisualStudio.SolutionExplorer.OpenFile(project, "Form1.Designer.vb"); // Verify that the control's property was set correctly. The following text should appear in InitializeComponent(). @@ -94,7 +94,7 @@ public void ChangeControlPropertyInCode() // Replace text property with something else VisualStudio.Editor.SelectTextInCurrentDocument(@"Me.SomeButton.Text = ""ButtonTextGoesHere"""); VisualStudio.Editor.SendKeys(@"Me.SomeButton.Text = ""GibberishText"""); - VisualStudio.SolutionExplorer.CloseFile(project, "Form1.Designer.vb", saveFile: true); + VisualStudio.SolutionExplorer.CloseCodeFile(project, "Form1.Designer.vb", saveFile: true); // Verify that the control text has changed in the designer VisualStudio.SolutionExplorer.OpenFileWithDesigner(project, "Form1.vb"); expectedPropertyValue = "GibberishText"; diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs index 96f2c45701414..5ad4c488d9e0d 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs @@ -584,7 +584,7 @@ void SetText(string text) OpenFile(projectName, fileName); SetText(contents ?? string.Empty); - CloseFile(projectName, fileName, saveFile: true); + CloseCodeFile(projectName, fileName, saveFile: true); if (open) { OpenFile(projectName, fileName); @@ -888,25 +888,36 @@ public void OpenFile(string projectName, string relativeFilePath) ErrorHandler.ThrowOnFailure(textManager.NavigateToLineAndColumn(textLines, VSConstants.LOGVIEWID.Code_guid, line, column, line, column)); } - public void CloseFile(string projectName, string relativeFilePath, bool saveFile) + public void CloseDesignerFile(string projectName, string relativeFilePath, bool saveFile) { - var document = GetOpenDocument(projectName, relativeFilePath); - if (saveFile) - { - SaveFileWithExtraValidation(document); - document.Close(EnvDTE.vsSaveChanges.vsSaveChangesYes); - } - else + CloseFile(projectName, relativeFilePath, VSConstants.LOGVIEWID.Designer_guid, saveFile); + } + + public void CloseCodeFile(string projectName, string relativeFilePath, bool saveFile) + { + CloseFile(projectName, relativeFilePath, VSConstants.LOGVIEWID.Code_guid, saveFile); + } + + private void CloseFile(string projectName, string relativeFilePath, Guid logicalView, bool saveFile) + { + InvokeOnUIThread(() => { - document.Close(EnvDTE.vsSaveChanges.vsSaveChangesNo); - } + var filePath = GetAbsolutePathForProjectRelativeFilePath(projectName, relativeFilePath); + if (!VsShellUtilities.IsDocumentOpen(ServiceProvider.GlobalProvider, filePath, logicalView, out _, out _, out var windowFrame)) + { + throw new InvalidOperationException($"File '{filePath}' is not open in logical view '{logicalView}'"); + } + + var frameClose = saveFile ? __FRAMECLOSE.FRAMECLOSE_SaveIfDirty : __FRAMECLOSE.FRAMECLOSE_NoSave; + ErrorHandler.ThrowOnFailure(windowFrame.CloseFrame((uint)frameClose)); + }); } private EnvDTE.Document GetOpenDocument(string projectName, string relativeFilePath) { var filePath = GetAbsolutePathForProjectRelativeFilePath(projectName, relativeFilePath); var documents = GetDTE().Documents.Cast(); - var document = documents.FirstOrDefault(d => d.FullName == filePath); + var document = documents.SingleOrDefault(d => d.FullName == filePath); if (document == null) { diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs index 007983f83197b..95f0ac2c12d86 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs @@ -128,8 +128,11 @@ public void RenameFileViaDTE(ProjectUtils.Project project, string oldFileName, s _instance.Workspace.WaitForAsyncOperations(FeatureAttribute.Workspace); } - public void CloseFile(ProjectUtils.Project project, string fileName, bool saveFile) - => _inProc.CloseFile(project.Name, fileName, saveFile); + public void CloseDesignerFile(ProjectUtils.Project project, string fileName, bool saveFile) + => _inProc.CloseDesignerFile(project.Name, fileName, saveFile); + + public void CloseCodeFile(ProjectUtils.Project project, string fileName, bool saveFile) + => _inProc.CloseCodeFile(project.Name, fileName, saveFile); public void SaveFile(ProjectUtils.Project project, string fileName) => _inProc.SaveFile(project.Name, fileName);