diff --git a/Roslyn.sln b/Roslyn.sln index 3f6ff6d586543a9b65db2dcb012e4c5ac8b46bf6..79850854925e14e69f5541ab829e441d09d4093e 100644 --- a/Roslyn.sln +++ b/Roslyn.sln @@ -61,12 +61,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workspaces", "Workspaces", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Workspaces", "src\Workspaces\Core\Portable\Workspaces.csproj", "{5F8D2414-064A-4B3A-9B42-8E2A04246BE5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{C41FAB9A-D1D7-4253-B639-D72395B6BA37}" - ProjectSection(SolutionItems) = preProject - NuGet.Config = NuGet.Config - nuget.exe = nuget.exe - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visualizers", "Visualizers", "{64BDF58B-41BA-A19E-0D34-B5FA598403B6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FD0FAF5F-1DED-485C-99FA-84B97F3A8EEC}" diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs index 06ea5f338d14db4bfe9227203ac04a80a712d81e..edb7704841b704d33298d7a323b32e5d349f3160 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs @@ -5664,7 +5664,7 @@ private static void CombineExtensionMethodArguments(BoundExpression receiver, An hasError = this.CheckInstanceOrStatic(node, receiver, fieldSymbol, ref resultKind, diagnostics); } - if (!hasError && fieldSymbol.IsFixed) + if (!hasError && fieldSymbol.IsFixed && EnclosingNameofArgument == null) { TypeSymbol receiverType = receiver.Type; hasError = diff --git a/src/Compilers/CSharp/Portable/FlowAnalysis/PreciseAbstractFlowPass.cs b/src/Compilers/CSharp/Portable/FlowAnalysis/PreciseAbstractFlowPass.cs index b3b4b56801ef847e79059fdbf976996efd7f77b7..3c31cf01f749a7107a51889d3d2be277c1f78edf 100644 --- a/src/Compilers/CSharp/Portable/FlowAnalysis/PreciseAbstractFlowPass.cs +++ b/src/Compilers/CSharp/Portable/FlowAnalysis/PreciseAbstractFlowPass.cs @@ -501,7 +501,7 @@ protected void SetUnreachable() protected void VisitLvalue(BoundExpression node) { if (_trackRegions && node == this.firstInRegion && this.regionPlace == RegionPlace.Before) EnterRegion(); - switch (node.Kind) + switch (node?.Kind) { case BoundKind.Parameter: VisitLvalueParameter((BoundParameter)node); diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/NameOfTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/NameOfTests.cs index f5deb19a620bde0dbeb157094ca56479212d7bb8..f25c1b5f18e080d463e7eb580cfe46f75546a3f2 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/NameOfTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/NameOfTests.cs @@ -1209,7 +1209,7 @@ class Other { } "; var compilation = CreateCompilationWithMscorlib45(source, null, new CSharpCompilationOptions(OutputKind.ConsoleApplication).WithAllowUnsafe(true)); - CompileAndVerify(compilation, expectedOutput: + CompileAndVerify(compilation, expectedOutput: "MessageType x MessageType").VerifyDiagnostics(); } @@ -1258,5 +1258,73 @@ class Other { // return nameof(myStruct.MessageType); Diagnostic(ErrorCode.ERR_BadArgType, "myStruct.MessageType").WithArguments("1", "char*", "char[]").WithLocation(26, 23)); } + + + [Fact, WorkItem(12696, "https://github.com/dotnet/roslyn/issues/12696")] + public void FixedFieldAccessInsideNameOf() + { + var source = +@" +using System; + +struct MyType +{ + public static string a = nameof(MyType.normalField); + public static string b = nameof(MyType.fixedField); + public static string c = nameof(fixedField); + + public int normalField; + public unsafe fixed short fixedField[6]; + + public MyType(int i) { + this.normalField = i; + } +} + +class EntryPoint +{ + public static void Main(string[] args) + { + Console.Write(MyType.a + "" ""); + Console.Write(MyType.b + "" ""); + Console.Write(MyType.c); + } +} +"; + var compilation = CreateCompilationWithMscorlib45(source, null, new CSharpCompilationOptions(OutputKind.ConsoleApplication).WithAllowUnsafe(true)); + CompileAndVerify(compilation, expectedOutput: "normalField fixedField fixedField").VerifyDiagnostics(); + } + + [Fact, WorkItem(12696, "https://github.com/dotnet/roslyn/issues/12696")] + public void FixedFieldAccessFromInnerClass() + { + var source = +@" +using System; + +public struct MyType +{ + public static class Inner + { + public static string a = nameof(normalField); + public static string b = nameof(fixedField); + } + + public int normalField; + public unsafe fixed short fixedField[6]; +} + +class EntryPoint +{ + public static void Main(string[] args) + { + Console.Write(MyType.Inner.a + "" ""); + Console.Write(MyType.Inner.b); + } +} +"; + var compilation = CreateCompilationWithMscorlib45(source, null, new CSharpCompilationOptions(OutputKind.ConsoleApplication).WithAllowUnsafe(true)); + CompileAndVerify(compilation, expectedOutput: "normalField fixedField").VerifyDiagnostics(); + } } } diff --git a/src/Features/Core/Portable/CodeFixes/AddImport/AbstractAddImportCodeFixProvider.SearchScope.cs b/src/Features/Core/Portable/CodeFixes/AddImport/AbstractAddImportCodeFixProvider.SearchScope.cs index 38aa748bdd0b93b75fdc1d03a432287443ef8b2b..567eb98153fd99fbb0f168362abdc4ddd85484f3 100644 --- a/src/Features/Core/Portable/CodeFixes/AddImport/AbstractAddImportCodeFixProvider.SearchScope.cs +++ b/src/Features/Core/Portable/CodeFixes/AddImport/AbstractAddImportCodeFixProvider.SearchScope.cs @@ -192,14 +192,14 @@ public override SymbolReference CreateReference(SymbolResult searchResult) _metadataReference); } - protected override async Task> FindDeclarationsAsync( + protected override async Task> FindDeclarationsAsync( string name, SymbolFilter filter, SearchQuery searchQuery) { var service = _solution.Workspace.Services.GetService(); var info = await service.TryGetMetadataSymbolTreeInfoAsync(_solution, _metadataReference, CancellationToken).ConfigureAwait(false); if (info == null) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } return await info.FindAsync(searchQuery, _assembly, filter, CancellationToken).ConfigureAwait(false); diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Declarations.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Declarations.cs index e5a0a6ee8529377c125f9e7a722e9599f1ff82f1..2dc523b03fefb60f18fb1eb079dcd3081872421f 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Declarations.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Declarations.cs @@ -187,7 +187,7 @@ public static partial class SymbolFinder var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); - var list = new List(); + var list = ArrayBuilder.GetInstance(); // get declarations from the compilation's assembly await AddDeclarationsAsync(project, query, criteria, list, cancellationToken).ConfigureAwait(false); @@ -208,7 +208,7 @@ public static partial class SymbolFinder } } - return TranslateNamespaces(list, compilation); + return TranslateNamespaces(list.ToImmutableAndFree(), compilation); } private static string GetMetadataReferenceFilePath(MetadataReference metadataReference) @@ -219,70 +219,92 @@ private static string GetMetadataReferenceFilePath(MetadataReference metadataRef /// /// Makes certain all namespace symbols returned by API are from the compilation. /// - private static ImmutableArray TranslateNamespaces(List symbols, Compilation compilation) + private static ImmutableArray TranslateNamespaces( + ImmutableArray symbols, Compilation compilation) { - var result = ArrayBuilder.GetInstance(); + var builder = ArrayBuilder.GetInstance(); foreach (var symbol in symbols) { var ns = symbol as INamespaceSymbol; if (ns != null) { - result.Add(compilation.GetCompilationNamespace(ns)); + builder.Add(compilation.GetCompilationNamespace(ns)); } else { - result.Add(symbol); + builder.Add(symbol); } } - return result.ToImmutableAndFree(); + var result = builder.Count == symbols.Length + ? symbols + : builder.ToImmutable(); + + builder.Free(); + + return result; } - private static async Task AddDeclarationsAsync( - Project project, SearchQuery query, SymbolFilter filter, List list, CancellationToken cancellationToken) + private static Task AddDeclarationsAsync( + Project project, SearchQuery query, SymbolFilter filter, + ArrayBuilder list, CancellationToken cancellationToken) { - await AddDeclarationsAsync( + return AddDeclarationsAsync( project, query, filter, list, startingCompilation: null, startingAssembly: null, - cancellationToken: cancellationToken).ConfigureAwait(false); + cancellationToken: cancellationToken); } private static async Task AddDeclarationsAsync( Project project, SearchQuery query, SymbolFilter filter, - List list, + ArrayBuilder list, Compilation startingCompilation, IAssemblySymbol startingAssembly, CancellationToken cancellationToken) { using (Logger.LogBlock(FunctionId.SymbolFinder_Project_AddDeclarationsAsync, cancellationToken)) - using (var set = SharedPools.Default>().GetPooledObject()) { if (!await project.ContainsSymbolsWithNameAsync(query.GetPredicate(), filter, cancellationToken).ConfigureAwait(false)) { return; } - var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); - if (startingCompilation != null && startingAssembly != null && compilation.Assembly != startingAssembly) - { - // Return symbols from skeleton assembly in this case so that symbols have the same language as startingCompilation. - list.AddRange( - FilterByCriteria(compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken), filter) - .Select(s => s.GetSymbolKey().Resolve(startingCompilation, cancellationToken: cancellationToken).Symbol).WhereNotNull()); - } - else - { - list.AddRange(FilterByCriteria(compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken), filter)); - } + var unfilteredSymbols = await GetUnfilteredSymbolsAsync( + project, query, filter, startingCompilation, startingAssembly, cancellationToken).ConfigureAwait(false); + list.AddRange(FilterByCriteria(unfilteredSymbols, filter)); + } + } + + private static async Task> GetUnfilteredSymbolsAsync( + Project project, + SearchQuery query, + SymbolFilter filter, + Compilation startingCompilation, + IAssemblySymbol startingAssembly, + CancellationToken cancellationToken) + { + var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); + if (startingCompilation != null && startingAssembly != null && compilation.Assembly != startingAssembly) + { + // Return symbols from skeleton assembly in this case so that symbols have the same language as startingCompilation. + return compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken) + .Select(s => s.GetSymbolKey().Resolve(startingCompilation, cancellationToken: cancellationToken).Symbol) + .WhereNotNull() + .ToImmutableArray(); + } + else + { + return compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken) + .ToImmutableArray(); } } private static async Task AddDeclarationsAsync( Solution solution, IAssemblySymbol assembly, PortableExecutableReference referenceOpt, - SearchQuery query, SymbolFilter filter, List list, CancellationToken cancellationToken) + SearchQuery query, SymbolFilter filter, ArrayBuilder list, CancellationToken cancellationToken) { // All entrypoints to this function are Find functions that are only searching // for specific strings (i.e. they never do a custom search). @@ -367,7 +389,8 @@ public static Task> FindSourceDeclarationsAsync(Project pro /// /// Find the symbols for declarations made in source with the specified name. /// - public static Task> FindSourceDeclarationsAsync(Project project, string name, bool ignoreCase, SymbolFilter filter, CancellationToken cancellationToken = default(CancellationToken)) + public static async Task> FindSourceDeclarationsAsync( + Project project, string name, bool ignoreCase, SymbolFilter filter, CancellationToken cancellationToken = default(CancellationToken)) { if (project == null) { @@ -381,21 +404,22 @@ public static Task> FindSourceDeclarationsAsync(Project pro if (string.IsNullOrWhiteSpace(name)) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedCollections.EmptyEnumerable(); } using (Logger.LogBlock(FunctionId.SymbolFinder_Project_Name_FindSourceDeclarationsAsync, cancellationToken)) { - return FindSourceDeclarationsAsyncImpl(project, SearchQuery.Create(name, ignoreCase), filter, cancellationToken); + return await FindSourceDeclarationsAsyncImpl( + project, SearchQuery.Create(name, ignoreCase), filter, cancellationToken).ConfigureAwait(false); } } - private static async Task> FindSourceDeclarationsAsyncImpl( + private static async Task> FindSourceDeclarationsAsyncImpl( Project project, SearchQuery query, SymbolFilter filter, CancellationToken cancellationToken) { - var list = new List(); + var list = ArrayBuilder.GetInstance(); await AddDeclarationsAsync(project, query, filter, list, cancellationToken).ConfigureAwait(false); - return list; + return list.ToImmutableAndFree(); } /// @@ -452,13 +476,15 @@ public static Task> FindSourceDeclarationsAsync(Project pro /// /// Find the symbols for declarations made in source with a matching name. /// - public static Task> FindSourceDeclarationsAsync( + public static async Task> FindSourceDeclarationsAsync( Project project, Func predicate, SymbolFilter filter, CancellationToken cancellationToken = default(CancellationToken)) { - return FindSourceDeclarationsAsync(project, SearchQuery.CreateCustom(predicate), filter, cancellationToken); + return await FindSourceDeclarationsAsync( + project, SearchQuery.CreateCustom(predicate), filter, cancellationToken).ConfigureAwait(false); } - internal static async Task> FindSourceDeclarationsAsync(Project project, SearchQuery query, SymbolFilter filter, CancellationToken cancellationToken) + internal static async Task> FindSourceDeclarationsAsync( + Project project, SearchQuery query, SymbolFilter filter, CancellationToken cancellationToken) { if (project == null) { @@ -467,28 +493,27 @@ internal static async Task> FindSourceDeclarationsAsync(Pro if (query.Name != null && string.IsNullOrWhiteSpace(query.Name)) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } using (Logger.LogBlock(FunctionId.SymbolFinder_Project_Predicate_FindSourceDeclarationsAsync, cancellationToken)) { - var result = new List(); if (!await project.ContainsSymbolsWithNameAsync(query.GetPredicate(), filter, cancellationToken).ConfigureAwait(false)) { - return result; + return ImmutableArray.Empty; } var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); - result.AddRange(FilterByCriteria(compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken), filter)); - return result; + var unfiltered = compilation.GetSymbolsWithName(query.GetPredicate(), filter, cancellationToken).ToImmutableArray(); + return FilterByCriteria(unfiltered, filter); } } internal static ImmutableArray FilterByCriteria( - IEnumerable symbols, SymbolFilter criteria) + ImmutableArray symbols, SymbolFilter criteria) { - var result = ArrayBuilder.GetInstance(); + var builder = ArrayBuilder.GetInstance(); foreach (var symbol in symbols) { if (symbol.IsImplicitlyDeclared || symbol.IsAccessor()) @@ -498,11 +523,16 @@ internal static async Task> FindSourceDeclarationsAsync(Pro if (MeetCriteria(symbol, criteria)) { - result.Add(symbol); + builder.Add(symbol); } } - return result.ToImmutableAndFree(); + var result = builder.Count == symbols.Length + ? symbols + : builder.ToImmutable(); + + builder.Free(); + return result; } private static bool MeetCriteria(ISymbol symbol, SymbolFilter filter) diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs index 7ef3d16fda63f68e01bc7e0049c4b9ddb1acb085..26051105c8c378d06a826b0f1a1ea0c132618057 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo.cs @@ -435,10 +435,10 @@ private int BinarySearch(string name) { cancellationToken.ThrowIfCancellationRequested(); - var namedType = containerSymbol as INamedTypeSymbol; - if (namedType != null) + var nsOrType = containerSymbol as INamespaceOrTypeSymbol; + if (nsOrType != null) { - results.AddRange(namedType.GetMembers(GetName(node))); + results.AddRange(nsOrType.GetMembers(GetName(node))); } } } @@ -554,7 +554,6 @@ internal void AssertEquivalentTo(SymbolTreeInfo other) builder.Add(namedType); } } - } finally { diff --git a/src/Workspaces/CoreTest/FindAllDeclarationsTests.cs b/src/Workspaces/CoreTest/FindAllDeclarationsTests.cs index b41ed9c567755259bb602863def4764d58b873cc..f811c5a3d7cfba81af265e7b0cf7b07401294829 100644 --- a/src/Workspaces/CoreTest/FindAllDeclarationsTests.cs +++ b/src/Workspaces/CoreTest/FindAllDeclarationsTests.cs @@ -82,7 +82,8 @@ public partial class FindAllDeclarationsTests : TestBase InlineData("TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase", false, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase1.TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new string[0]),] - public static async Task FindDeclarationsAsync_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) + + public async Task FindDeclarationsAsync_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) { var project = GetProject(workspaceKind); var declarations = await SymbolFinder.FindDeclarationsAsync(project, searchTerm, ignoreCase).ConfigureAwait(false); @@ -90,18 +91,18 @@ public static async Task FindDeclarationsAsync_Test(string searchTerm, bool igno } [Fact] - public static async Task FindDeclarationsAsync_Test_NullProject() + public async Task FindDeclarationsAsync_Test_NullProject() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var declarations = await SymbolFinder.FindDeclarationsAsync(null, "Test", true); }); } [Fact] - public static async Task FindDeclarationsAsync_Test_NullString() + public async Task FindDeclarationsAsync_Test_NullString() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var project = GetProject(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindDeclarationsAsync(project, null, true); @@ -109,9 +110,9 @@ public static async Task FindDeclarationsAsync_Test_NullString() } [Fact] - public static async Task FindDeclarationsAsync_Test_Cancellation() + public async Task FindDeclarationsAsync_Test_Cancellation() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var cts = new CancellationTokenSource(); cts.Cancel(); @@ -121,7 +122,7 @@ public static async Task FindDeclarationsAsync_Test_Cancellation() } [Fact, WorkItem(1094411, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1094411")] - public static async Task FindDeclarationsAsync_Metadata() + public async Task FindDeclarationsAsync_Metadata() { var solution = CreateSolution(); var csharpId = ProjectId.CreateNewId(); @@ -142,7 +143,7 @@ public static async Task FindDeclarationsAsync_Metadata() } [Fact, WorkItem(6616, "https://github.com/dotnet/roslyn/issues/6616")] - public static async Task FindDeclarationsAsync_PreviousSubmission() + public async Task FindDeclarationsAsync_PreviousSubmission() { var solution = CreateSolution(); @@ -246,7 +247,8 @@ public class Inner InlineData("TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase", false, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase1.TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new string[0]),] - public static async Task FindSourceDeclarationsAsync_Project_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) + + public async Task FindSourceDeclarationsAsync_Project_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) { var project = GetProject(workspaceKind); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, searchTerm, ignoreCase).ConfigureAwait(false); @@ -254,18 +256,18 @@ public static async Task FindSourceDeclarationsAsync_Project_Test(string searchT } [Fact] - public static async Task FindSourceDeclarationsAsync_Project_Test_NullProject() + public async Task FindSourceDeclarationsAsync_Project_Test_NullProject() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var declarations = await SymbolFinder.FindSourceDeclarationsAsync((Project)null, "Test", true); }); } [Fact] - public static async Task FindSourceDeclarationsAsync_Project_Test_NullString() + public async Task FindSourceDeclarationsAsync_Project_Test_NullString() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var project = GetProject(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, null, true); @@ -273,9 +275,9 @@ public static async Task FindSourceDeclarationsAsync_Project_Test_NullString() } [Fact] - public static async Task FindSourceDeclarationsAsync_Project_Test_Cancellation() + public async Task FindSourceDeclarationsAsync_Project_Test_Cancellation() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var cts = new CancellationTokenSource(); var project = GetProject(WorkspaceKind.SingleClass); @@ -353,7 +355,8 @@ public static async Task FindSourceDeclarationsAsync_Project_Test_Cancellation() InlineData("TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase", false, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1.TestCase", "TestCase2.TestCase" }), InlineData("TestCase1.TestCase", true, WorkspaceKind.TwoNamespacesWithIdenticalClasses, new string[0]),] - public static async Task FindSourceDeclarationsAsync_Solution_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) + + public async Task FindSourceDeclarationsAsync_Solution_Test(string searchTerm, bool ignoreCase, WorkspaceKind workspaceKind, string[] expectedResults) { var solution = GetSolution(workspaceKind); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, searchTerm, ignoreCase).ConfigureAwait(false); @@ -361,18 +364,18 @@ public static async Task FindSourceDeclarationsAsync_Solution_Test(string search } [Fact] - public static async Task FindSourceDeclarationsAsync_Solution_Test_NullProject() + public async Task FindSourceDeclarationsAsync_Solution_Test_NullProject() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var declarations = await SymbolFinder.FindSourceDeclarationsAsync((Solution)null, "Test", true); }); } [Fact] - public static async Task FindSourceDeclarationsAsync_Solution_Test_NullString() + public async Task FindSourceDeclarationsAsync_Solution_Test_NullString() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAnyAsync(async () => { var solution = GetSolution(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, null, true); @@ -380,22 +383,14 @@ public static async Task FindSourceDeclarationsAsync_Solution_Test_NullString() } [Fact] - public static void FindSourceDeclarationsAsync_Solution_Test_Cancellation() + public async Task FindSourceDeclarationsAsync_Solution_Test_Cancellation() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { - try - { - var cts = new CancellationTokenSource(); - var solution = GetSolution(WorkspaceKind.SingleClass); - cts.Cancel(); - var declarations = SymbolFinder.FindSourceDeclarationsAsync(solution, "Test", true, SymbolFilter.All, cts.Token).Result; - } - catch (AggregateException ex) - { - VerifyInnerExceptionIsType(ex); - throw; - } + var cts = new CancellationTokenSource(); + var solution = GetSolution(WorkspaceKind.SingleClass); + cts.Cancel(); + var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, "Test", true, SymbolFilter.All, cts.Token); }); } @@ -413,7 +408,8 @@ public static void FindSourceDeclarationsAsync_Solution_Test_Cancellation() InlineData(WorkspaceKind.TwoProjectsEachWithASingleClassWithSingleField, new[] { "TestCases", "TestCases.TestCase", "TestCases.TestCase.TestField" }), InlineData(WorkspaceKind.NestedClass, new[] { "TestCases", "TestCases.TestCase", "TestCases.TestCase.InnerTestCase" }), InlineData(WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1", "TestCase1.TestCase", "TestCase2.TestCase", "TestCase2" }),] - public static async Task FindSourceDeclarationsAsync_Project_Func_Test(WorkspaceKind workspaceKind, string[] expectedResults) + + public async Task FindSourceDeclarationsAsync_Project_Func_Test(WorkspaceKind workspaceKind, string[] expectedResults) { var project = GetProject(workspaceKind); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, str => str.Contains("Test")).ConfigureAwait(false); @@ -421,7 +417,7 @@ public static async Task FindSourceDeclarationsAsync_Project_Func_Test(Workspace } [Fact] - public static async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysTruePredicate() + public async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysTruePredicate() { var project = GetProject(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, str => true).ConfigureAwait(false); @@ -429,7 +425,7 @@ public static async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysTru } [Fact] - public static async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysFalsePredicate() + public async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysFalsePredicate() { var project = GetProject(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, str => false).ConfigureAwait(false); @@ -437,49 +433,33 @@ public static async Task FindSourceDeclarationsAsync_Project_Func_Test_AlwaysFal } [Fact] - public static void FindSourceDeclarationsAsync_Project_Func_Test_NullProject() + public async Task FindSourceDeclarationsAsync_Project_Func_Test_NullProject() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { - try - { - var declarations = SymbolFinder.FindSourceDeclarationsAsync((Project)null, str => str.Contains("Test")).Result; - } - catch (AggregateException ex) - { - VerifyInnerExceptionArgumentNull(ex, "project"); - throw; - } + var declarations = await SymbolFinder.FindSourceDeclarationsAsync((Project)null, str => str.Contains("Test")); }); } [Fact] - public static void FindSourceDeclarationsAsync_Project_Func_Test_NullPredicate() + public async Task FindSourceDeclarationsAsync_Project_Func_Test_NullPredicate() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { var project = GetProject(WorkspaceKind.SingleClass); - var declarations = SymbolFinder.FindSourceDeclarationsAsync(project, null).Result; + var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, null); }); } [Fact] - public static void FindSourceDeclarationsAsync_Project_Func_Test_Cancellation() + public async Task FindSourceDeclarationsAsync_Project_Func_Test_Cancellation() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { - try - { - var cts = new CancellationTokenSource(); - var project = GetProject(WorkspaceKind.SingleClass); - cts.Cancel(); - var declarations = SymbolFinder.FindSourceDeclarationsAsync(project, str => str.Contains("Test"), SymbolFilter.All, cts.Token).Result; - } - catch (AggregateException ex) - { - VerifyInnerExceptionIsType(ex); - throw; - } + var cts = new CancellationTokenSource(); + var project = GetProject(WorkspaceKind.SingleClass); + cts.Cancel(); + var declarations = await SymbolFinder.FindSourceDeclarationsAsync(project, str => str.Contains("Test"), SymbolFilter.All, cts.Token); }); } @@ -497,7 +477,8 @@ public static void FindSourceDeclarationsAsync_Project_Func_Test_Cancellation() InlineData(WorkspaceKind.TwoProjectsEachWithASingleClassWithSingleField, new[] { "TestCases", "TestCases.TestCase", "TestCases.TestCase.TestField", "TestCases", "TestCases.TestCase", "TestCases.TestCase.TestField" }), InlineData(WorkspaceKind.NestedClass, new[] { "TestCases", "TestCases.TestCase", "TestCases.TestCase.InnerTestCase" }), InlineData(WorkspaceKind.TwoNamespacesWithIdenticalClasses, new[] { "TestCase1", "TestCase1.TestCase", "TestCase2.TestCase", "TestCase2" }),] - public static async Task FindSourceDeclarationsAsync_Solution_Func_Test(WorkspaceKind workspaceKind, string[] expectedResult) + + public async Task FindSourceDeclarationsAsync_Solution_Func_Test(WorkspaceKind workspaceKind, string[] expectedResult) { var solution = GetSolution(workspaceKind); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, str => str.Contains("Test")).ConfigureAwait(false); @@ -505,7 +486,7 @@ public static async Task FindSourceDeclarationsAsync_Solution_Func_Test(Workspac } [Fact] - public static async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysTruePredicate() + public async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysTruePredicate() { var solution = GetSolution(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, str => true).ConfigureAwait(false); @@ -513,7 +494,7 @@ public static async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysTr } [Fact] - public static async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysFalsePredicate() + public async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysFalsePredicate() { var solution = GetSolution(WorkspaceKind.SingleClass); var declarations = await SymbolFinder.FindSourceDeclarationsAsync(solution, str => false).ConfigureAwait(false); @@ -521,54 +502,38 @@ public static async Task FindSourceDeclarationsAsync_Solution_Func_Test_AlwaysFa } [Fact] - public static void FindSourceDeclarationsAsync_Solution_Func_Test_NullSolution() + public async Task FindSourceDeclarationsAsync_Solution_Func_Test_NullSolution() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { - try - { - var declarations = SymbolFinder.FindSourceDeclarationsAsync((Solution)null, str => str.Contains("Test")).Result; - } - catch (AggregateException ex) - { - VerifyInnerExceptionArgumentNull(ex, "solution"); - throw; - } + await SymbolFinder.FindSourceDeclarationsAsync((Solution)null, str => str.Contains("Test")); }); } [Fact] - public static void FindSourceDeclarationsAsync_Solution_Func_Test_NullPredicate() + public async Task FindSourceDeclarationsAsync_Solution_Func_Test_NullPredicate() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { var solution = GetSolution(WorkspaceKind.SingleClass); - var declarations = SymbolFinder.FindSourceDeclarationsAsync(solution, null).Result; + await SymbolFinder.FindSourceDeclarationsAsync(solution, null); }); } [Fact] - public static void FindSourceDeclarationsAsync_Solution_Func_Test_Cancellation() + public async Task FindSourceDeclarationsAsync_Solution_Func_Test_Cancellation() { - Assert.Throws(() => + await Assert.ThrowsAnyAsync(async () => { - try - { - var cts = new CancellationTokenSource(); - var solution = GetSolution(WorkspaceKind.SingleClass); - cts.Cancel(); - var declarations = SymbolFinder.FindSourceDeclarationsAsync(solution, str => str.Contains("Test"), SymbolFilter.All, cts.Token).Result; - } - catch (AggregateException ex) - { - VerifyInnerExceptionIsType(ex); - throw; - } + var cts = new CancellationTokenSource(); + var solution = GetSolution(WorkspaceKind.SingleClass); + cts.Cancel(); + await SymbolFinder.FindSourceDeclarationsAsync(solution, str => str.Contains("Test"), SymbolFilter.All, cts.Token); }); } [Fact] - public static async Task TestSymbolTreeInfoSerialization() + public async Task TestSymbolTreeInfoSerialization() { var solution = GetSolution(WorkspaceKind.SingleClass); var compilation = await solution.Projects.First().GetCompilationAsync();