提交 65b70a9b 编写于 作者: C CyrusNajmabadi

Add options for indexers and operators.

上级 01a30990
......@@ -154,12 +154,14 @@ protected override TDeclarationNode AddMethod<TDeclarationNode>(TDeclarationNode
if (method.MethodKind == MethodKind.Conversion)
{
return Cast<TDeclarationNode>(ConversionGenerator.AddConversionTo(typeDeclaration, method, options, availableIndices));
return Cast<TDeclarationNode>(ConversionGenerator.AddConversionTo(
typeDeclaration, method, Workspace, options, availableIndices));
}
if (method.MethodKind == MethodKind.UserDefinedOperator)
{
return Cast<TDeclarationNode>(OperatorGenerator.AddOperatorTo(typeDeclaration, method, options, availableIndices));
return Cast<TDeclarationNode>(OperatorGenerator.AddOperatorTo(
typeDeclaration, method, Workspace, options, availableIndices));
}
return Cast<TDeclarationNode>(MethodGenerator.AddMethodTo(
......@@ -626,11 +628,11 @@ public override SyntaxNode CreateFieldDeclaration(IFieldSymbol field, CodeGenera
}
else if (method.IsUserDefinedOperator())
{
return OperatorGenerator.GenerateOperatorDeclaration(method, destination, options);
return OperatorGenerator.GenerateOperatorDeclaration(method, destination, Workspace, options);
}
else if (method.IsConversion())
{
return ConversionGenerator.GenerateConversionDeclaration(method, destination, options);
return ConversionGenerator.GenerateConversionDeclaration(method, destination, Workspace, options);
}
else
{
......
// 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 Microsoft.CodeAnalysis.CodeGeneration;
using Microsoft.CodeAnalysis.CSharp.CodeStyle;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
......@@ -15,10 +17,12 @@ internal static class ConversionGenerator
internal static TypeDeclarationSyntax AddConversionTo(
TypeDeclarationSyntax destination,
IMethodSymbol method,
Workspace workspace,
CodeGenerationOptions options,
IList<bool> availableIndices)
{
var methodDeclaration = GenerateConversionDeclaration(method, GetDestination(destination), options);
var methodDeclaration = GenerateConversionDeclaration(
method, GetDestination(destination), workspace, options);
var members = Insert(destination.Members, methodDeclaration, options, availableIndices, after: LastOperator);
......@@ -28,9 +32,10 @@ internal static class ConversionGenerator
internal static ConversionOperatorDeclarationSyntax GenerateConversionDeclaration(
IMethodSymbol method,
CodeGenerationDestination destination,
Workspace workspace,
CodeGenerationOptions options)
{
var declaration = GenerateConversionDeclarationWorker(method, destination, options);
var declaration = GenerateConversionDeclarationWorker(method, destination, workspace, options);
return AddCleanupAnnotationsTo(AddAnnotationsTo(method,
ConditionallyAddDocumentationCommentTo(declaration, method, options)));
}
......@@ -38,6 +43,7 @@ internal static class ConversionGenerator
private static ConversionOperatorDeclarationSyntax GenerateConversionDeclarationWorker(
IMethodSymbol method,
CodeGenerationDestination destination,
Workspace workspace,
CodeGenerationOptions options)
{
var hasNoBody = !options.GenerateMethodBodies || method.IsExtern;
......@@ -53,7 +59,7 @@ internal static class ConversionGenerator
? SyntaxFactory.Token(SyntaxKind.ImplicitKeyword)
: SyntaxFactory.Token(SyntaxKind.ExplicitKeyword);
return SyntaxFactory.ConversionOperatorDeclaration(
var declaration = SyntaxFactory.ConversionOperatorDeclaration(
attributeLists: AttributeGenerator.GenerateAttributeLists(method.GetAttributes(), options),
modifiers: GenerateModifiers(method),
implicitOrExplicitKeyword: keyword,
......@@ -62,6 +68,31 @@ internal static class ConversionGenerator
parameterList: ParameterGenerator.GenerateParameterList(method.Parameters, isExplicit: false, options: options),
body: hasNoBody ? null : StatementGenerator.GenerateBlock(method),
semicolonToken: hasNoBody ? SyntaxFactory.Token(SyntaxKind.SemicolonToken) : new SyntaxToken());
declaration = UseExpressionBodyIfDesired(workspace, declaration);
return declaration;
}
private static ConversionOperatorDeclarationSyntax UseExpressionBodyIfDesired(
Workspace workspace, ConversionOperatorDeclarationSyntax declaration)
{
if (declaration.ExpressionBody == null)
{
var preferExpressionBody = workspace.Options.GetOption(CSharpCodeStyleOptions.PreferExpressionBodiedMethods).Value;
if (preferExpressionBody)
{
var expressionBody = CodeGenerationHelpers.TryConvertToExpressionBody(declaration.Body);
if (expressionBody != null)
{
return declaration.WithBody(null)
.WithExpressionBody(expressionBody)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
}
}
}
return declaration;
}
private static SyntaxTokenList GenerateModifiers(IMethodSymbol method)
......
......@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.CodeGeneration;
using Microsoft.CodeAnalysis.CSharp.CodeStyle;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
......@@ -16,10 +17,12 @@ internal static class OperatorGenerator
internal static TypeDeclarationSyntax AddOperatorTo(
TypeDeclarationSyntax destination,
IMethodSymbol method,
Workspace workspace,
CodeGenerationOptions options,
IList<bool> availableIndices)
{
var methodDeclaration = GenerateOperatorDeclaration(method, GetDestination(destination), options);
var methodDeclaration = GenerateOperatorDeclaration(
method, GetDestination(destination), workspace, options);
var members = Insert(destination.Members, methodDeclaration, options, availableIndices, after: LastOperator);
......@@ -29,6 +32,7 @@ internal static class OperatorGenerator
internal static OperatorDeclarationSyntax GenerateOperatorDeclaration(
IMethodSymbol method,
CodeGenerationDestination destination,
Workspace workspace,
CodeGenerationOptions options)
{
var reusableSyntax = GetReuseableSyntaxNodeForSymbol<OperatorDeclarationSyntax>(method, options);
......@@ -38,11 +42,32 @@ internal static class OperatorGenerator
}
var declaration = GenerateOperatorDeclarationWorker(method, destination, options);
declaration = UseExpressionBodyIfDesired(workspace, declaration);
return AddAnnotationsTo(method,
ConditionallyAddDocumentationCommentTo(declaration, method, options));
}
private static OperatorDeclarationSyntax UseExpressionBodyIfDesired(Workspace workspace, OperatorDeclarationSyntax declaration)
{
if (declaration.ExpressionBody == null)
{
var preferExpressionBody = workspace.Options.GetOption(CSharpCodeStyleOptions.PreferExpressionBodiedMethods).Value;
if (preferExpressionBody)
{
var expressionBody = CodeGenerationHelpers.TryConvertToExpressionBody(declaration.Body);
if (expressionBody != null)
{
return declaration.WithBody(null)
.WithExpressionBody(expressionBody)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
}
}
}
return declaration;
}
private static OperatorDeclarationSyntax GenerateOperatorDeclarationWorker(
IMethodSymbol method,
CodeGenerationDestination destination,
......
......@@ -31,8 +31,20 @@ internal static class CSharpCodeStyleOptions
nameof(CodeStyleOptions), nameof(PreferExpressionBodiedMethods), defaultValue: CodeStyleOptions.falseWithNoneEnforcement,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.CSharp.Specific.{nameof(PreferExpressionBodiedMethods)}"));
public static readonly Option<CodeStyleOption<bool>> PreferExpressionBodiedOperators = new Option<CodeStyleOption<bool>>(
nameof(CodeStyleOptions), nameof(PreferExpressionBodiedOperators), defaultValue: CodeStyleOptions.falseWithNoneEnforcement,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.CSharp.Specific.{nameof(PreferExpressionBodiedOperators)}"));
public static readonly Option<CodeStyleOption<bool>> PreferExpressionBodiedProperties = new Option<CodeStyleOption<bool>>(
nameof(CodeStyleOptions), nameof(PreferExpressionBodiedProperties), defaultValue: CodeStyleOptions.trueWithNoneEnforcement,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.CSharp.Specific.{nameof(PreferExpressionBodiedProperties)}"));
public static readonly Option<CodeStyleOption<bool>> PreferExpressionBodiedIndexers = new Option<CodeStyleOption<bool>>(
nameof(CodeStyleOptions), nameof(PreferExpressionBodiedIndexers), defaultValue: CodeStyleOptions.trueWithNoneEnforcement,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.CSharp.Specific.{nameof(PreferExpressionBodiedIndexers)}"));
public static readonly Option<CodeStyleOption<bool>> PreferExpressionBodiedAccessors = new Option<CodeStyleOption<bool>>(
nameof(CodeStyleOptions), nameof(PreferExpressionBodiedAccessors), defaultValue: CodeStyleOptions.trueWithNoneEnforcement,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.CSharp.Specific.{nameof(PreferExpressionBodiedAccessors)}"));
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册