diff --git a/src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs b/src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs index 6bf26ef17ab71..9a7a7682ea0c7 100644 --- a/src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs +++ b/src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs @@ -1608,13 +1608,13 @@ internal static string GetStatementDisplayNameImpl(SyntaxNode node) return CSharpFeaturesResources.deconstruction; case SyntaxKind.SimpleAssignmentExpression: - if (IsDeconstruction((AssignmentExpressionSyntax)node)) + if (((AssignmentExpressionSyntax)node).IsDeconstruction()) { return CSharpFeaturesResources.deconstruction; } else { - goto default; + throw ExceptionUtilities.UnexpectedValue(node.Kind()); } case SyntaxKind.TupleType: @@ -3119,18 +3119,12 @@ private static bool IsUnsupportedCSharp7EnCNode(SyntaxNode n) case SyntaxKind.DeclarationPattern: return true; case SyntaxKind.SimpleAssignmentExpression: - return IsDeconstruction((AssignmentExpressionSyntax)n); + return ((AssignmentExpressionSyntax)n).IsDeconstruction(); default: return false; } } - private static bool IsDeconstruction(AssignmentExpressionSyntax assignment) - { - return assignment.Left.Kind() == SyntaxKind.TupleExpression || - assignment.Left.Kind() == SyntaxKind.DeclarationExpression; - } - private void ReportRudeEditsForCheckedStatements( List diagnostics, SyntaxNode oldActiveStatement, diff --git a/src/VisualStudio/CSharp/Impl/Debugging/CSharpProximityExpressionsService.RelevantExpressionsCollector.cs b/src/VisualStudio/CSharp/Impl/Debugging/CSharpProximityExpressionsService.RelevantExpressionsCollector.cs index f52cde4ce8696..acf6f98f485d5 100644 --- a/src/VisualStudio/CSharp/Impl/Debugging/CSharpProximityExpressionsService.RelevantExpressionsCollector.cs +++ b/src/VisualStudio/CSharp/Impl/Debugging/CSharpProximityExpressionsService.RelevantExpressionsCollector.cs @@ -135,7 +135,11 @@ public override void VisitSwitchStatement(SwitchStatementSyntax node) case SyntaxKind.TupleExpression: { var t = (TupleExpressionSyntax)component; - foreach (ArgumentSyntax a in t.Arguments) AddVariableExpressions(a.Expression, expressions); + foreach (ArgumentSyntax a in t.Arguments) + { + AddVariableExpressions(a.Expression, expressions); + } + break; } case SyntaxKind.DeclarationExpression: diff --git a/src/Workspaces/CSharp/Portable/CSharpWorkspace.csproj b/src/Workspaces/CSharp/Portable/CSharpWorkspace.csproj index a5e23d9d30768..8efaa424b2f5b 100644 --- a/src/Workspaces/CSharp/Portable/CSharpWorkspace.csproj +++ b/src/Workspaces/CSharp/Portable/CSharpWorkspace.csproj @@ -95,6 +95,7 @@ + diff --git a/src/Workspaces/CSharp/Portable/Extensions/AssignmentExpressionSyntaxExtensions.cs b/src/Workspaces/CSharp/Portable/Extensions/AssignmentExpressionSyntaxExtensions.cs new file mode 100644 index 0000000000000..c22ec4cf86c2e --- /dev/null +++ b/src/Workspaces/CSharp/Portable/Extensions/AssignmentExpressionSyntaxExtensions.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Linq; +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Symbols; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Shared.Extensions; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.CSharp.Extensions +{ + internal static class AssignmentExpressionSyntaxExtensions + { + internal static bool IsDeconstruction(this AssignmentExpressionSyntax assignment) + { + var left = assignment.Left; + return assignment.Kind() == SyntaxKind.SimpleAssignmentExpression && + assignment.OperatorToken.Kind() == SyntaxKind.EqualsToken && + (left.Kind() == SyntaxKind.TupleExpression || left.Kind() == SyntaxKind.DeclarationExpression); + } + } +} diff --git a/src/Workspaces/CSharp/Portable/Extensions/SemanticModelExtensions.cs b/src/Workspaces/CSharp/Portable/Extensions/SemanticModelExtensions.cs index d7f7df570feda..c9005c2cbb1bd 100644 --- a/src/Workspaces/CSharp/Portable/Extensions/SemanticModelExtensions.cs +++ b/src/Workspaces/CSharp/Portable/Extensions/SemanticModelExtensions.cs @@ -236,7 +236,11 @@ private static bool CanBindToken(SyntaxToken token) { var decl = (DeclarationExpressionSyntax)current; var name = decl.Designation as SingleVariableDesignationSyntax; - if (name == null) break; + if (name == null) + { + break; + } + return name.Identifier.ValueText.ToCamelCase(); } else diff --git a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpTypeInferenceService.TypeInferrer.cs b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpTypeInferenceService.TypeInferrer.cs index 9f3adf5152a86..8c9dea1c71dc1 100644 --- a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpTypeInferenceService.TypeInferrer.cs +++ b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpTypeInferenceService.TypeInferrer.cs @@ -875,9 +875,9 @@ private IEnumerable InferTypeInBinaryOrAssignmentExpression(E return SpecializedCollections.SingletonEnumerable(new TypeInferenceInfo(this.Compilation.GetSpecialType(SpecialType.System_Boolean))); } - // Infer type for deconstruction declaration - if (operatorToken.Kind() == SyntaxKind.EqualsToken && - (left.Kind() == SyntaxKind.TupleExpression || left.Kind() == SyntaxKind.DeclarationExpression)) + // Infer type for deconstruction + if (binop.Kind() == SyntaxKind.SimpleAssignmentExpression && + ((AssignmentExpressionSyntax)binop).IsDeconstruction()) { return InferTypeInVariableComponentAssignment(left); }