提交 bc2d970a 编写于 作者: B Balaji Krishnan

Introduce severity options for Predefined or Framework type codestyle

and plumb them through the UI, persistence, analyzer/fixer and
other parts of the system. update the simplifier to use the new options.
update codegen features as necessary.
上级 39018ca2
......@@ -889,7 +889,7 @@ public T(System.Int32 i)
}",
index: 1,
compareTokens: false,
options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
#endregion
......
......@@ -2890,7 +2890,7 @@ class C
public void z()
{
}
}", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, "C#"), false } });
}", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -2916,7 +2916,7 @@ class C
public void z()
{
}
}", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
}", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -2933,7 +2933,7 @@ class C
public void z()
{
}
}", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, "C#"), false } });
}", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, false, NotificationOption.Error));
}
[WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")]
......@@ -2959,7 +2959,7 @@ public void z()
{
}
}",
options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")]
......@@ -2974,7 +2974,7 @@ class C
public void z()
{
}
}", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, "C#"), false } });
}", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, false, NotificationOption.Error));
}
[WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")]
......@@ -2998,7 +2998,7 @@ public void z()
{
}
}",
options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -3015,7 +3015,7 @@ public void z(System.Int32 y)
System.Int32 z = 9;
}
}
", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -3032,7 +3032,7 @@ public void z([|System.Int32|] y)
System.Int32 z = 9;
}
}
", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -3049,7 +3049,7 @@ public void z(System.Int32 y)
[|System.Int32|] z = 9;
}
}
", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, "C#"), false } });
", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -3133,7 +3133,7 @@ public void z()
var sss = [|Int32|].MaxValue;
}
}
", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, "C#"), false } });
", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, false, NotificationOption.Error));
}
[WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")]
......@@ -3149,7 +3149,7 @@ public void z()
var sss = [|System.Int32|].MaxValue;
}
}
", options: new Dictionary<OptionKey, object> { { new OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, "C#"), false } });
", options: Option(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, false, NotificationOption.Error));
}
[WorkItem(965208, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/965208")]
......
......@@ -5846,7 +5846,7 @@ End Class
Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyPropertyAccess, languageName), New CodeStyleOption(Of Boolean)(True, notification)}}
End Function
Shared DontPreferIntrinsicPredefinedTypeKeywordInDeclaration As Dictionary(Of OptionKey, Object) = New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}}
Shared DontPreferIntrinsicPredefinedTypeKeywordInDeclaration As Dictionary(Of OptionKey, Object) = New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), CodeStyleOption(Of Boolean).Default}}
#End Region
......
......@@ -3,6 +3,7 @@
Option Strict Off
Imports Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.CodeStyle
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Options
......@@ -649,7 +650,7 @@ End Class
</text>.NormalizedValue,
index:=1,
compareTokens:=False,
options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(869506, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/869506")>
......
......@@ -1399,7 +1399,7 @@ Class Program
End Sub
End Class
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")>
......@@ -1414,7 +1414,7 @@ Class Program
End Sub
End Class
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")>
......@@ -1429,7 +1429,7 @@ Class Program
End Sub
End Class
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")>
......@@ -1512,7 +1512,7 @@ Module Program
End Sub
End Module
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, False, NotificationOption.Error))
End Function
<WorkItem(942568, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/942568")>
......@@ -1527,7 +1527,7 @@ Module Program
End Sub
End Module
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, False, NotificationOption.Error))
End Function
<WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")>
......@@ -1540,7 +1540,7 @@ Module Program
End Module
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, False, NotificationOption.Error))
End Function
<WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")>
......@@ -1560,7 +1560,7 @@ Module Program
End Module
</Code>
Await TestAsync(source.Value, expected.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
Await TestAsync(source.Value, expected.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")>
......@@ -1573,7 +1573,7 @@ Module Program
End Module
</Code>
Await TestMissingAsync(source.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.VisualBasic), False}})
Await TestMissingAsync(source.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, False, NotificationOption.Error))
End Function
<WorkItem(954536, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954536")>
......@@ -1593,7 +1593,7 @@ Module Program
End Module
</Code>
Await TestAsync(source.Value, expected.Value, options:=New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}})
Await TestAsync(source.Value, expected.Value, options:=[Option](CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, False, NotificationOption.Error))
End Function
<WorkItem(965208, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/965208")>
......
......@@ -28,7 +28,9 @@ public sealed override ImmutableArray<string> FixableDiagnosticIds
return ImmutableArray.Create(
IDEDiagnosticIds.SimplifyNamesDiagnosticId,
IDEDiagnosticIds.SimplifyMemberAccessDiagnosticId,
IDEDiagnosticIds.RemoveQualificationDiagnosticId);
IDEDiagnosticIds.RemoveQualificationDiagnosticId,
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId,
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId);
}
}
......@@ -87,9 +89,11 @@ internal static string GetCodeActionId(string diagnosticId, string nodeText)
switch (diagnosticId)
{
case IDEDiagnosticIds.SimplifyNamesDiagnosticId:
case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId:
return string.Format(CSharpFeaturesResources.Simplify_name_0, nodeText);
case IDEDiagnosticIds.SimplifyMemberAccessDiagnosticId:
case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId:
return string.Format(CSharpFeaturesResources.Simplify_member_access_0, nodeText);
case IDEDiagnosticIds.RemoveQualificationDiagnosticId:
......
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
......@@ -137,7 +139,16 @@ internal static bool CanSimplifyTypeNameExpression(SemanticModel model, SyntaxNo
return false;
}
if (expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
// set proper diagnostic ids.
if (replacementSyntax.HasAnnotations(nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)))
{
diagnosticId = IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId;
}
else if (replacementSyntax.HasAnnotations(nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)))
{
diagnosticId = IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId;
}
else if (expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
{
var memberAccess = (MemberAccessExpressionSyntax)expression;
diagnosticId = memberAccess.Expression.Kind() == SyntaxKind.ThisExpression ?
......
......@@ -15,6 +15,10 @@ internal static class IDEDiagnosticIds
public const string AddQualificationDiagnosticId = "IDE0009";
public const string PopulateSwitchDiagnosticId = "IDE0010";
public const string AddBracesDiagnosticId = "IDE0011";
public const string PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId = "IDE0012";
public const string PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId = "IDE0013";
public const string PreferFrameworkTypeInDeclarationsDiagnosticId = "IDE0014";
public const string PreferFrameworkTypeInMemberAccessDiagnosticId = "IDE0015";
// Analyzer error Ids
public const string AnalyzerChangedId = "IDE1001";
......
......@@ -2,6 +2,7 @@
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics.QualifyMemberAccess;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
......@@ -63,6 +64,22 @@ internal abstract class SimplifyTypeNamesDiagnosticAnalyzerBase<TLanguageKindEnu
isEnabledByDefault: true,
customTags: DiagnosticCustomTags.Unnecessary);
private static readonly DiagnosticDescriptor s_descriptorPreferIntrinsicTypeInDeclarations = new DiagnosticDescriptor(IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId,
s_localizableTitleSimplifyNames,
s_localizableMessage,
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: DiagnosticCustomTags.Unnecessary);
private static readonly DiagnosticDescriptor s_descriptorPreferIntrinsicTypeInMemberAccess = new DiagnosticDescriptor(IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId,
s_localizableTitleSimplifyNames,
s_localizableMessage,
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: DiagnosticCustomTags.Unnecessary);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
{
get
......@@ -73,7 +90,9 @@ public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
s_descriptorRemoveThisOrMeHidden,
s_descriptorRemoveThisOrMeInfo,
s_descriptorRemoveThisOrMeWarning,
s_descriptorRemoveThisOrMeError);
s_descriptorRemoveThisOrMeError,
s_descriptorPreferIntrinsicTypeInDeclarations,
s_descriptorPreferIntrinsicTypeInMemberAccess);
}
}
......@@ -103,6 +122,7 @@ protected bool TrySimplifyTypeNameExpression(SemanticModel model, SyntaxNode nod
return false;
}
PerLanguageOption<CodeStyleOption<bool>> option;
DiagnosticDescriptor descriptor;
switch (diagnosticId)
{
......@@ -118,6 +138,18 @@ protected bool TrySimplifyTypeNameExpression(SemanticModel model, SyntaxNode nod
descriptor = GetRemoveQualificationDiagnosticDescriptor(model, node, optionSet, cancellationToken);
break;
case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId:
option = CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration;
descriptor = GetApplicablePredefinedTypeDiagnosticDescriptor(
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId, option, optionSet);
break;
case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId:
option = CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess;
descriptor = GetApplicablePredefinedTypeDiagnosticDescriptor(
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId, option, optionSet);
break;
default:
throw ExceptionUtilities.Unreachable;
}
......@@ -129,12 +161,31 @@ protected bool TrySimplifyTypeNameExpression(SemanticModel model, SyntaxNode nod
var tree = model.SyntaxTree;
var builder = ImmutableDictionary.CreateBuilder<string, string>();
builder["OptionName"] = nameof(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess); // TODO: need the actual one
builder["OptionName"] = nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess); // TODO: need the actual one
builder["OptionLanguage"] = model.Language;
diagnostic = Diagnostic.Create(descriptor, tree.GetLocation(issueSpan), builder.ToImmutable());
return true;
}
private DiagnosticDescriptor GetApplicablePredefinedTypeDiagnosticDescriptor<T>(string id, PerLanguageOption<T> option, OptionSet optionSet) where T : CodeStyleOption<bool>
{
var optionValue = optionSet.GetOption(option, GetLanguageName());
DiagnosticDescriptor descriptor = null;
if (optionValue.Notification.Value != DiagnosticSeverity.Hidden)
{
descriptor = new DiagnosticDescriptor(id,
s_localizableTitleSimplifyNames,
s_localizableMessage,
DiagnosticCategory.Style,
optionValue.Notification.Value,
isEnabledByDefault: true,
customTags: DiagnosticCustomTags.Unnecessary);
}
return descriptor;
}
private DiagnosticDescriptor GetRemoveQualificationDiagnosticDescriptor(SemanticModel model, SyntaxNode node, OptionSet optionSet, CancellationToken cancellationToken)
{
var symbolInfo = model.GetSymbolInfo(node, cancellationToken);
......
......@@ -21,7 +21,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
Get
Return ImmutableArray.Create(IDEDiagnosticIds.SimplifyNamesDiagnosticId,
IDEDiagnosticIds.SimplifyMemberAccessDiagnosticId,
IDEDiagnosticIds.RemoveQualificationDiagnosticId)
IDEDiagnosticIds.RemoveQualificationDiagnosticId,
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId,
IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId)
End Get
End Property
......@@ -77,6 +79,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
Case IDEDiagnosticIds.RemoveQualificationDiagnosticId
Return VBFeaturesResources.Remove_Me_qualification
Case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId 'TODO use dedicated resource strings?
Return String.Format(VBFeaturesResources.Simplify_name_0, nodeText)
Case IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId
Return String.Format(VBFeaturesResources.Simplify_member_access_0, nodeText)
Case Else
Throw ExceptionUtilities.Unreachable
End Select
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Threading
Imports Microsoft.CodeAnalysis.CodeStyle
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Diagnostics.SimplifyTypeNames
Imports Microsoft.CodeAnalysis.Options
......@@ -33,7 +34,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
Dim descendIntoChildren As Func(Of SyntaxNode, Boolean) =
Function(n)
Dim diagnostic As diagnostic = Nothing
Dim diagnostic As Diagnostic = Nothing
If Not IsCandidate(n) OrElse
Not TrySimplifyTypeNameExpression(context.SemanticModel, n, context.Options, diagnostic, context.CancellationToken) Then
......@@ -75,7 +76,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.SimplifyTypeNames
Return False
End If
If expression.Kind = SyntaxKind.SimpleMemberAccessExpression Then
' set proper diagnostic ids.
If replacementSyntax.HasAnnotations(NameOf(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)) Then
diagnosticId = IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInDeclarationsDiagnosticId
ElseIf replacementSyntax.HasAnnotations(NameOf(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)) Then
diagnosticId = IDEDiagnosticIds.PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId
ElseIf expression.Kind = SyntaxKind.SimpleMemberAccessExpression Then
Dim memberAccess = DirectCast(expression, MemberAccessExpressionSyntax)
diagnosticId = If(memberAccess.Expression.Kind = SyntaxKind.MeExpression,
IDEDiagnosticIds.RemoveQualificationDiagnosticId,
......
......@@ -204,24 +204,6 @@ internal class CSharpVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to For locals, parameters and members.
/// </summary>
internal static string For_locals_parameters_and_members {
get {
return ResourceManager.GetString("For_locals_parameters_and_members", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to For member access expressions.
/// </summary>
internal static string For_member_access_expressions {
get {
return ResourceManager.GetString("For_member_access_expressions", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Generate XML documentation comments for ///.
/// </summary>
......
......@@ -312,12 +312,6 @@
<data name="Use_var_when_generating_locals" xml:space="preserve">
<value>Use 'var' when generating locals</value>
</data>
<data name="For_locals_parameters_and_members" xml:space="preserve">
<value>For locals, parameters and members</value>
</data>
<data name="For_member_access_expressions" xml:space="preserve">
<value>For member access expressions</value>
</data>
<data name="Move_local_declaration_to_the_extracted_method_if_it_is_not_used_elsewhere" xml:space="preserve">
<value>_Move local declaration to the extracted method if it is not used elsewhere</value>
</data>
......
......@@ -515,16 +515,16 @@ public int Space_WithinSquares
set { SetBooleanOption(CSharpFormattingOptions.SpaceWithinSquareBrackets, value); }
}
public int Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration
public string Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration
{
get { return GetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration); }
set { SetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, value); }
get { return GetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration); }
set { SetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, value); }
}
public int Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess
public string Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess
{
get { return GetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess); }
set { SetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value); }
get { return GetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess); }
set { SetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value); }
}
public string Style_NamingPreferences
......
......@@ -62,6 +62,8 @@ public CSharpSettingsManagerOptionSerializer(VisualStudioWorkspaceImpl workspace
private const string Style_UseImplicitTypeForIntrinsicTypes = nameof(AutomationObject.Style_UseImplicitTypeForIntrinsicTypes);
private const string Style_UseImplicitTypeWhereApparent = nameof(AutomationObject.Style_UseImplicitTypeWhereApparent);
private const string Style_UseImplicitTypeWherePossible = nameof(AutomationObject.Style_UseImplicitTypeWherePossible);
private const string Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration = nameof(AutomationObject.Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration);
private const string Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess = nameof(AutomationObject.Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess);
private KeyValuePair<string, IOption> GetOptionInfoForOnOffOptions(FieldInfo fieldInfo)
{
......@@ -267,6 +269,16 @@ public override bool TryFetch(OptionKey optionKey, out object value)
return FetchStyleBool(Style_UseImplicitTypeWherePossible, out value);
}
// code style: intrinsic/framework type.
if (optionKey.Option == CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
{
return FetchStyleBool(Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration, out value);
}
else if (optionKey.Option == CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
{
return FetchStyleBool(Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess, out value);
}
if (optionKey.Option == CompletionOptions.EnterKeyBehavior)
{
return FetchEnterKeyBehavior(optionKey, out value);
......@@ -484,6 +496,16 @@ public override bool TryPersist(OptionKey optionKey, object value)
return PersistStyleOption<bool>(Style_UseImplicitTypeWherePossible, value);
}
// code style: intrinsic/framework type.
if (optionKey.Option == CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
{
return PersistStyleOption<bool>(Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration, value);
}
else if (optionKey.Option == CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
{
return PersistStyleOption<bool>(Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value);
}
return base.TryPersist(optionKey, value);
}
......
......@@ -266,8 +266,8 @@ internal StyleViewModel(OptionSet optionSet, IServiceProvider serviceProvider) :
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyMethodAccess, CSharpVSResources.Qualify_method_access_with_this, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyEventAccess, CSharpVSResources.Qualify_event_access_with_this, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, CSharpVSResources.For_locals_parameters_and_members, s_intrinsicPreviewDeclarationTrue, s_intrinsicPreviewDeclarationFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, CSharpVSResources.For_member_access_expressions, s_intrinsicPreviewMemberAccessTrue, s_intrinsicPreviewMemberAccessFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, ServicesVSResources.For_locals_parameters_and_members, s_intrinsicPreviewDeclarationTrue, s_intrinsicPreviewDeclarationFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ServicesVSResources.For_member_access_expressions, s_intrinsicPreviewMemberAccessTrue, s_intrinsicPreviewMemberAccessFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes, CSharpVSResources.For_built_in_types, s_varForIntrinsicsPreviewTrue, s_varForIntrinsicsPreviewFalse, this, optionSet, varGroupTitle, typeStylePreferences));
CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, CSharpVSResources.When_variable_type_is_apparent, s_varWhereApparentPreviewTrue, s_varWhereApparentPreviewFalse, this, optionSet, varGroupTitle, typeStylePreferences));
......
......@@ -7,6 +7,7 @@
using System.Linq;
using System.Windows.Controls;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
......@@ -146,7 +147,7 @@ private Guid GetOptionPageGuidForOptionName(string optionName, string optionLang
return Guid.Parse(Guids.VisualBasicOptionPageNamingStyleIdString);
}
}
else if (optionName == nameof(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess))
else if (optionName == nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration))
{
if (optionLanguage == LanguageNames.CSharp)
{
......
......@@ -714,6 +714,24 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to For locals, parameters and members.
/// </summary>
internal static string For_locals_parameters_and_members {
get {
return ResourceManager.GetString("For_locals_parameters_and_members", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to For member access expressions.
/// </summary>
internal static string For_member_access_expressions {
get {
return ResourceManager.GetString("For_member_access_expressions", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to from Bing.
/// </summary>
......
......@@ -714,4 +714,10 @@ Additional information: {1}</value>
<data name="End_of_inner_exception_stack" xml:space="preserve">
<value>--- End of inner exception stack trace ---</value>
</data>
<data name="For_locals_parameters_and_members" xml:space="preserve">
<value>For locals, parameters and members</value>
</data>
<data name="For_member_access_expressions" xml:space="preserve">
<value>For member access expressions</value>
</data>
</root>
\ No newline at end of file
......@@ -379,25 +379,6 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Prefer intrinsic predefined type keyword in member access expressions.
'''</summary>
Friend Shared ReadOnly Property Prefer_intrinsic_predefined_type_keyword_in_member_access_expressions() As String
Get
Return ResourceManager.GetString("Prefer_intrinsic_predefined_type_keyword_in_member_access_expressions", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Prefer intrinsic predefined type keyword when declaring locals, parameters and members.
'''</summary>
Friend Shared ReadOnly Property Prefer_intrinsic_predefined_type_keyword_when_declaring_locals_parameters_and_members() As String
Get
Return ResourceManager.GetString("Prefer_intrinsic_predefined_type_keyword_when_declaring_locals_parameters_and_mem"& _
"bers", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Prefer &apos;Me.&apos;.
'''</summary>
......
......@@ -126,12 +126,6 @@
<data name="IntelliSense" xml:space="preserve">
<value>IntelliSense</value>
</data>
<data name="Prefer_intrinsic_predefined_type_keyword_when_declaring_locals_parameters_and_members" xml:space="preserve">
<value>Prefer intrinsic predefined type keyword when declaring locals, parameters and members</value>
</data>
<data name="Prefer_intrinsic_predefined_type_keyword_in_member_access_expressions" xml:space="preserve">
<value>Prefer intrinsic predefined type keyword in member access expressions</value>
</data>
<data name="Move_local_declaration_to_the_extracted_method_if_it_is_not_used_elsewhere" xml:space="preserve">
<value>_Move local declaration to the extracted method if it is not used elsewhere</value>
</data>
......
......@@ -141,21 +141,21 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
End Set
End Property
Public Property Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration As Boolean
Public Property Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration As String
Get
Return GetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
Return GetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
End Get
Set(value As Boolean)
SetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, value)
Set(value As String)
SetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, value)
End Set
End Property
Public Property Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess As Boolean
Public Property Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess As String
Get
Return GetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
Return GetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
End Get
Set(value As Boolean)
SetBooleanOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value)
Set(value As String)
SetXmlOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value)
End Set
End Property
......
......@@ -172,12 +172,15 @@ End Class
New CodeStylePreference(ServicesVSResources.Prefer_framework_type, isChecked:=False)
}
' qualify with Me. group
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyFieldAccess, BasicVSResources.Qualify_field_access_with_Me, s_fieldDeclarationPreviewTrue, s_fieldDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyPropertyAccess, BasicVSResources.Qualify_property_access_with_Me, s_propertyDeclarationPreviewTrue, s_propertyDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyMethodAccess, BasicVSResources.Qualify_method_access_with_Me, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyEventAccess, BasicVSResources.Qualify_event_access_with_Me, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, BasicVSResources.Prefer_intrinsic_predefined_type_keyword_when_declaring_locals_parameters_and_members, _intrinsicDeclarationPreviewTrue, _intrinsicDeclarationPreviewFalse, Me, optionSet, predefinedTypesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, BasicVSResources.Prefer_intrinsic_predefined_type_keyword_in_member_access_expressions, _intrinsicMemberAccessPreviewTrue, _intrinsicMemberAccessPreviewFalse, Me, optionSet, predefinedTypesGroupTitle))
' predefined or framework type group
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, ServicesVSResources.For_locals_parameters_and_members, _intrinsicDeclarationPreviewTrue, _intrinsicDeclarationPreviewFalse, Me, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences))
Me.CodeStyleItems.Add(New SimpleCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ServicesVSResources.For_member_access_expressions, _intrinsicMemberAccessPreviewTrue, _intrinsicMemberAccessPreviewFalse, Me, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences))
End Sub
End Class
End Namespace
......@@ -41,6 +41,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Private Const Style_QualifyPropertyAccess As String = NameOf(AutomationObject.Style_QualifyPropertyAccess)
Private Const Style_QualifyMethodAccess As String = NameOf(AutomationObject.Style_QualifyMethodAccess)
Private Const Style_QualifyEventAccess As String = NameOf(AutomationObject.Style_QualifyEventAccess)
Private Const Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration = NameOf(AutomationObject.Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration)
Private Const Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess = NameOf(AutomationObject.Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
Protected Overrides Function CreateStorageKeyToOptionMap() As ImmutableDictionary(Of String, IOption)
Dim Result As ImmutableDictionary(Of String, IOption).Builder = ImmutableDictionary.Create(Of String, IOption)(StringComparer.OrdinalIgnoreCase).ToBuilder()
......@@ -163,6 +165,13 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Return FetchStyleBool(Style_QualifyEventAccess, value)
End If
' code style use predefined/framework type
If optionKey.Option Is CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration Then
Return FetchStyleBool(Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration, value)
ElseIf optionKey.Option Is CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess Then
Return FetchStyleBool(Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value)
End If
If optionKey.Option Is CompletionOptions.EnterKeyBehavior Then
Return FetchEnterKeyBehavior(optionKey, value)
End If
......@@ -232,6 +241,13 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Return PersistStyleOption(Of Boolean)(Style_QualifyEventAccess, value)
End If
' code style use predefined/framework type
If optionKey.Option Is CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration Then
Return PersistStyleOption(Of Boolean)(Style_PreferIntrinsicPredefinedTypeKeywordInDeclaration, value)
ElseIf optionKey.Option Is CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess Then
Return PersistStyleOption(Of Boolean)(Style_PreferIntrinsicPredefinedTypeKeywordInMemberAccess, value)
End If
Return MyBase.TryPersist(optionKey, value)
End Function
......
......@@ -21,7 +21,9 @@ internal class CSharpCodeStyleOptionsProvider : IOptionProvider
CSharpCodeStyleOptions.UseVarWhenDeclaringLocals,
CSharpCodeStyleOptions.UseImplicitTypeWherePossible,
CSharpCodeStyleOptions.UseImplicitTypeWhereApparent,
CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes
CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes,
CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration,
CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess
}.ToImmutableArray();
public IEnumerable<IOption> GetOptions()
......
......@@ -31,7 +31,7 @@ internal static class CrefSyntaxExtensions
var memberCref = qualifiedCrefSyntax.Member;
// Currently we are dealing with only the NameMemberCrefs
if (optionSet.GetOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.CSharp) &&
if (SimplificationHelpers.PreferPredefinedTypeKeywordInMemberAccess(optionSet, semanticModel.Language) &&
(memberCref.Kind() == SyntaxKind.NameMemberCref))
{
var nameMemberCref = ((NameMemberCrefSyntax)memberCref).Name;
......
......@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.CSharp.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.CSharp.Simplification;
using Microsoft.CodeAnalysis.CSharp.Symbols;
......@@ -194,7 +195,7 @@ public static bool IsLeftSideOfDot(this ExpressionSyntax expression)
return false;
}
return
return
IsLeftSideOfQualifiedName(expression) ||
(expression.IsParentKind(SyntaxKind.SimpleMemberAccessExpression) && ((MemberAccessExpressionSyntax)expression.Parent).Expression == expression);
}
......@@ -792,6 +793,10 @@ private static bool CanReplace(ISymbol symbol)
{
replacementNode = CreatePredefinedTypeSyntax(memberAccess, keywordKind);
replacementNode = replacementNode
.WithAdditionalAnnotations(new SyntaxAnnotation(
nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)));
issueSpan = memberAccess.Span; // we want to show the whole expression as unnecessary
return true;
......@@ -855,14 +860,14 @@ private static bool PreferPredefinedTypeKeywordInDeclarations(NameSyntax name, O
{
return (name.Parent != null) && !(name.Parent is MemberAccessExpressionSyntax) &&
!InsideCrefReference(name) && !InsideNameOfExpression(name, semanticModel) &&
optionSet.GetOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.CSharp);
SimplificationHelpers.PreferPredefinedTypeKeywordInDeclarations(optionSet, semanticModel.Language);
}
private static bool PreferPredefinedTypeKeywordInMemberAccess(ExpressionSyntax memberAccess, OptionSet optionSet, SemanticModel semanticModel)
{
return (((memberAccess.Parent != null) && (memberAccess.Parent is MemberAccessExpressionSyntax)) || InsideCrefReference(memberAccess)) &&
!InsideNameOfExpression(memberAccess, semanticModel) &&
optionSet.GetOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.CSharp);
SimplificationHelpers.PreferPredefinedTypeKeywordInMemberAccess(optionSet, semanticModel.Language);
}
public static bool IsAliasReplaceableExpression(this ExpressionSyntax expression)
......@@ -1361,17 +1366,22 @@ private static int GetNamespaceId(SyntaxList<MemberDeclarationSyntax> members, N
// Don't simplify to predefined type if name is part of a QualifiedName.
// QualifiedNames can't contain PredefinedTypeNames (although MemberAccessExpressions can).
// In other words, the left side of a QualifiedName can't be a PredefinedTypeName.
if (!name.Parent.IsKind(SyntaxKind.QualifiedName) &&
(PreferPredefinedTypeKeywordInDeclarations(name, optionSet, semanticModel) ||
PreferPredefinedTypeKeywordInMemberAccess(name, optionSet, semanticModel)))
var inDeclarationContext = PreferPredefinedTypeKeywordInDeclarations(name, optionSet, semanticModel);
var inMemberAccessContext = PreferPredefinedTypeKeywordInMemberAccess(name, optionSet, semanticModel);
if (!name.Parent.IsKind(SyntaxKind.QualifiedName) && (inDeclarationContext || inMemberAccessContext))
{
var codeStyleOptionName = inDeclarationContext
? nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
: nameof(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess);
var type = semanticModel.GetTypeInfo(name, cancellationToken).Type;
if (type != null)
{
var keywordKind = GetPredefinedKeywordKind(type.SpecialType);
if (keywordKind != SyntaxKind.None)
{
return CanReplaceWithPredefinedTypeKeywordInContext(name, semanticModel, out replacementNode, ref issueSpan, keywordKind, cancellationToken);
return CanReplaceWithPredefinedTypeKeywordInContext(name, semanticModel, out replacementNode, ref issueSpan, keywordKind, codeStyleOptionName, cancellationToken);
}
}
else
......@@ -1382,7 +1392,7 @@ private static int GetNamespaceId(SyntaxList<MemberDeclarationSyntax> members, N
var keywordKind = GetPredefinedKeywordKind(((INamedTypeSymbol)typeSymbol).SpecialType);
if (keywordKind != SyntaxKind.None)
{
return CanReplaceWithPredefinedTypeKeywordInContext(name, semanticModel, out replacementNode, ref issueSpan, keywordKind, cancellationToken);
return CanReplaceWithPredefinedTypeKeywordInContext(name, semanticModel, out replacementNode, ref issueSpan, keywordKind, codeStyleOptionName, cancellationToken);
}
}
}
......@@ -1523,13 +1533,27 @@ private static bool CanSimplifyNullable(INamedTypeSymbol type, NameSyntax name,
return !name.Span.Contains(argumentDecl.Span);
}
private static bool CanReplaceWithPredefinedTypeKeywordInContext(NameSyntax name, SemanticModel semanticModel, out TypeSyntax replacementNode, ref TextSpan issueSpan, SyntaxKind keywordKind, CancellationToken cancellationToken)
private static bool CanReplaceWithPredefinedTypeKeywordInContext(
NameSyntax name,
SemanticModel semanticModel,
out TypeSyntax replacementNode,
ref TextSpan issueSpan,
SyntaxKind keywordKind,
string codeStyleOptionName,
CancellationToken cancellationToken)
{
replacementNode = CreatePredefinedTypeSyntax(name, keywordKind);
issueSpan = name.Span; // we want to show the whole name expression as unnecessary
return name.CanReplaceWithReducedNameInContext(replacementNode, semanticModel, cancellationToken);
var canReduce = name.CanReplaceWithReducedNameInContext(replacementNode, semanticModel, cancellationToken);
if (canReduce)
{
replacementNode = replacementNode.WithAdditionalAnnotations(new SyntaxAnnotation(codeStyleOptionName));
}
return canReduce;
}
private static TypeSyntax CreatePredefinedTypeSyntax(ExpressionSyntax expression, SyntaxKind keywordKind)
......@@ -1951,7 +1975,7 @@ private static bool CanReplaceWithReducedName(this NameSyntax name, TypeSyntax r
if (IsNonNameSyntaxInUsingDirective(name, reducedName) ||
WillConflictWithExistingLocal(name, reducedName) ||
IsAmbiguousCast(name, reducedName) ||
IsNullableTypeInPointerExpression(name, reducedName) ||
IsNullableTypeInPointerExpression(name, reducedName) ||
name.IsNotNullableReplaceable(reducedName) ||
IsQualifiedNameInUsingDirective(semanticModel, name, reducedName))
{
......
......@@ -8,6 +8,13 @@ public class CodeStyleOptions
{
internal const string PerLanguageCodeStyleOption = "CodeStylePerLanguage";
/// <remarks>
/// When user preferences are not yet set for a style, we fall back to the default value.
/// One such default(s), is that the feature is turned on, so that codegen consumes it,
/// but with none enforcement, so that the user is not prompted about their usage.
/// </remarks>
private static readonly CodeStyleOption<bool> trueWithNoneEnforcement = new CodeStyleOption<bool>(value: true, notification: NotificationOption.None);
/// <summary>
/// This option says if we should simplify away the <see langword="this"/>. or <see langword="Me"/>. in field access expressions.
/// </summary>
......@@ -27,5 +34,15 @@ public class CodeStyleOptions
/// This option says if we should simplify away the <see langword="this"/>. or <see langword="Me"/>. in event access expressions.
/// </summary>
public static readonly PerLanguageOption<CodeStyleOption<bool>> QualifyEventAccess = new PerLanguageOption<CodeStyleOption<bool>>(PerLanguageCodeStyleOption, nameof(QualifyEventAccess), defaultValue: CodeStyleOption<bool>.Default);
/// <summary>
/// This option says if we should prefer keyword for Intrinsic Predefined Types in Declarations
/// </summary>
public static readonly PerLanguageOption<CodeStyleOption<bool>> PreferIntrinsicPredefinedTypeKeywordInDeclaration = new PerLanguageOption<CodeStyleOption<bool>>(PerLanguageCodeStyleOption, nameof(PreferIntrinsicPredefinedTypeKeywordInDeclaration), defaultValue: trueWithNoneEnforcement);
/// <summary>
/// This option says if we should prefer keyword for Intrinsic Predefined Types in Member Access Expression
/// </summary>
public static readonly PerLanguageOption<CodeStyleOption<bool>> PreferIntrinsicPredefinedTypeKeywordInMemberAccess = new PerLanguageOption<CodeStyleOption<bool>>(PerLanguageCodeStyleOption, nameof(PreferIntrinsicPredefinedTypeKeywordInMemberAccess), defaultValue: trueWithNoneEnforcement);
}
}
......@@ -36,6 +36,8 @@ static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyFieldA
static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyMethodAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption<bool>
static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyPropertyAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption<bool>
static Microsoft.CodeAnalysis.SolutionId.CreateFromSerialized(System.Guid id, string debugName = null) -> Microsoft.CodeAnalysis.SolutionId
static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration -> Microsoft.CodeAnalysis.Options.PerLanguageOption<Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption<bool>>
static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption<Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption<bool>>
static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyEventAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption<Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption<bool>>
static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyFieldAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption<Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption<bool>>
static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyMethodAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption<Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption<bool>>
......
......@@ -116,5 +116,15 @@ internal static bool ShouldSimplifyMemberAccessExpression(SemanticModel semantic
return true;
}
internal static bool PreferPredefinedTypeKeywordInDeclarations(OptionSet optionSet, string language)
{
return optionSet.GetOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, language).Value;
}
internal static bool PreferPredefinedTypeKeywordInMemberAccess(OptionSet optionSet, string language)
{
return optionSet.GetOption(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, language).Value;
}
}
}
......@@ -18,9 +18,7 @@ internal class SimplificationOptionsProvider : IOptionProvider
SimplificationOptions.PreferImplicitTypeInference,
SimplificationOptions.PreferImplicitTypeInLocalDeclaration,
SimplificationOptions.AllowSimplificationToGenericType,
SimplificationOptions.AllowSimplificationToBaseType,
SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration,
SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess
SimplificationOptions.AllowSimplificationToBaseType
}.ToImmutableArray();
public IEnumerable<IOption> GetOptions()
......
......@@ -78,11 +78,13 @@ public static class SimplificationOptions
/// <summary>
/// This option says if we should prefer keyword for Intrinsic Predefined Types in Declarations
/// </summary>
[Obsolete]
public static PerLanguageOption<bool> PreferIntrinsicPredefinedTypeKeywordInDeclaration { get; } = new PerLanguageOption<bool>(PerLanguageFeatureName, "PreferIntrinsicPredefinedTypeKeywordInDeclaration", defaultValue: true);
/// <summary>
/// This option says if we should prefer keyword for Intrinsic Predefined Types in Member Access Expression
/// </summary>
[Obsolete]
public static PerLanguageOption<bool> PreferIntrinsicPredefinedTypeKeywordInMemberAccess { get; } = new PerLanguageOption<bool>(PerLanguageFeatureName, "PreferIntrinsicPredefinedTypeKeywordInMemberAccess", defaultValue: true);
/// <summary>
......
......@@ -4,6 +4,7 @@ Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeStyle
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Rename.ConflictEngine
Imports Microsoft.CodeAnalysis.Simplification
......@@ -1005,6 +1006,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
keywordKind,
memberAccess.GetTrailingTrivia()))
replacementNode = replacementNode.WithAdditionalAnnotations(
New SyntaxAnnotation(NameOf(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)))
issueSpan = memberAccess.Span
Return True
......@@ -1075,13 +1079,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Return (((memberAccess.Parent IsNot Nothing) AndAlso (TypeOf memberAccess.Parent Is MemberAccessExpressionSyntax)) OrElse
(InsideCrefReference(memberAccess) AndAlso Not memberAccess.IsLeftSideOfQualifiedName)) AndAlso ' Bug 1012713: Compiler has a bug due to which it doesn't support <PredefinedType>.Member inside crefs (i.e. System.Int32.MaxValue is supported but Integer.MaxValue isn't). Until this bug is fixed, we don't support simplifying types names like System.Int32.MaxValue to Integer.MaxValue.
(Not InsideNameOfExpression(memberAccess)) AndAlso
optionSet.GetOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, LanguageNames.VisualBasic)
SimplificationHelpers.PreferPredefinedTypeKeywordInMemberAccess(optionSet, LanguageNames.VisualBasic)
End Function
Private Function PreferPredefinedTypeKeywordInDeclarations(name As NameSyntax, optionSet As OptionSet) As Boolean
Return (name.Parent IsNot Nothing) AndAlso (TypeOf name.Parent IsNot MemberAccessExpressionSyntax) AndAlso (Not InsideCrefReference(name)) AndAlso
(Not InsideNameOfExpression(name)) AndAlso
optionSet.GetOption(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic)
SimplificationHelpers.PreferPredefinedTypeKeywordInDeclarations(optionSet, LanguageNames.VisualBasic)
End Function
<Extension>
......@@ -1305,12 +1309,26 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
keywordKind,
name.GetTrailingTrivia())
Dim valueText = TryCast(name, IdentifierNameSyntax)?.Identifier.ValueText
If token.Text = valueText OrElse
PreferPredefinedTypeKeywordInDeclarations(name, optionSet) OrElse
PreferPredefinedTypeKeywordInMemberAccess(name, optionSet) Then
Dim inDeclarationContext = PreferPredefinedTypeKeywordInDeclarations(name, optionSet)
Dim inMemberAccessContext = PreferPredefinedTypeKeywordInMemberAccess(name, optionSet)
If token.Text = valueText OrElse inDeclarationContext OrElse inMemberAccessContext Then
Dim codeStyleOptionName As String = Nothing
If inDeclarationContext Then
codeStyleOptionName = NameOf(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration)
ElseIf inMemberAccessContext Then
codeStyleOptionName = NameOf(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess)
End If
replacementNode = SyntaxFactory.PredefinedType(token)
issueSpan = name.Span
Return name.CanReplaceWithReducedNameInContext(replacementNode, semanticModel, cancellationToken)
Dim canReplace = name.CanReplaceWithReducedNameInContext(replacementNode, semanticModel, cancellationToken)
If canReplace Then
replacementNode = replacementNode.WithAdditionalAnnotations(New SyntaxAnnotation(codeStyleOptionName))
End If
Return canReplace
End If
End If
End If
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册