|
// Licensed to the .NET Foundation under one or more agreements.
// 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.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.CodeFixes.FullyQualify;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics;
using Microsoft.CodeAnalysis.Remote.Testing;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.FullyQualify;
[Trait(Traits.Feature, Traits.Features.CodeActionsFullyQualify)]
public sealed class FullyQualifyTests : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest_NoEditor
{
public FullyQualifyTests(ITestOutputHelper logger)
: base(logger)
{
}
internal override (DiagnosticAnalyzer?, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new CSharpFullyQualifyCodeFixProvider());
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> FlattenActions(actions);
[Theory, CombinatorialData]
public Task TestTypeFromMultipleNamespaces1(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
[|IDictionary|] Method()
{
Goo();
}
}
""",
"""
class Class
{
System.Collections.IDictionary Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestTypeFromMultipleNamespaces2(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
[|IDictionary|] Method()
{
Goo();
}
}
""",
"""
class Class
{
System.Collections.Generic.IDictionary Method()
{
Goo();
}
}
""",
index: 1, testHost: testHost);
[Theory, CombinatorialData]
[WorkItem("https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1889385")]
public Task TestPreservesIncorrectIndentation1(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
[|IDictionary|] Method()
{
Goo();
}
}
""",
"""
class Class
{
System.Collections.IDictionary Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
[WorkItem("https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1889385")]
public Task TestPreservesIncorrectIndentation2(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
\t[|IDictionary|] Method()
{
Goo();
}
}
""".Replace(@"\t", "\t"),
"""
class Class
{
\tSystem.Collections.IDictionary Method()
{
Goo();
}
}
""".Replace(@"\t", "\t"), testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenericWithNoArgs(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
[|List|] Method()
{
Goo();
}
}
""",
"""
class Class
{
System.Collections.Generic.List Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenericWithCorrectArgs(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
""",
"""
class Class
{
System.Collections.Generic.List<int> Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestSmartTagDisplayText(TestHost testHost)
=> TestSmartTagTextAsync(
"""
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
""",
"System.Collections.Generic.List", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestGenericWithWrongArgs(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
class Class
{
[|List<int, string>|] Method()
{
Goo();
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestNotOnVar1(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
namespace N
{
class var { }
}
class C
{
void M()
{
[|var|]
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestNotOnVar2(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
namespace N
{
class Bar { }
}
class C
{
void M()
{
[|var|]
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestGenericInLocalDeclaration(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Goo()
{
[|List<int>|] a = new List<int>();
}
}
""",
"""
class Class
{
void Goo()
{
System.Collections.Generic.List<int> a = new List<int>();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenericItemType(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using System.Collections.Generic;
class Class
{
List<[|Int32|]> l;
}
""",
"""
using System.Collections.Generic;
class Class
{
List<System.Int32> l;
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenerateWithExistingUsings(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using System;
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
""",
"""
using System;
class Class
{
System.Collections.Generic.List<int> Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenerateInNamespace(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace N
{
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
}
""",
"""
namespace N
{
class Class
{
System.Collections.Generic.List<int> Method()
{
Goo();
}
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenerateInNamespaceWithUsings(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace N
{
using System;
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
}
""",
"""
namespace N
{
using System;
class Class
{
System.Collections.Generic.List<int> Method()
{
Goo();
}
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public async Task TestExistingUsing(TestHost testHost)
{
await TestActionCountAsync(
"""
using System.Collections.Generic;
class Class
{
[|IDictionary|] Method()
{
Goo();
}
}
""",
count: 1, new TestParameters(testHost: testHost));
await TestInRegularAndScriptAsync(
"""
using System.Collections.Generic;
class Class
{
[|IDictionary|] Method()
{
Goo();
}
}
""",
"""
using System.Collections.Generic;
class Class
{
System.Collections.IDictionary Method()
{
Goo();
}
}
""", testHost: testHost);
}
[Theory, CombinatorialData]
public Task TestMissingIfUniquelyBound(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System;
class Class
{
[|String|] Method()
{
Goo();
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestMissingIfUniquelyBoundGeneric(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System.Collections.Generic;
class Class
{
[|List<int>|] Method()
{
Goo();
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestOnEnum(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Goo()
{
var a = [|Colors|].Red;
}
}
namespace A
{
enum Colors
{
Red,
Green,
Blue
}
}
""",
"""
class Class
{
void Goo()
{
var a = A.Colors.Red;
}
}
namespace A
{
enum Colors
{
Red,
Green,
Blue
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestOnClassInheritance(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class : [|Class2|]
{
}
namespace A
{
class Class2
{
}
}
""",
"""
class Class : A.Class2
{
}
namespace A
{
class Class2
{
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestOnImplementedInterface(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class : [|IGoo|]
{
}
namespace A
{
interface IGoo
{
}
}
""",
"""
class Class : A.IGoo
{
}
namespace A
{
interface IGoo
{
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public async Task TestAllInBaseList(TestHost testHost)
{
await TestInRegularAndScriptAsync(
"""
class Class : [|IGoo|], Class2
{
}
namespace A
{
class Class2
{
}
}
namespace B
{
interface IGoo
{
}
}
""",
"""
class Class : B.IGoo, Class2
{
}
namespace A
{
class Class2
{
}
}
namespace B
{
interface IGoo
{
}
}
""", testHost: testHost);
await TestInRegularAndScriptAsync(
"""
class Class : B.IGoo, [|Class2|]
{
}
namespace A
{
class Class2
{
}
}
namespace B
{
interface IGoo
{
}
}
""",
"""
class Class : B.IGoo, A.Class2
{
}
namespace A
{
class Class2
{
}
}
namespace B
{
interface IGoo
{
}
}
""", testHost: testHost);
}
[Theory, CombinatorialData]
public Task TestAttributeUnexpanded(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
[[|Obsolete|]]
class Class
{
}
""",
"""
[System.Obsolete]
class Class
{
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestAttributeExpanded(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
[[|ObsoleteAttribute|]]
class Class
{
}
""",
"""
[System.ObsoleteAttribute]
class Class
{
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527360")]
public Task TestExtensionMethods(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System.Collections.Generic;
class Goo
{
void Bar()
{
var values = new List<int>() { 1, 2, 3 };
values.[|Where|](i => i > 1);
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538018")]
public Task TestAfterNew(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Goo()
{
List<int> l;
l = new [|List<int>|]();
}
}
""",
"""
class Class
{
void Goo()
{
List<int> l;
l = new System.Collections.Generic.List<int>();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestArgumentsInMethodCall(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Test()
{
Console.WriteLine([|DateTime|].Today);
}
}
""",
"""
class Class
{
void Test()
{
Console.WriteLine(System.DateTime.Today);
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestCallSiteArgs(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Test([|DateTime|] dt)
{
}
}
""",
"""
class Class
{
void Test(System.DateTime dt)
{
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestUsePartialClass(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace A
{
public class Class
{
[|PClass|] c;
}
}
namespace B
{
public partial class PClass
{
}
}
""",
"""
namespace A
{
public class Class
{
B.PClass c;
}
}
namespace B
{
public partial class PClass
{
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestGenericClassInNestedNamespace(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace A
{
namespace B
{
class GenericClass<T>
{
}
}
}
namespace C
{
class Class
{
[|GenericClass<int>|] c;
}
}
""",
"""
namespace A
{
namespace B
{
class GenericClass<T>
{
}
}
}
namespace C
{
class Class
{
A.B.GenericClass<int> c;
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TestBeforeStaticMethod(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
void Test()
{
[|Math|].Sqrt();
}
""",
"""
class Class
{
void Test()
{
System.Math.Sqrt();
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538136")]
public Task TestBeforeNamespace(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace A
{
class Class
{
[|C|].Test t;
}
}
namespace B
{
namespace C
{
class Test
{
}
}
}
""",
"""
namespace A
{
class Class
{
B.C.Test t;
}
}
namespace B
{
namespace C
{
class Test
{
}
}
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527395")]
public Task TestSimpleNameWithLeadingTrivia(TestHost testHost)
=> TestInRegularAndScriptAsync(
@"class Class { void Test() { /*goo*/[|Int32|] i; } }",
@"class Class { void Test() { /*goo*/System.Int32 i; } }", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527395")]
public Task TestGenericNameWithLeadingTrivia(TestHost testHost)
=> TestInRegularAndScriptAsync(
@"class Class { void Test() { /*goo*/[|List<int>|] l; } }",
@"class Class { void Test() { /*goo*/System.Collections.Generic.List<int> l; } }", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538740")]
public Task TestFullyQualifyTypeName(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
public class Program
{
public class Inner
{
}
}
class Test
{
[|Inner|] i;
}
""",
"""
public class Program
{
public class Inner
{
}
}
class Test
{
Program.Inner i;
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/26887")]
public Task TestFullyQualifyUnboundIdentifier3(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
public class Program
{
public class Inner
{
}
}
class Test
{
public [|Inner|] Name
}
""",
"""
public class Program
{
public class Inner
{
}
}
class Test
{
public Program.Inner Name
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538740")]
public Task TestFullyQualifyTypeName_NotForGenericType(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
class Program<T>
{
public class Inner
{
}
}
class Test
{
[|Inner|] i;
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538764")]
public Task TestFullyQualifyThroughAlias(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using Alias = System;
class C
{
[|Int32|] i;
}
""",
"""
using Alias = System;
class C
{
Alias.Int32 i;
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538763")]
public Task TestFullyQualifyPrioritizeTypesOverNamespaces1(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace Outer
{
namespace C
{
class C
{
}
}
}
class Test
{
[|C|] c;
}
""",
"""
namespace Outer
{
namespace C
{
class C
{
}
}
}
class Test
{
Outer.C.C c;
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538763")]
public Task TestFullyQualifyPrioritizeTypesOverNamespaces2(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
namespace Outer
{
namespace C
{
class C
{
}
}
}
class Test
{
[|C|] c;
}
""",
"""
namespace Outer
{
namespace C
{
class C
{
}
}
}
class Test
{
Outer.C c;
}
""",
index: 1, testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539853")]
public Task BugFix5950(TestHost testHost)
=> TestAsync(
@"using System.Console; WriteLine([|Expression|].Constant(123));",
@"using System.Console; WriteLine(System.Linq.Expressions.Expression.Constant(123));",
parseOptions: GetScriptOptions(), testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540318")]
public Task TestAfterAlias(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
System::[|Console|] :: WriteLine("TEST");
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540942")]
public Task TestMissingOnIncompleteStatement(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System;
using System.IO;
class C
{
static void Main(string[] args)
{
[|Path|] }
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542643")]
public Task TestAssemblyAttribute(TestHost testHost)
=> TestInRegularAndScriptAsync(
@"[assembly: [|InternalsVisibleTo|](""Project"")]",
@"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""Project"")]", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543388")]
public Task TestMissingOnAliasName(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using [|GIBBERISH|] = Goo.GIBBERISH;
class Program
{
static void Main(string[] args)
{
GIBBERISH x;
}
}
namespace Goo
{
public class GIBBERISH
{
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData]
public Task TestMissingOnAttributeOverloadResolutionError(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System.Runtime.InteropServices;
class M
{
[[|DllImport|]()]
static extern int? My();
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544950")]
public Task TestNotOnAbstractConstructor(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System.IO;
class Program
{
static void Main(string[] args)
{
var s = new [|Stream|]();
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545774")]
public Task TestAttributeCount(TestHost testHost)
=> TestActionCountAsync(@"[ assembly : [|Guid|] ( ""9ed54f84-a89d-4fcd-a854-44251e925f09"" ) ] ", 2, new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545774")]
public Task TestAttribute(TestHost testHost)
=> TestInRegularAndScriptAsync(
@"[ assembly : [|Guid|] ( ""9ed54f84-a89d-4fcd-a854-44251e925f09"" ) ] ",
@"[ assembly : System.Runtime.InteropServices.Guid ( ""9ed54f84-a89d-4fcd-a854-44251e925f09"" ) ] ", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546027")]
public Task TestGeneratePropertyFromAttribute(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System;
[AttributeUsage(AttributeTargets.Class)]
class MyAttrAttribute : Attribute
{
}
[MyAttr(123, [|Version|] = 1)]
class D
{
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/775448")]
public Task ShouldTriggerOnCS0308(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using System.Collections;
class Test
{
static void Main(string[] args)
{
[|IEnumerable<int>|] f;
}
}
""",
"""
using System.Collections;
class Test
{
static void Main(string[] args)
{
System.Collections.Generic.IEnumerable<int> f;
}
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/947579")]
public Task AmbiguousTypeFix(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using n1;
using n2;
class B
{
void M1()
{
[|var a = new A();|]
}
}
namespace n1
{
class A
{
}
}
namespace n2
{
class A
{
}
}
""",
"""
using n1;
using n2;
class B
{
void M1()
{
var a = new n1.A();
}
}
namespace n1
{
class A
{
}
}
namespace n2
{
class A
{
}
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/995857")]
public async Task NonPublicNamespaces(TestHost testHost)
{
await TestInRegularAndScriptAsync(
"""
namespace MS.Internal.Xaml
{
private class A
{
}
}
namespace System.Xaml
{
public class A
{
}
}
public class Program
{
static void M()
{
[|Xaml|]
}
}
""",
"""
namespace MS.Internal.Xaml
{
private class A
{
}
}
namespace System.Xaml
{
public class A
{
}
}
public class Program
{
static void M()
{
System.Xaml
}
}
""", testHost: testHost);
await TestInRegularAndScriptAsync(
"""
namespace MS.Internal.Xaml
{
public class A
{
}
}
namespace System.Xaml
{
public class A
{
}
}
public class Program
{
static void M()
{
[|Xaml|]
}
}
""",
"""
namespace MS.Internal.Xaml
{
public class A
{
}
}
namespace System.Xaml
{
public class A
{
}
}
public class Program
{
static void M()
{
MS.Internal.Xaml
}
}
""", index: 1, testHost: testHost);
}
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/11071")]
public Task AmbiguousFixOrdering(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using n1;
using n2;
[[|Inner|].C]
class B
{
}
namespace n1
{
namespace Inner
{
}
}
namespace n2
{
namespace Inner
{
class CAttribute
{
}
}
}
""",
"""
using n1;
using n2;
[n2.Inner.C]
class B
{
}
namespace n1
{
namespace Inner
{
}
}
namespace n2
{
namespace Inner
{
class CAttribute
{
}
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TupleTest(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
([|IDictionary|], string) Method()
{
Goo();
}
}
""",
"""
class Class
{
(System.Collections.IDictionary, string) Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData]
public Task TupleWithOneName(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
class Class
{
([|IDictionary|] a, string) Method()
{
Goo();
}
}
""",
"""
class Class
{
(System.Collections.IDictionary a, string) Method()
{
Goo();
}
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/18275")]
public Task TestContextualKeyword1(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
namespace N
{
class nameof
{
}
}
class C
{
void M()
{
[|nameof|]
}
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/18623")]
public Task TestDoNotQualifyToTheSameTypeToFixWrongArity(TestHost testHost)
=> TestMissingInRegularAndScriptAsync(
"""
using System.Collections.Generic;
class Program : [|IReadOnlyCollection|]
{
}
""", new TestParameters(testHost: testHost));
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/19575")]
public async Task TestNoNonGenericsWithGenericCodeParsedAsExpression(TestHost testHost)
{
var code = """
class C
{
private void GetEvaluationRuleNames()
{
[|IEnumerable|] < Int32 >
return ImmutableArray.CreateRange();
}
}
""";
await TestActionCountAsync(code, count: 1, new TestParameters(testHost: testHost));
await TestInRegularAndScriptAsync(
code,
"""
class C
{
private void GetEvaluationRuleNames()
{
System.Collections.Generic.IEnumerable < Int32 >
return ImmutableArray.CreateRange();
}
}
""", testHost: testHost);
}
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/49986")]
public Task TestInUsingContext_Type(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using [|Math|];
class Class
{
void Test()
{
Sqrt(1);
}
""",
"""
using static System.Math;
class Class
{
void Test()
{
Sqrt(1);
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/49986")]
public Task TestInUsingContext_Namespace(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using [|Collections|];
class Class
{
void Test()
{
Sqrt(1);
}
""",
"""
using System.Collections;
class Class
{
void Test()
{
Sqrt(1);
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/49986")]
public Task TestInUsingContext_UsingStatic(TestHost testHost)
=> TestInRegularAndScriptAsync(
"""
using static [|Math|];
class Class
{
void Test()
{
Sqrt(1);
}
""",
"""
using static System.Math;
class Class
{
void Test()
{
Sqrt(1);
}
""", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/51274")]
public Task TestInUsingContext_UsingAlias(TestHost testHost)
=> TestInRegularAndScriptAsync(
@"using M = [|Math|]",
@"using M = System.Math", testHost: testHost);
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/54544")]
public async Task TestAddUsingsEditorBrowsableNeverSameProject(TestHost testHost)
{
const string InitialWorkspace = """
<Workspace>
<Project Language="C#" AssemblyName="lib" CommonReferences="true">
<Document FilePath="lib.cs">using System.ComponentModel;
namespace ProjectLib
{
[EditorBrowsable(EditorBrowsableState.Never)]
public class Project
{
}
}</Document>
<Document FilePath="Program.cs">class Program
{
static void Main(string[] args)
{
Project p = new [|Project()|];
}
}</Document>
</Project>
</Workspace>
""";
const string ExpectedDocumentText = """
class Program
{
static void Main(string[] args)
{
Project p = new [|ProjectLib.Project()|];
}
}
""";
await TestInRegularAndScript1Async(InitialWorkspace, ExpectedDocumentText, new TestParameters(testHost: testHost));
}
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/54544")]
public async Task TestAddUsingsEditorBrowsableNeverDifferentProject(TestHost testHost)
{
const string InitialWorkspace = """
<Workspace>
<Project Language="Visual Basic" AssemblyName="lib" CommonReferences="true">
<Document FilePath="lib.vb">
imports System.ComponentModel
namespace ProjectLib
<EditorBrowsable(EditorBrowsableState.Never)>
public class Project
end class
end namespace
</Document>
</Project>
<Project Language="C#" AssemblyName="Console" CommonReferences="true">
<ProjectReference>lib</ProjectReference>
<Document FilePath="Program.cs">
class Program
{
static void Main(string[] args)
{
[|Project|] p = new Project();
}
}
</Document>
</Project>
</Workspace>
""";
await TestMissingAsync(InitialWorkspace, new TestParameters(testHost: testHost));
}
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/54544")]
public async Task TestAddUsingsEditorBrowsableAdvancedDifferentProjectOptionOn(TestHost testHost)
{
const string InitialWorkspace = """
<Workspace>
<Project Language="Visual Basic" AssemblyName="lib" CommonReferences="true">
<Document FilePath="lib.vb">
imports System.ComponentModel
namespace ProjectLib
<EditorBrowsable(EditorBrowsableState.Advanced)>
public class Project
end class
end namespace
</Document>
</Project>
<Project Language="C#" AssemblyName="Console" CommonReferences="true">
<ProjectReference>lib</ProjectReference>
<Document FilePath="Program.cs">class Program
{
static void Main(string[] args)
{
[|Project|] p = new Project();
}
}</Document>
</Project>
</Workspace>
""";
const string ExpectedDocumentText = """
class Program
{
static void Main(string[] args)
{
ProjectLib.Project p = new Project();
}
}
""";
await TestInRegularAndScript1Async(InitialWorkspace, ExpectedDocumentText, new TestParameters(testHost: testHost));
}
[Theory, CombinatorialData, WorkItem("https://github.com/dotnet/roslyn/issues/54544")]
public Task TestAddUsingsEditorBrowsableAdvancedDifferentProjectOptionOff(TestHost testHost)
=> TestMissingAsync("""
<Workspace>
<Project Language="Visual Basic" AssemblyName="lib" CommonReferences="true">
<Document FilePath="lib.vb">
imports System.ComponentModel
namespace ProjectLib
<EditorBrowsable(EditorBrowsableState.Advanced)>
public class Project
end class
end namespace
</Document>
</Project>
<Project Language="C#" AssemblyName="Console" CommonReferences="true">
<ProjectReference>lib</ProjectReference>
<Document FilePath="Program.cs">
class Program
{
static void Main(string[] args)
{
[|Project|] p = new Project();
}
}
</Document>
</Project>
</Workspace>
""", new TestParameters(
options: Option(MemberDisplayOptionsStorage.HideAdvancedMembers, true),
testHost: testHost));
}
|