From 1478c7ba1067aff4ba0ac7bcfd38db58405166e9 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 2 Dec 2015 14:51:04 -0800 Subject: [PATCH] Don't trigger Add-Using on an identifier being missing --- .../Diagnostics/AddUsing/AddUsingTests.cs | 60 +++++++++---------- .../CSharpAddImportCodeFixProvider.cs | 7 --- ...nboundIdentifiersDiagnosticAnalyzerBase.cs | 18 +++++- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/AddUsing/AddUsingTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/AddUsing/AddUsingTests.cs index 65f62475a23..ce06ec16458 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/AddUsing/AddUsingTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/AddUsing/AddUsingTests.cs @@ -881,35 +881,6 @@ public async Task TestConflictedGenericName() @"using System.Threading.Tasks; using Task = System.AccessViolationException; class X { Task x; }"); } - [WorkItem(860648)] - [WorkItem(902014)] - [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsAddUsing)] - public async Task TestIncompleteSimpleLambdaExpression() - { - await TestAsync( -@"using System.Linq; - -class Program -{ - static void Main(string[] args) - { - [|args[0].Any(x => IBindCtx|] - string a; - } -}", -@"using System.Linq; -using System.Runtime.InteropServices.ComTypes; - -class Program -{ - static void Main(string[] args) - { - args[0].Any(x => IBindCtx - string a; - } -}"); - } - [WorkItem(913300)] [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsAddUsing)] public async Task TestNoDuplicateReport() @@ -2168,8 +2139,37 @@ void Foo() Action a = () => { IBindCtx }; string a; } +}"); + } + + [WorkItem(860648)] + [WorkItem(902014)] + [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsAddUsing)] + public async Task TestIncompleteSimpleLambdaExpression() + { + await TestAsync( + @"using System.Linq; + +class Program +{ + static void Main(string[] args) + { + args[0].Any(x => [|IBindCtx|] + string a; + } +}", + @"using System.Linq; +using System.Runtime.InteropServices.ComTypes; + +class Program +{ + static void Main(string[] args) + { + args[0].Any(x => IBindCtx + string a; + } }"); } } } -} +} \ No newline at end of file diff --git a/src/Features/CSharp/Portable/CodeFixes/AddImport/CSharpAddImportCodeFixProvider.cs b/src/Features/CSharp/Portable/CodeFixes/AddImport/CSharpAddImportCodeFixProvider.cs index 27cfc2b3aea..239166a3fb9 100644 --- a/src/Features/CSharp/Portable/CodeFixes/AddImport/CSharpAddImportCodeFixProvider.cs +++ b/src/Features/CSharp/Portable/CodeFixes/AddImport/CSharpAddImportCodeFixProvider.cs @@ -72,11 +72,6 @@ internal class CSharpAddImportCodeFixProvider : AbstractAddImportCodeFixProvider /// private const string CS0616 = "CS0616"; - /// - /// Syntax error, 'A' expected - /// - private const string CS1003 = "CS1003"; - /// /// No overload for method 'X' takes 'N' arguments /// @@ -126,7 +121,6 @@ public override ImmutableArray FixableDiagnosticIds CS0122, CS0307, CS0616, - CS1003, CS1501, CS1503, CS1574, @@ -264,7 +258,6 @@ protected override bool CanAddImportForType(Diagnostic diagnostic, ref SyntaxNod case CS0122: case CS0307: case CS0616: - case CS1003: case CS1580: case CS1581: break; diff --git a/src/Features/Core/Portable/Diagnostics/Analyzers/UnboundIdentifiersDiagnosticAnalyzerBase.cs b/src/Features/Core/Portable/Diagnostics/Analyzers/UnboundIdentifiersDiagnosticAnalyzerBase.cs index 6981dd683f5..9eb3a809d21 100644 --- a/src/Features/Core/Portable/Diagnostics/Analyzers/UnboundIdentifiersDiagnosticAnalyzerBase.cs +++ b/src/Features/Core/Portable/Diagnostics/Analyzers/UnboundIdentifiersDiagnosticAnalyzerBase.cs @@ -45,12 +45,28 @@ protected DiagnosticDescriptor GetDiagnosticDescriptor(string id, LocalizableStr private void AnalyzeNode(SyntaxNodeAnalysisContext context) { - if ((context.Node is TLambdaExpressionSyntax && context.Node.ContainsDiagnostics) || context.Node is TIncompleteMemberSyntax) + if (IsBrokenLambda(context) || context.Node is TIncompleteMemberSyntax) { ReportUnboundIdentifierNames(context, context.Node); } } + private static bool IsBrokenLambda(SyntaxNodeAnalysisContext context) + { + if (context.Node is TLambdaExpressionSyntax) + { + if (context.Node.ContainsDiagnostics) + { + return true; + } + + var lastToken = context.Node.GetLastToken(); + return lastToken.GetNextToken(includeZeroWidth: true).IsMissing; + } + + return false; + } + private void ReportUnboundIdentifierNames(SyntaxNodeAnalysisContext context, SyntaxNode member) { Func isQualifiedOrSimpleName = (SyntaxNode n) => n is TQualifiedNameSyntax || n is TSimpleNameSyntax; -- GitLab