diff --git a/src/EditorFeatures/CSharpTest/UseObjectInitializer/UseObjectInitializerTests.cs b/src/EditorFeatures/CSharpTest/UseObjectInitializer/UseObjectInitializerTests.cs index c6990f29eefeb6d112aa3d68081321ce33e48f15..8ab5cac491f544c4e5bf397fb21676e21dce1d03 100644 --- a/src/EditorFeatures/CSharpTest/UseObjectInitializer/UseObjectInitializerTests.cs +++ b/src/EditorFeatures/CSharpTest/UseObjectInitializer/UseObjectInitializerTests.cs @@ -3,6 +3,7 @@ using System; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.UseObjectInitializer; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics; @@ -193,6 +194,23 @@ void M() }"); } + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseObjectInitializer)] + public async Task TestMissingBeforeCSharp3() + { + await TestMissingAsync( +@" +class C +{ + int i; + int j; + void M() + { + var c = [||]new C(); + c.j = 1; + } +}", parseOptions: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp2)); + } + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseObjectInitializer)] public async Task TestFixAllInDocument() { diff --git a/src/Features/CSharp/Portable/UseObjectInitializer/CSharpUseObjectInitializerDiagnosticAnalyzer.cs b/src/Features/CSharp/Portable/UseObjectInitializer/CSharpUseObjectInitializerDiagnosticAnalyzer.cs index ebd19333c6b5bd95200de04b4b30b889e6645e55..0826cb3b849914813be99a64303ee7f61d1187df 100644 --- a/src/Features/CSharp/Portable/UseObjectInitializer/CSharpUseObjectInitializerDiagnosticAnalyzer.cs +++ b/src/Features/CSharp/Portable/UseObjectInitializer/CSharpUseObjectInitializerDiagnosticAnalyzer.cs @@ -21,6 +21,13 @@ internal class CSharpUseObjectInitializerDiagnosticAnalyzer : { protected override bool FadeOutOperatorToken => true; + protected override bool AreObjectInitializersSupported(SyntaxNodeAnalysisContext context) + { + // object initializers are only available in C# 3.0 and above. Don't offer this refactoring + // in projects targeting a lesser version. + return ((CSharpParseOptions)context.Node.SyntaxTree.Options).LanguageVersion >= LanguageVersion.CSharp3; + } + protected override SyntaxKind GetObjectCreationSyntaxKind() => SyntaxKind.ObjectCreationExpression; protected override ISyntaxFactsService GetSyntaxFactsService() => CSharpSyntaxFactsService.Instance; diff --git a/src/Features/Core/Portable/UseObjectInitializer/AbstractUseObjectInitializerDiagnosticAnalyzer.cs b/src/Features/Core/Portable/UseObjectInitializer/AbstractUseObjectInitializerDiagnosticAnalyzer.cs index ef028af4b6ca4dac6641a8dd54e415fe29920e68..90bdace587b59a0fa25f7db693f3294b166ec2b4 100644 --- a/src/Features/Core/Portable/UseObjectInitializer/AbstractUseObjectInitializerDiagnosticAnalyzer.cs +++ b/src/Features/Core/Portable/UseObjectInitializer/AbstractUseObjectInitializerDiagnosticAnalyzer.cs @@ -44,8 +44,15 @@ public override void Initialize(AnalysisContext context) protected abstract TSyntaxKind GetObjectCreationSyntaxKind(); + protected abstract bool AreObjectInitializersSupported(SyntaxNodeAnalysisContext context); + private void AnalyzeNode(SyntaxNodeAnalysisContext context) { + if (!AreObjectInitializersSupported(context)) + { + return; + } + var objectCreationExpression = (TObjectCreationExpressionSyntax)context.Node; var language = objectCreationExpression.Language; diff --git a/src/Features/VisualBasic/Portable/UseObjectInitializer/VisualBasicUseObjectInitializerDiagnosticAnalyzer.vb b/src/Features/VisualBasic/Portable/UseObjectInitializer/VisualBasicUseObjectInitializerDiagnosticAnalyzer.vb index d8b1708830f7a6d93ddd67dff927fb288694d739..72ff5a89e91ede83000603ab952e8a8b56005b1c 100644 --- a/src/Features/VisualBasic/Portable/UseObjectInitializer/VisualBasicUseObjectInitializerDiagnosticAnalyzer.vb +++ b/src/Features/VisualBasic/Portable/UseObjectInitializer/VisualBasicUseObjectInitializerDiagnosticAnalyzer.vb @@ -23,6 +23,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseObjectInitializer End Get End Property + Protected Overrides Function AreObjectInitializersSupported(context As SyntaxNodeAnalysisContext) As Boolean + 'Object Initializers are supported in all the versions of Visual Basic we support + Return True + End Function + Protected Overrides Function GetObjectCreationSyntaxKind() As SyntaxKind Return SyntaxKind.ObjectCreationExpression End Function