

GitHub - inamiy/SwiftRewriter: Swift code formatter using SwiftSyntax.
source link: https://github.com/inamiy/SwiftRewriter
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md
SwiftRewriter
Swift code formatter using SwiftSyntax.
Requirements: Swift 4.2 (Xcode 10)
(Note: Currently using a forked version inamiy/swift-syntax to include gyb-generated files)
Overview
SwiftRewriter
: Collection of reusable & composableSyntaxRewriter
sswift-rewriter
: Simple command-line executable
How to use
$ swift build $ swift run swift-rewriter help Available commands: help Display general or command-specific help print-ast print AST from file or string run Auto-correct code in the file or directory # Auto-correct code in the directory $ swift run swift-rewriter run --path /path/to/file-or-directory
Configuration
In swift-rewriter
CLI tool, rewriting rules are configured in rewriter.swift (configuration file e.g. yaml or json is not supported yet).
Please change the configuration as you like (you can make your own rewriter and combine!), and swift build & run
.
// rewriter.swift import SwiftRewriter /// Global rewriter. var rewriter: Rewriter { return // Workaround for SwiftSyntax bug (required) BugFixer() // Comment >>> HeaderCopyrightTrimmer() // Move >>> ImportSorter() // >>> ExtensionIniter() // not useful for everyone // Newline // >>> ExtraNewliner() // not useful for everyone >>> ElseNewliner(newline: false) // Indent >>> Indenter(.init( perIndent: .spaces(4), shouldIndentSwitchCase: false, shouldIndentIfConfig: false, skipsCommentedLine: true, usesXcodeStyle: false )) // Space // >>> ExtraSpaceTrimmer() // may disturb manually-aligned code >>> ColonSpacer(spaceBefore: false, spaceAfter: true) >>> TernaryExprSpacer() >>> BinaryOperatorSpacer(spacesAround: true) // Ignore to not distrub user-aligned multiple assignments. // >>> EqualSpacer(spacesAround: true) >>> ArrowSpacer(spaceBefore: true, spaceAfter: true) >>> LeftBraceSpacer(spaceBefore: true) >>> LeftParenSpacer(spaceBefore: true) >>> TrailingSpaceTrimmer() }
Rewriter
examples
Indenter
Better right-brace position
@@ −1,6 +1,6 @@ lets .code { } .format { −} // this!!! + } // this!!!
P.S. This is the primary goal of making SwiftRewriter
.
First-item-aware indent
struct Foo { init(bool: Bool, int: Int) { self.bool = bool if true { print() } run { x in print(x, y, z) } } }
will be:
struct Foo { init(bool: Bool, int: Int) { self.bool = bool if true { print() } run { x in print(x, y, z) } } }
HeaderCopyrightTrimmer
@@ −1,10 +1,2 @@
−//
−// example.swift
−// SwiftRewriter
−//
−// Created by Yasuhiro Inami on 2018-12-09.
−// Copyright © 2018 Yasuhiro Inami. All rights reserved.
−//
−
// All your code are belong to us.
ImportSorter
import C import B func foo() {} import A import D
will be:
import A import B import C import D func foo() {}
ExtensionIniter
This rewriter moves the code to enable struct
's memberwise initializer.
struct Foo { let int: Int init(int: Int) { self.int = int } init() { self.int = 0 } }
@@ −1,9 +1,12 @@ struct Foo { let int: Int +} + +extension Foo { init(int: Int) { self.int = int } init() { self.int = 0 } }
ExtraNewliner
(Work in Progress)
This rewriter adds a newline when code is too dense.
import Foundation var computed1: Int = 1 var computed2: Int = { return 2 } /// doc var computed3: Int = { return 3 } /// doc var computedBlock: String { return "" } func send() -> Observable<Void> { return apiSession .send(request) .do(onError: { [weak self] error in guard let me = self else { return } me.doSomething() }) .do(onError: { [weak self] error in guard let me = self else { return } me.doSomething() me.doSomething() }) }
will be:
import Foundation var computed1: Int = 1 var computed2: Int = { return 2 } /// doc var computed3: Int = { return 3 } /// doc var computedBlock: String { return "" } func send() -> Observable<Void> { return apiSession .send(request) .do(onError: { [weak self] error in guard let me = self else { return } me.doSomething() }) .do(onError: { [weak self] error in guard let me = self else { return } me.doSomething() me.doSomething() }) }
Roadmap / TODO
- Add configuration file support
- Automatic code folding
- Move properties above method (for "states" readability)
- Move inner types to
extension
scope (for "states" readability) - Align multiline
=
assignments - (Your idea comes here ?)
Acknoledgement
- Improving Swift Tools with libSyntax by @harlanhaskins
- Creating Refactoring Transformations for Swift by @nkcsgexi
- try! Swift Tokyo 2018 - AST Meta-programming by @kishikawakatsumi
- SwiftSyntax - NSHipster by @mattt
- SwiftLint and SwiftSyntax benchmarking by @jpsim et al.
License
Recommend
-
170
-
181
vim-mix-format Elixir 1.6 introduced the formatter: mix format. This plugin makes it easy to run the formatter asynchronously from within Vim 8 and Neovim. Installation Use your
-
146
-
120
Introduction Most of the current formatters for Python --- e.g., autopep8, and pep8ify --- are made to remove lint errors from code. This has some obvious limitations. For i...
-
53
README.md SwiftSyntax SwiftSyntax is a set of Swift bindings for the libSyntax libr...
-
13
SwiftSyntax is a Swift library that lets you parse, analyze, generate, and transform Swift source code. It’s based on the
-
29
README.md SwiftSyntaxHighlighter A syntax highlighter for Swift code that uses SwiftSyntax to gener...
-
30
README.md IBOutletRewriter
-
2
SwiftSyntax Written by Mattt...
-
12
Description In this episode we’re joined by Maryam Ariyan, one of the Software Engineers that works on the Logging extensions for .NET. Maryam talks to us about some of the new enchantments that her team have been wo...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK