private static IndexerDeclarationSyntax UseExpressionBodyIfDesired( Workspace workspace, IndexerDeclarationSyntax declaration, ParseOptions options) { if (declaration.ExpressionBody == null) { var preferExpressionBody = workspace.Options.GetOption(CSharpCodeStyleOptions.PreferExpressionBodiedIndexers).Value; if (preferExpressionBody) { var expressionBody = TryGetExpressionBody(declaration.AccessorList, options); if (expressionBody != null) { declaration = declaration.WithAccessorList(null) .WithExpressionBody(expressionBody) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)); } } } return declaration; }
/// <summary> /// Normalizes the <paramref name="declaration" />. /// </summary> public override SyntaxNode VisitIndexerDeclaration(IndexerDeclarationSyntax declaration) { // Nothing to do here for properties without expression bodies if (declaration.ExpressionBody == null) return declaration; // Nothing to do here for indexers not defined in fault effects or for indexers that are no overrides of some port var propertySymbol = declaration.GetPropertySymbol(SemanticModel); if (!propertySymbol.ContainingType.IsFaultEffect(SemanticModel) || !propertySymbol.IsOverride) return declaration; var originalDeclaration = declaration; var statements = AsStatementBody(propertySymbol.GetMethod, declaration.ExpressionBody.Expression); var getter = SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, statements); var accessorList = SyntaxFactory.AccessorList(SyntaxFactory.SingletonList(getter)); declaration = declaration.WithAccessorList(accessorList); declaration = declaration.WithExpressionBody(null).WithSemicolonToken(default(SyntaxToken)); return declaration.EnsureLineCount(originalDeclaration); }
private async Task<Document> HandleIndexerDeclaration(IndexerDeclarationSyntax declaration, Document document, CancellationToken cancellationToken) { var returnStatement = SyntaxFactory.ReturnStatement( returnKeyword: SyntaxFactory.Token(SyntaxKind.ReturnKeyword), expression: declaration.ExpressionBody.Expression, semicolonToken: declaration.SemicolonToken); var accessorDeclaration = SyntaxFactory.AccessorDeclaration( kind: SyntaxKind.GetAccessorDeclaration, body: SyntaxFactory.Block(returnStatement)); var newDeclaration = declaration .WithAccessorList( SyntaxFactory.AccessorList( SyntaxFactory.SingletonList(accessorDeclaration))) .WithExpressionBody(null) .WithSemicolonToken(default(SyntaxToken)) .WithAdditionalAnnotations(Formatter.Annotation); var oldRoot = await document.GetSyntaxRootAsync(cancellationToken); var newRoot = oldRoot.ReplaceNode(declaration, newDeclaration); return document.WithSyntaxRoot(newRoot); }