diff --git a/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs b/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs index 950858b7ecf50..70794fc899333 100644 --- a/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs +++ b/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System.Diagnostics; -using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax { @@ -451,8 +450,9 @@ private bool ConvertTypeToExpression(TypeSyntax type, out ExpressionSyntax expr, expr = s; return true; case QualifiedNameSyntax { Left: var left, dotToken: var dotToken, Right: var right } - when (permitTypeArguments || !(right is GenericNameSyntax)) && ConvertTypeToExpression(left, out var leftExpr, permitTypeArguments: true): - expr = _syntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, leftExpr, dotToken, right); + when (permitTypeArguments || !(right is GenericNameSyntax)): + var newLeft = ConvertTypeToExpression(left, out var leftExpr, permitTypeArguments: true) ? leftExpr : left; + expr = _syntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, newLeft, dotToken, right); return true; default: return false; diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/PatternMatchingTests4.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/PatternMatchingTests4.cs index f0049ed6485ec..bcfb2a884f04f 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/PatternMatchingTests4.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/PatternMatchingTests4.cs @@ -3340,5 +3340,32 @@ static void M(object o, bool c) Diagnostic(ErrorCode.ERR_AsNullableType, "A[][]?").WithArguments("A[][]").WithLocation(16, 18) ); } + + [Fact, WorkItem(43960, "https://github.com/dotnet/roslyn/issues/43960")] + public void NamespaceQualifiedEnumConstantInSwitchCase() + { + var source = +@"enum E +{ + A, B, C +} + +class Class1 +{ + void M(E e) + { + switch (e) + { + case global::E.A: break; + case global::E.B: break; + case global::E.C: break; + } + } +}"; + CreateCompilation(source, parseOptions: TestOptions.Regular7, options: TestOptions.ReleaseDll).VerifyDiagnostics( + ); + CreatePatternCompilation(source, options: TestOptions.ReleaseDll).VerifyDiagnostics( + ); + } } } diff --git a/src/Compilers/CSharp/Test/Syntax/Parsing/PatternParsingTests.cs b/src/Compilers/CSharp/Test/Syntax/Parsing/PatternParsingTests.cs index 22f2346a22e2d..3355b5ccaec0a 100644 --- a/src/Compilers/CSharp/Test/Syntax/Parsing/PatternParsingTests.cs +++ b/src/Compilers/CSharp/Test/Syntax/Parsing/PatternParsingTests.cs @@ -10942,5 +10942,69 @@ public void OrPatternAssociativity_01() } EOF(); } + + [Fact, WorkItem(43960, "https://github.com/dotnet/roslyn/issues/43960")] + public void NamespaceQualifiedEnumConstantInSwitchCase() + { + var source = @"switch (e) { case global::E.A: break; }"; + UsingStatement(source, + TestOptions.RegularWithPatternCombinators + ); + verifyTree(); + UsingStatement(source, + TestOptions.RegularWithoutPatternCombinators + ); + verifyTree(); + + void verifyTree() + { + N(SyntaxKind.SwitchStatement); + { + N(SyntaxKind.SwitchKeyword); + N(SyntaxKind.OpenParenToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "e"); + } + N(SyntaxKind.CloseParenToken); + N(SyntaxKind.OpenBraceToken); + N(SyntaxKind.SwitchSection); + { + N(SyntaxKind.CaseSwitchLabel); + { + N(SyntaxKind.CaseKeyword); + N(SyntaxKind.SimpleMemberAccessExpression); + { + N(SyntaxKind.AliasQualifiedName); + { + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.GlobalKeyword); + } + N(SyntaxKind.ColonColonToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "E"); + } + } + N(SyntaxKind.DotToken); + N(SyntaxKind.IdentifierName); + { + N(SyntaxKind.IdentifierToken, "A"); + } + } + N(SyntaxKind.ColonToken); + } + N(SyntaxKind.BreakStatement); + { + N(SyntaxKind.BreakKeyword); + N(SyntaxKind.SemicolonToken); + } + } + N(SyntaxKind.CloseBraceToken); + } + EOF(); + } + } } }