From 876f52e9ff9491c5f0191927b1617c18d2cc3809 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Mon, 21 Jun 2021 09:46:26 -0700 Subject: [PATCH] Fix support for multiple languages in AdditionalProjects --- .../ProjectCollection.cs | 17 +- .../MultipleProjectsTests.cs | 257 ++++++++++++++++++ 2 files changed, 273 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ProjectCollection.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ProjectCollection.cs index 07ee2603d..12b69c14e 100644 --- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ProjectCollection.cs +++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ProjectCollection.cs @@ -35,7 +35,22 @@ public ProjectCollection(string defaultLanguage, string defaultExtension) { get { - var project = this.GetOrAdd(projectName, () => new ProjectState(projectName, _defaultLanguage, $"/{projectName}/Test", _defaultExtension)); + string extension; + if (language == _defaultLanguage) + { + extension = _defaultExtension; + } + else + { + extension = language switch + { + LanguageNames.CSharp => "cs", + LanguageNames.VisualBasic => "vb", + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + } + + var project = this.GetOrAdd(projectName, () => new ProjectState(projectName, language, $"/{projectName}/Test", extension)); if (project.Language != language) { throw new InvalidOperationException(); diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing.UnitTests/MultipleProjectsTests.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing.UnitTests/MultipleProjectsTests.cs index 0ecfcd1e9..118ba2b01 100644 --- a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing.UnitTests/MultipleProjectsTests.cs +++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing.UnitTests/MultipleProjectsTests.cs @@ -12,6 +12,8 @@ Microsoft.CodeAnalysis.Testing.TestAnalyzers.HighlightBracesAnalyzer, Microsoft.CodeAnalysis.Testing.TestAnalyzers.CSharpAnalyzerTest, Microsoft.CodeAnalysis.Testing.DefaultVerifier>; +using VisualBasicTest = Microsoft.CodeAnalysis.Testing.TestAnalyzers.VisualBasicAnalyzerTest< + Microsoft.CodeAnalysis.Testing.TestAnalyzers.HighlightBracesAnalyzer>; namespace Microsoft.CodeAnalysis.Testing { @@ -44,6 +46,87 @@ public async Task TwoCSharpProjects_Independent() }.RunAsync(); } + [Fact] + public async Task TwoVisualBasicProjects_Independent() + { + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Derived1 : Inherits {|BC30002:Base2|} : End Class", + @"Public Class Base1 : End Class", + }, + AdditionalProjects = + { + ["Secondary"] = + { + Sources = + { + @"Public Class Derived2 : Inherits {|BC30002:Base1|} : End Class", + @"Public Class Base2 : End Class", + }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneCSharpProjectOneVisualBasicProject_Independent() + { + await new CSharpTest + { + TestState = + { + Sources = + { + @"public class Derived1 : {|CS0246:Base2|} [|{|] }", + @"public class Base1 [|{|] }", + }, + AdditionalProjects = + { + ["Secondary", LanguageNames.VisualBasic] = + { + Sources = + { + @"Public Class Derived2 : Inherits {|BC30002:Base1|} : End Class", + @"Public Class Base2 : End Class", + }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneVisualBasicProjectOneCSharpProject_Independent() + { + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Derived1 : Inherits {|BC30002:Base2|} : End Class", + @"Public Class Base1 : End Class", + }, + AdditionalProjects = + { + ["Secondary", LanguageNames.CSharp] = + { + Sources = + { + @"public class Derived2 : {|CS0246:Base1|} [|{|] }", + @"public class Base2 [|{|] }", + }, + }, + }, + }, + }.RunAsync(); + } + [Fact] public async Task TwoCSharpProjects_IndependentWithMarkupLocations() { @@ -120,6 +203,93 @@ public async Task TwoCSharpProjects_PrimaryReferencesSecondary() }.RunAsync(); } + [Fact] + public async Task TwoVisualBasicProjects_PrimaryReferencesSecondary() + { + // TestProject references Secondary + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Derived1 : Inherits Base2 : End Class", + @"Public Class Base1 : End Class", + }, + AdditionalProjectReferences = { "Secondary", }, + AdditionalProjects = + { + ["Secondary"] = + { + Sources = + { + @"Public Class Derived2 : Inherits {|BC30002:Base1|} : End Class", + @"Public Class Base2 : End Class", + }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneCSharpProjectOneVisualBasicProject_PrimaryReferencesSecondary() + { + // TestProject references Secondary + await new CSharpTest + { + TestState = + { + Sources = + { + @"public class Type1 [|{|] object field = new Type3(); }", + @"public class Type2 [|{|] }", + }, + AdditionalProjectReferences = { "Secondary", }, + AdditionalProjects = + { + ["Secondary", LanguageNames.VisualBasic] = + { + Sources = + { + @"Public Class Type3 : Private field As Object = New {|BC30002:Type1|}() : End Class", + @"Public Class Type4 : End Class", + }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneVisualBasicProjectOneCSharpProject_PrimaryReferencesSecondary() + { + // TestProject references Secondary + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Type1 : Private field As Object = New Type3() : End Class", + @"Public Class Type2 : End Class", + }, + AdditionalProjectReferences = { "Secondary", }, + AdditionalProjects = + { + ["Secondary", LanguageNames.CSharp] = + { + Sources = + { + @"public class Type3 [|{|] object field = new {|CS0246:Type1|}(); }", + @"public class Type4 [|{|] }", + }, + }, + }, + }, + }.RunAsync(); + } + [Fact] public async Task TwoCSharpProjects_SecondaryReferencesPrimary() { @@ -149,6 +319,93 @@ public async Task TwoCSharpProjects_SecondaryReferencesPrimary() }.RunAsync(); } + [Fact] + public async Task TwoVisualBasicProjects_SecondaryReferencesPrimary() + { + // TestProject references Secondary + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Derived1 : Inherits {|BC30002:Base2|} : End Class", + @"Public Class Base1 : End Class", + }, + AdditionalProjects = + { + ["Secondary"] = + { + Sources = + { + @"Public Class Derived2 : Inherits Base1 : End Class", + @"Public Class Base2 : End Class", + }, + AdditionalProjectReferences = { "TestProject" }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneCSharpProjectOneVisualBasicProject_SecondaryReferencesPrimary() + { + // TestProject references Secondary + await new CSharpTest + { + TestState = + { + Sources = + { + @"public class Type1 [|{|] object field = new {|CS0246:Type3|}(); }", + @"public class Type2 [|{|] }", + }, + AdditionalProjects = + { + ["Secondary", LanguageNames.VisualBasic] = + { + Sources = + { + @"Public Class Type3 : Private field As Object = New Type1() : End Class", + @"Public Class Type4 : End Class", + }, + AdditionalProjectReferences = { "TestProject" }, + }, + }, + }, + }.RunAsync(); + } + + [Fact] + public async Task OneVisualBasicProjectOneCSharpProject_SecondaryReferencesPrimary() + { + // TestProject references Secondary + await new VisualBasicTest + { + TestState = + { + Sources = + { + @"Public Class Type1 : Private field As Object = New {|BC30002:Type3|}() : End Class", + @"Public Class Type2 : End Class", + }, + AdditionalProjects = + { + ["Secondary", LanguageNames.CSharp] = + { + Sources = + { + @"public class Type3 [|{|] object field = new Type1(); }", + @"public class Type4 [|{|] }", + }, + AdditionalProjectReferences = { "TestProject" }, + }, + }, + }, + }.RunAsync(); + } + [Fact] public async Task TwoCSharpProjects_DefaultPaths() {