Browse Source

Switch to swift-format

George Barnett 2 years ago
parent
commit
9cdcd2d9de
6 changed files with 129 additions and 80 deletions
  1. 0 4
      .github/workflows/ci.yaml
  2. 1 0
      .gitignore
  3. 58 0
      .swift-format
  4. 0 60
      .swiftformat
  5. 69 14
      scripts/format.sh
  6. 1 2
      scripts/sanity.sh

+ 0 - 4
.github/workflows/ci.yaml

@@ -14,10 +14,6 @@ jobs:
     - uses: actions/checkout@v3
     - uses: actions/checkout@v3
     - name: "Formatting and License Headers check"
     - name: "Formatting and License Headers check"
       run: |
       run: |
-        SWIFTFORMAT_VERSION=0.52.0
-        git clone --depth 1 --branch "$SWIFTFORMAT_VERSION" "https://github.com/nicklockwood/SwiftFormat" "$HOME/SwiftFormat"
-        swift build -c release --package-path "$HOME/SwiftFormat" --product swiftformat
-        export PATH=$PATH:"$(swift build -c release --package-path "$HOME/SwiftFormat" --show-bin-path)"
         ./scripts/sanity.sh
         ./scripts/sanity.sh
   unit-tests:
   unit-tests:
     strategy:
     strategy:

+ 1 - 0
.gitignore

@@ -19,5 +19,6 @@ Examples/EchoWeb/node_modules
 Examples/EchoWeb/package-lock.json
 Examples/EchoWeb/package-lock.json
 dev/codegen-tests/**/generated/*
 dev/codegen-tests/**/generated/*
 /scripts/.swiftformat-source/
 /scripts/.swiftformat-source/
+/scripts/.swift-format-source/
 Package.resolved
 Package.resolved
 *.out.*
 *.out.*

+ 58 - 0
.swift-format

@@ -0,0 +1,58 @@
+{
+  "fileScopedDeclarationPrivacy" : {
+    "accessLevel" : "private"
+  },
+  "indentation" : {
+    "spaces" : 2
+  },
+  "indentConditionalCompilationBlocks" : false,
+  "indentSwitchCaseLabels" : false,
+  "lineBreakAroundMultilineExpressionChainComponents" : false,
+  "lineBreakBeforeControlFlowKeywords" : false,
+  "lineBreakBeforeEachArgument" : true,
+  "lineBreakBeforeEachGenericRequirement" : false,
+  "lineLength" : 100,
+  "maximumBlankLines" : 1,
+  "prioritizeKeepingFunctionOutputTogether" : true,
+  "respectsExistingLineBreaks" : true,
+  "rules" : {
+    "AllPublicDeclarationsHaveDocumentation" : false,
+    "AlwaysUseLowerCamelCase" : false,
+    "AmbiguousTrailingClosureOverload" : true,
+    "BeginDocumentationCommentWithOneLineSummary" : false,
+    "DoNotUseSemicolons" : true,
+    "DontRepeatTypeInStaticProperties" : true,
+    "FileScopedDeclarationPrivacy" : true,
+    "FullyIndirectEnum" : true,
+    "GroupNumericLiterals" : true,
+    "IdentifiersMustBeASCII" : true,
+    "NeverForceUnwrap" : false,
+    "NeverUseForceTry" : false,
+    "NeverUseImplicitlyUnwrappedOptionals" : false,
+    "NoAccessLevelOnExtensionDeclaration" : true,
+    "NoAssignmentInExpressions" : true,
+    "NoBlockComments" : false,
+    "NoCasesWithOnlyFallthrough" : true,
+    "NoEmptyTrailingClosureParentheses" : true,
+    "NoLabelsInCasePatterns" : false,
+    "NoLeadingUnderscores" : false,
+    "NoParensAroundConditions" : true,
+    "NoVoidReturnOnFunctionSignature" : true,
+    "OneCasePerLine" : true,
+    "OneVariableDeclarationPerLine" : true,
+    "OnlyOneTrailingClosureArgument" : true,
+    "OrderedImports" : true,
+    "ReturnVoidInsteadOfEmptyTuple" : true,
+    "UseEarlyExits" : false,
+    "UseLetInEveryBoundCaseVariable" : false,
+    "UseShorthandTypeNames" : true,
+    "UseSingleLinePropertyGetter" : false,
+    "UseSynthesizedInitializer" : false,
+    "UseTripleSlashForDocumentationComments" : true,
+    "UseWhereClausesInForLoops" : false,
+    "ValidateDocumentationComments" : false
+  },
+  "spacesAroundRangeFormationOperators" : true,
+  "tabWidth" : 2,
+  "version" : 1
+}

+ 0 - 60
.swiftformat

@@ -1,60 +0,0 @@
-# Language version.
---swiftversion 5.6
-
-# Ignore generated files.
---exclude **/LinuxMain.swift,**/XCTestManifests.swift,**/*.grpc.swift,**/*.pb.swift
---exclude Sources/GRPCSampleData/GRPCSwiftCertificate.swift
-
---indent 2
---maxwidth 100
-
-# Require explicit self
---self insert
-
-# Only remove unused args in closures.
---stripunusedargs closure-only
-
-# Wrap before the first argument (if wrapping is necessary).
---wraparguments before-first
-
-# Don't indent #if blocks
---ifdef no-indent
-
-# Don't turn Optional<Foo> into Foo?
---shortoptionals except-properties
-
-# This rule doesn't always work as we'd expect: specifically when we return a
-# succeeded future whose type is a closure then that closure is incorrectly
-# treated as a trailing closure. This is relevant because the service provider
-# API for client streaming RPCs has this exact shape.
---disable trailingClosures
-
-# Don't wrap the opening brace of multiline statements.
---disable wrapMultilineStatementBraces
-
-# We used to support 5.0 and return is redundant in more places in 5.1: enabling
-# this rule creates a large (and unnecessary) diff.
---disable redundantReturn
-
-# Don't prefer using key paths for trivial closures.
---disable preferKeyPath
-
-# Put ACLs on declarations within an extension rather than the extension itself.
---extensionacl on-declarations
-
-# Don't remove internal ACLs
---disable redundantInternal
-
-# Don't remove redundant parenstheses, because no all of them are redundant.
---disable redundantParens
-
-# Don't remove static Self
---disable redundantStaticSelf
-
-# Hoisting try and await causes a bunch of issues (and churn) in 0.52.0. Disable
-# them for the time being.
---disable hoistTry
---disable hoistAwait
-
-# Disabled as enabling causes a lot of churn.
---disable wrapSingleLineComments

+ 69 - 14
scripts/format.sh

@@ -16,43 +16,98 @@
 
 
 set -eu
 set -eu
 
 
+function log() { printf -- "** %s\n" "$*" >&2; }
+function error() { printf -- "** ERROR: %s\n" "$*" >&2; }
+function fatal() { error "$*"; exit 1; }
+
+function usage() {
+  echo >&2 "Usage:"
+  echo >&2 "  $0 -[f|l]"
+  echo >&2 ""
+  echo >&2 "Options:"
+  echo >&2 "  -f   Format source code in place"
+  echo >&2 "  -l   Lint check without formatting the source code"
+}
+
+lint=false
+while getopts ":lh" opt; do
+  case "$opt" in
+    l)
+      lint=true
+      ;;
+    h)
+      usage
+      exit 1
+      ;;
+    \?)
+      usage
+      exit 1
+      ;;
+  esac
+done
+
+THIS_SCRIPT=$0
 HERE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 HERE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 REPO="$HERE/.."
 REPO="$HERE/.."
-SWIFTFORMAT_DIR="$HERE/.swiftformat-source"
-
-# Important: if this is changed then make sure to update the version
-# in the .github/workflows/ci.yaml as well!
-SWIFTFORMAT_VERSION=0.52.0
+SWIFTFORMAT_DIR="$HERE/.swift-format-source"
+SWIFTFORMAT_VERSION=509.0.0
 
 
 # Clone SwiftFormat if we don't already have it.
 # Clone SwiftFormat if we don't already have it.
 if [ ! -d "$SWIFTFORMAT_DIR" ]; then
 if [ ! -d "$SWIFTFORMAT_DIR" ]; then
-  echo "- Cloning SwiftFormat @ $SWIFTFORMAT_VERSION"
+  echo "- Cloning swift-format @ $SWIFTFORMAT_VERSION"
   git clone \
   git clone \
     --depth 1 \
     --depth 1 \
     --branch "$SWIFTFORMAT_VERSION" \
     --branch "$SWIFTFORMAT_VERSION" \
-    https://github.com/nicklockwood/SwiftFormat.git \
+    https://github.com/apple/swift-format.git \
     "$SWIFTFORMAT_DIR"
     "$SWIFTFORMAT_DIR"
 fi
 fi
 
 
 cd "$SWIFTFORMAT_DIR"
 cd "$SWIFTFORMAT_DIR"
 
 
 # Figure out the path for the binary.
 # Figure out the path for the binary.
-SWIFTFORMAT_BIN="$(swift build --show-bin-path -c release)/swiftformat-$SWIFTFORMAT_VERSION"
+SWIFTFORMAT_BIN="$(swift build --show-bin-path -c release)/swift-format-$SWIFTFORMAT_VERSION"
 
 
 # Build it if we don't already have it.
 # Build it if we don't already have it.
 if [ ! -f "$SWIFTFORMAT_BIN" ]; then
 if [ ! -f "$SWIFTFORMAT_BIN" ]; then
   # We're not on the right tag, fetch and checkout the right one.
   # We're not on the right tag, fetch and checkout the right one.
-  echo "- Fetching SwiftFormat @ $SWIFTFORMAT_VERSION"
+  echo "- Fetching swift-format @ $SWIFTFORMAT_VERSION"
   git fetch --depth 1 origin "refs/tags/$SWIFTFORMAT_VERSION:refs/tags/$SWIFTFORMAT_VERSION"
   git fetch --depth 1 origin "refs/tags/$SWIFTFORMAT_VERSION:refs/tags/$SWIFTFORMAT_VERSION"
   git checkout "$SWIFTFORMAT_VERSION"
   git checkout "$SWIFTFORMAT_VERSION"
 
 
   # Now build and name the bin appropriately.
   # Now build and name the bin appropriately.
-  echo "- Building SwiftFormat @ $SWIFTFORMAT_VERSION"
-  swift build -c release --product swiftformat
-  mv "$(swift build --show-bin-path -c release)/swiftformat" "$SWIFTFORMAT_BIN"
+  echo "- Building swift-format @ $SWIFTFORMAT_VERSION"
+  swift build -c release --product swift-format
+  mv "$(swift build --show-bin-path -c release)/swift-format" "$SWIFTFORMAT_BIN"
 
 
   echo "- OK"
   echo "- OK"
 fi
 fi
 
 
-# Now run it.
-$SWIFTFORMAT_BIN "$REPO"
+if "$lint"; then
+  "${SWIFTFORMAT_BIN}" lint \
+    --parallel --recursive --strict \
+    "${REPO}/Sources" "${REPO}/Tests" \
+    && SWIFT_FORMAT_RC=$? || SWIFT_FORMAT_RC=$?
+
+  if [[ "${SWIFT_FORMAT_RC}" -ne 0 ]]; then
+    fatal "Running swift-format produced errors.
+
+    To fix, run the following command:
+
+    % $THIS_SCRIPT -f
+    "
+    exit "${SWIFT_FORMAT_RC}"
+  fi
+
+  log "Ran swift-format lint with no errors."
+else
+  "${SWIFTFORMAT_BIN}" format \
+    --parallel --recursive --in-place \
+    "${REPO}/Sources" "${REPO}/Tests" \
+    && SWIFT_FORMAT_RC=$? || SWIFT_FORMAT_RC=$?
+
+  if [[ "${SWIFT_FORMAT_RC}" -ne 0 ]]; then
+    fatal "Running swift-format produced errors." "${SWIFT_FORMAT_RC}"
+  fi
+
+  log "Ran swift-format with no errors."
+fi

+ 1 - 2
scripts/sanity.sh

@@ -42,8 +42,7 @@ function check_license_headers() {
 }
 }
 
 
 function check_formatting() {
 function check_formatting() {
-  hash swiftformat 2> /dev/null || { printf "\033[0;31mERROR\033[0m swiftformat must be installed (see: https://github.com/nicklockwood/SwiftFormat)\n"; exit 1; }
-  run_logged "Checking formatting (swiftformat $(swiftformat --version))" "swiftformat --lint --verbose $HERE/.."
+  run_logged "Checking formatting" "$HERE/format.sh lint"
 }
 }
 
 
 errors=0
 errors=0