diff --git a/.ci.yaml b/.ci.yaml index 355c41544de..4c0b238268c 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -298,6 +298,10 @@ targets: timeout: 60 properties: shard: analyze + dependencies: >- + [ + {"dependency": "ktlint", "version": "version_1_1_1"} + ] tags: > ["framework","hostonly","shard","linux"] diff --git a/dev/benchmarks/multiple_flutters/android/app/src/main/java/dev/flutter/multipleflutters/MainActivity.kt b/dev/benchmarks/multiple_flutters/android/app/src/main/java/dev/flutter/multipleflutters/MainActivity.kt index 67d40c02688..7dcc9727778 100644 --- a/dev/benchmarks/multiple_flutters/android/app/src/main/java/dev/flutter/multipleflutters/MainActivity.kt +++ b/dev/benchmarks/multiple_flutters/android/app/src/main/java/dev/flutter/multipleflutters/MainActivity.kt @@ -23,7 +23,7 @@ class MainActivity : FragmentActivity() { root.layoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT ) root.orientation = LinearLayout.VERTICAL root.weightSum = numberOfFlutters.toFloat() @@ -36,7 +36,7 @@ class MainActivity : FragmentActivity() { val dartEntrypoint = DartExecutor.DartEntrypoint( FlutterInjector.instance().flutterLoader().findAppBundlePath(), - "main", + "main" ) val engines = generateSequence(0) { it + 1 } @@ -51,7 +51,7 @@ class MainActivity : FragmentActivity() { LinearLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, - 1.0f, + 1.0f ) val engine = engines[i] FlutterEngineCache.getInstance().put(i.toString(), engine) @@ -61,7 +61,7 @@ class MainActivity : FragmentActivity() { .beginTransaction() .add( 12345 + i, - flutterFragment, + flutterFragment ) .commit() } diff --git a/dev/benchmarks/platform_channels_benchmarks/android/app/src/main/kotlin/com/example/platform_channels_benchmarks/MainActivity.kt b/dev/benchmarks/platform_channels_benchmarks/android/app/src/main/kotlin/com/example/platform_channels_benchmarks/MainActivity.kt index 68d459e913e..a71809cbb17 100644 --- a/dev/benchmarks/platform_channels_benchmarks/android/app/src/main/kotlin/com/example/platform_channels_benchmarks/MainActivity.kt +++ b/dev/benchmarks/platform_channels_benchmarks/android/app/src/main/kotlin/com/example/platform_channels_benchmarks/MainActivity.kt @@ -43,7 +43,7 @@ class MainActivity : FlutterActivity() { flutterEngine.dartExecutor, "dev.flutter.echo.background.standard", StandardMessageCodec.INSTANCE, - taskQueue, + taskQueue ) backgroundStandard.setMessageHandler { message, reply -> reply.reply(message) } super.configureFlutterEngine(flutterEngine) diff --git a/dev/bots/analyze.dart b/dev/bots/analyze.dart index a23d677bab7..f2e38d3dbaa 100644 --- a/dev/bots/analyze.dart +++ b/dev/bots/analyze.dart @@ -153,6 +153,9 @@ Future run(List arguments) async { printProgress('Taboo words...'); await verifyTabooDocumentation(flutterRoot); + printProgress('Lint Kotlin files...'); + await lintKotlinFiles(flutterRoot); + // Ensure that all package dependencies are in sync. printProgress('Package dependencies...'); await runCommand(flutter, ['update-packages', '--verify-only'], @@ -1973,6 +1976,22 @@ Future verifyTabooDocumentation(String workingDirectory, { int minimumMatc } } +Future lintKotlinFiles(String workingDirectory) async { + const String baselineRelativePath = 'dev/bots/test/analyze-test-input/ktlint-baseline.xml'; + const String editorConfigRelativePath = 'dev/bots/test/analyze-test-input/.editorconfig'; + final EvalResult lintResult = await _evalCommand('ktlint', + ['--baseline=$flutterRoot/$baselineRelativePath', '--editorconfig=$flutterRoot/$editorConfigRelativePath'], + workingDirectory: workingDirectory); + if (lintResult.exitCode != 0) { + final String errorMessage = 'Found lint violations in Kotlin files:\n ${lintResult.stdout}\n\n' + 'To reproduce this lint locally:\n' + '1. Identify the CIPD version tag used to resolve this particular version of ktlint (check the dependencies section of this shard in the ci.yaml). \n' + '2. Download that version from https://chrome-infra-packages.appspot.com/p/flutter/ktlint/linux-amd64/+/\n' + '3. From the repository root, run `/ktlint --editorconfig=$editorConfigRelativePath --baseline=$baselineRelativePath`'; + foundError([errorMessage]); + } +} + const List _kIgnoreList = [ 'Runner.rc.tmpl', 'flutter_window.cpp', diff --git a/dev/bots/test/analyze-test-input/.editorconfig b/dev/bots/test/analyze-test-input/.editorconfig new file mode 100644 index 00000000000..b0965f4e744 --- /dev/null +++ b/dev/bots/test/analyze-test-input/.editorconfig @@ -0,0 +1,4 @@ +[*.{kt,kts}] +# Disable trailing commas to allow compatibility with Kotlin versions less than 1.4. +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false diff --git a/dev/bots/test/analyze-test-input/ktlint-baseline.xml b/dev/bots/test/analyze-test-input/ktlint-baseline.xml new file mode 100644 index 00000000000..edcb4a1c934 --- /dev/null +++ b/dev/bots/test/analyze-test-input/ktlint-baseline.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/integration_tests/abstract_method_smoke_test/android/app/src/main/kotlin/com/example/abstract_method_smoke_test/MainActivity.kt b/dev/integration_tests/abstract_method_smoke_test/android/app/src/main/kotlin/com/example/abstract_method_smoke_test/MainActivity.kt index 94428bbf46e..b241e2b6d29 100644 --- a/dev/integration_tests/abstract_method_smoke_test/android/app/src/main/kotlin/com/example/abstract_method_smoke_test/MainActivity.kt +++ b/dev/integration_tests/abstract_method_smoke_test/android/app/src/main/kotlin/com/example/abstract_method_smoke_test/MainActivity.kt @@ -30,7 +30,7 @@ class MainActivity : FlutterActivity() { } override fun configureFlutterEngine( - @NonNull flutterEngine: FlutterEngine, + @NonNull flutterEngine: FlutterEngine ) { GeneratedPluginRegistrant.registerWith(flutterEngine) @@ -43,11 +43,11 @@ class MainActivity : FlutterActivity() { override fun create( context: Context?, viewId: Int, - args: Any?, + args: Any? ): PlatformView { return SimplePlatformView(this@MainActivity) } - }, + } ) // Triggers the Android keyboard, which causes the resize of the Flutter view. diff --git a/dev/integration_tests/android_embedding_v2_smoke_test/android/app/src/main/kotlin/com/example/android_embedding_v2_smoke_test/MainActivity.kt b/dev/integration_tests/android_embedding_v2_smoke_test/android/app/src/main/kotlin/com/example/android_embedding_v2_smoke_test/MainActivity.kt index a652f58f563..e36918f8f8b 100644 --- a/dev/integration_tests/android_embedding_v2_smoke_test/android/app/src/main/kotlin/com/example/android_embedding_v2_smoke_test/MainActivity.kt +++ b/dev/integration_tests/android_embedding_v2_smoke_test/android/app/src/main/kotlin/com/example/android_embedding_v2_smoke_test/MainActivity.kt @@ -7,7 +7,7 @@ import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity : FlutterActivity() { override fun configureFlutterEngine( - @NonNull flutterEngine: FlutterEngine, + @NonNull flutterEngine: FlutterEngine ) { GeneratedPluginRegistrant.registerWith(flutterEngine) }