From 3d4c39124ae4963a514edf08ca1945d1398f266b Mon Sep 17 00:00:00 2001 From: AlekseyTs Date: Thu, 22 Sep 2016 21:29:37 -0700 Subject: [PATCH] RemoveAllSyntaxTrees should preserve embedded syntax trees in Declaration Table. Fixes #13925. --- .../Compilation/VisualBasicCompilation.vb | 3 +- .../Portable/Declarations/DeclarationTable.vb | 5 ++ .../Compilation/CompilationAPITests.vb | 47 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb index 1aa16a9deaa..e8fc140794e 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb @@ -424,6 +424,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Debug.Assert(syntaxTrees.All(Function(tree) syntaxTrees(syntaxTreeOrdinalMap(tree)) Is tree)) Debug.Assert(syntaxTrees.SetEquals(rootNamespaces.Keys.AsImmutable(), EqualityComparer(Of SyntaxTree).Default)) + Debug.Assert(embeddedTrees.All(Function(treeAndDeclaration) declarationTable.Contains(treeAndDeclaration.DeclarationEntry))) _options = options _syntaxTrees = syntaxTrees @@ -971,7 +972,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return UpdateSyntaxTrees(ImmutableArray(Of SyntaxTree).Empty, ImmutableDictionary.Create(Of SyntaxTree, Integer)(), ImmutableDictionary.Create(Of SyntaxTree, DeclarationTableEntry)(), - DeclarationTable.Empty, + AddEmbeddedTrees(DeclarationTable.Empty, _embeddedTrees), referenceDirectivesChanged:=_declarationTable.ReferenceDirectives.Any()) End Function diff --git a/src/Compilers/VisualBasic/Portable/Declarations/DeclarationTable.vb b/src/Compilers/VisualBasic/Portable/Declarations/DeclarationTable.vb index 7198639f430..f1a4a549928 100644 --- a/src/Compilers/VisualBasic/Portable/Declarations/DeclarationTable.vb +++ b/src/Compilers/VisualBasic/Portable/Declarations/DeclarationTable.vb @@ -76,6 +76,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End If End Function + Public Function Contains(rootDeclaration As DeclarationTableEntry) As Boolean + Return rootDeclaration IsNot Nothing AndAlso + (_allOlderRootDeclarations.Contains(rootDeclaration) OrElse _latestLazyRootDeclaration Is rootDeclaration) + End Function + Public Function RemoveRootDeclaration(lazyRootDeclaration As DeclarationTableEntry) As DeclarationTable ' We can only reuse the cache if we're removing the decl that was just added. If _latestLazyRootDeclaration Is lazyRootDeclaration Then diff --git a/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb b/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb index 9e9f3038e3b..da6702c1659 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb @@ -1961,5 +1961,52 @@ End Sub Assert.Throws(Of InvalidOperationException)(Function() CreateSubmission("?a + 1", previous:=s0)) End Sub + + + + Public Sub RemoveAllSyntaxTreesAndEmbeddedTrees_01() + Dim compilation1 = CreateCompilationWithMscorlib( + + +Public Module C + Sub Main() + System.Console.WriteLine(1) + End Sub +End Module + +, options:=TestOptions.ReleaseExe.WithEmbedVbCoreRuntime(True), references:={SystemRef}) + + compilation1.VerifyDiagnostics() + + Dim compilation2 = compilation1.RemoveAllSyntaxTrees() + compilation2 = compilation2.AddSyntaxTrees(compilation1.SyntaxTrees) + + compilation2.VerifyDiagnostics() + CompileAndVerify(compilation2, expectedOutput:="1") + End Sub + + + + Public Sub RemoveAllSyntaxTreesAndEmbeddedTrees_02() + Dim compilation1 = CreateCompilationWithMscorlibAndVBRuntime( + + +Public Module C + Sub Main() + System.Console.WriteLine(1) + End Sub +End Module + +, options:=TestOptions.ReleaseExe.WithEmbedVbCoreRuntime(True)) + + compilation1.VerifyDiagnostics() + + Dim compilation2 = compilation1.RemoveAllSyntaxTrees() + compilation2 = compilation2.AddSyntaxTrees(compilation1.SyntaxTrees) + + compilation2.VerifyDiagnostics() + CompileAndVerify(compilation2, expectedOutput:="1") + End Sub + End Class End Namespace -- GitLab