From 1756e8266eec87a62c9bceb1dfbe27653051f419 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Fri, 18 Nov 2022 00:55:03 +0000 Subject: [PATCH] Bug 1740799 - Format Kotlin code using ktlint. r=geckoview-reviewers,owlish,linter-reviewers,sylvestre Android-component and Fenix use ktlint, so mozilla-central should use same tools via spotless. This is from https://phabricator.services.mozilla.com/D131018 Differential Revision: https://phabricator.services.mozilla.com/D161557 --- build.gradle | 7 +++++ docs/code-quality/index.rst | 2 +- .../lint/linters/android-format.rst | 5 +++- .../contributor/geckoview-quick-start.rst | 4 +++ mobile/android/gradle.configure | 6 ++-- tools/lint/android-format.yml | 2 +- tools/lint/android/lints.py | 29 ++++++++++++++++++- 7 files changed, 49 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index e98677d676c7..b372d215a4cc 100644 --- a/build.gradle +++ b/build.gradle @@ -362,5 +362,12 @@ subprojects { } googleJavaFormat('1.15.0') } + kotlin { + target project.fileTree(project.projectDir) { + include '**/*.kt' + exclude '**/thirdparty/**' + } + ktlint('0.46.1') + } } } diff --git a/docs/code-quality/index.rst b/docs/code-quality/index.rst index ac5ab8371419..305d5719a021 100644 --- a/docs/code-quality/index.rst +++ b/docs/code-quality/index.rst @@ -132,7 +132,7 @@ In this document, we try to list these all tools. - :ref:`clippy` - https://github.com/rust-lang/rust-clippy -.. list-table:: Java +.. list-table:: Java/Kotlin :widths: 20 20 20 20 20 :header-rows: 1 diff --git a/docs/code-quality/lint/linters/android-format.rst b/docs/code-quality/lint/linters/android-format.rst index a6a30d24ddee..ed23ac64de63 100644 --- a/docs/code-quality/lint/linters/android-format.rst +++ b/docs/code-quality/lint/linters/android-format.rst @@ -6,7 +6,10 @@ for Gradle and Android. In our current configuration, Spotless includes the `Google Java Format plug-in `__ -which formats all our Java code using the Google Java coding style guidelines. +which formats all our Java code using the Google Java coding style guidelines, +and `ktlint `__ which formats all +our Kotlin code using the official Kotlin coding convention and Android Kotlin +Style Guide. Run Locally diff --git a/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst b/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst index b56ae2d15dcf..703667b888fd 100644 --- a/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst +++ b/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst @@ -123,6 +123,10 @@ native code. `Bug 1509539 `_ tracks making Android Studio and Gradle do this automatically. +If you want set up code formatting for Kotlin, please reference +`IntelliJ IDEA configuration +`_. + Custom mozconfig with Android Studio ------------------------------------ diff --git a/mobile/android/gradle.configure b/mobile/android/gradle.configure index 6dfb11d31bf8..09c69e124a6c 100644 --- a/mobile/android/gradle.configure +++ b/mobile/android/gradle.configure @@ -284,12 +284,14 @@ def gradle_android_api_lint_tasks(build_config): set_config("GRADLE_ANDROID_API_LINT_TASKS", gradle_android_api_lint_tasks) -set_config("GRADLE_ANDROID_FORMAT_LINT_FIX_TASKS", ["spotlessJavaApply"]) +set_config( + "GRADLE_ANDROID_FORMAT_LINT_FIX_TASKS", ["spotlessJavaApply", "spotlessKotlinApply"] +) @dependable def gradle_android_format_lint_check_tasks(): - return ["spotlessJavaCheck"] + return ["spotlessJavaCheck", "spotlessKotlinCheck"] set_config( diff --git a/tools/lint/android-format.yml b/tools/lint/android-format.yml index b13521a0194b..cacf3ff2d754 100644 --- a/tools/lint/android-format.yml +++ b/tools/lint/android-format.yml @@ -3,7 +3,7 @@ android-format: description: Android formatting lint include: ['mobile/android'] exclude: [] - extensions: ['java'] + extensions: ['java', 'kt'] support-files: - 'mobile/android/**/Makefile.in' - 'mobile/android/config/**' diff --git a/tools/lint/android/lints.py b/tools/lint/android/lints.py index b4cef13baaf8..bf4c3a5eb5ee 100644 --- a/tools/lint/android/lints.py +++ b/tools/lint/android/lints.py @@ -83,6 +83,8 @@ def gradle(log, topsrcdir=None, topobjdir=None, tasks=[], extra_args=[], verbose proc.kill() raise + return proc.returncode + def format(config, fix=None, **lintargs): topsrcdir = lintargs["root"] @@ -93,7 +95,7 @@ def format(config, fix=None, **lintargs): else: tasks = lintargs["substs"]["GRADLE_ANDROID_FORMAT_LINT_CHECK_TASKS"] - gradle( + ret = gradle( lintargs["log"], topsrcdir=topsrcdir, topobjdir=topobjdir, @@ -116,6 +118,31 @@ def format(config, fix=None, **lintargs): "level": "error", } results.append(result.from_config(config, **err)) + folder = os.path.join( + topobjdir, "gradle", "build", path, "spotless", "spotlessKotlin" + ) + for filename in glob.iglob(folder + "/**/*.kt", recursive=True): + err = { + "rule": "spotless-kt", + "path": os.path.join(path, mozpath.relpath(filename, folder)), + "lineno": 0, + "column": 0, + "message": "Formatting error, please run ./mach lint -l android-format --fix", + "level": "error", + } + results.append(result.from_config(config, **err)) + + if len(results) == 0 and ret != 0: + # spotless seems to hit unfixed error. + err = { + "rule": "spotless", + "path": "", + "lineno": 0, + "column": 0, + "message": "Unexpected error", + "level": "error", + } + results.append(result.from_config(config, **err)) # If --fix was passed, we just report the number of files that were changed if fix: