Closed pyricau closed 5 years ago
How to proceed about existing violations of the rules? Some of the checks might be fine-tuned (e.g. Max Line Length, Complexity, etc), others might be disabled... Another solution would be creating Baseline files to ensure that no new code violates the rules. Or do we want to just fix most of the things as bulk in the same PR? We can start a discussion on the rules here, I can prepare a list of more or less controversial rule violations
Meanwhile, here's Detekt report just for the leakcanary-android-core
: leakcanary-detekt-core.txt
A small excerpt from it:
Ruleset: comments Ruleset: complexity - 7h 40min debt LongMethod - 69/60 - [retrieveGroup] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\LeakingInstanceTable.kt:182:3 ComplexMethod - 12/10 - [retrieveGroup] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\LeakingInstanceTable.kt:182:3 NestedBlockDepth - 6/4 - [retrieveGroup] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\LeakingInstanceTable.kt:182:3 NestedBlockDepth - 5/4 - [importHprof] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\LeakActivity.kt:62:3 LongMethod - 85/60 - [onSuccessRetrieved] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\screen\HeapAnalysisSuccessScreen.kt:46:3 LongMethod - 201/60 - [render] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\screen\HeapDumpRenderer.kt:49:3 ComplexMethod - 21/10 - [render] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\screen\HeapDumpRenderer.kt:49:3 ..... Ruleset: empty-blocks - 20min debt EmptyFunctionBlock - [onViewAttachedToWindow] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Io.kt:38:53 EmptyFunctionBlock - [onViewAttachedToWindow] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Io.kt:38:53 EmptyFunctionBlock - [onViewAttachedToWindow] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\screen\HprofExplorerScreen.kt:57:57 EmptyFunctionBlock - [onViewAttachedToWindow] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\screen\HprofExplorerScreen.kt:57:57 Ruleset: exceptions - 1h debt TooGenericExceptionCaught - [e] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Cursors.kt:14:12 TooGenericExceptionCaught - [e] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\AndroidHeapDumper.kt:95:14 TooGenericExceptionThrown - [wait] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\FutureResult.kt:34:7 Ruleset: performance - 40min debt SpreadOperator - [listFiles] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\LeakDirectoryProvider.kt:59:33 SpreadOperator - [listFiles] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\LeakDirectoryProvider.kt:64:33 Ruleset: style - 9h debt NewLineAtEndOfFile - [DefaultOnHeapAnalyzedListener.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\DefaultOnHeapAnalyzedListener.kt:80:1 NewLineAtEndOfFile - [Cursors.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Cursors.kt:37:1 NewLineAtEndOfFile - [Db.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Db.kt:53:1 NewLineAtEndOfFile - [HeapAnalysisTable.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\HeapAnalysisTable.kt:160:1 MagicNumber - [summary] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\HeapAnalysisTable.kt:110:53 NewLineAtEndOfFile - [Io.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\Io.kt:80:1 NewLineAtEndOfFile - [LeakingInstanceTable.kt] at C:\Users\armax\Documents\leakcanary\leakcanary\leakcanary-android-core\src\main\java\leakcanary\internal\activity\db\LeakingInstanceTable.kt:286:1 ...
Compiled a table with all the rules that are currently violated - and it's not as bad as it seems from the detekt report! Full report here: leakcanary-full.txt
Rule Name | Violations | Threshold | Average / Max |
---|---|---|---|
ComplexCondition | 1 | - | PathFinder.kt |
LargeClass | 1 | - | HprofReader.kt |
LongMethod | 12 | 60 lines | ~85 / 348 (HprofReader) |
ComplexMethod | 30 | 10 | 18 / 84 (HprofReader) |
NestedBlockDepth | 13 | 4 | 5 / 7 (AndroidObjectInspectors) |
TooManyFunctions | 11 | 11 | 14 / 39 (HprofReader) |
LongParameterList | 3 | 6 | 6 / 6 |
EmptyFunctionBlock | 8 | - | - |
TooGenericExceptionCaught | 6 | - | - |
TooGenericExceptionThrown | 9 | - | - |
SpreadOperator | 9 | - | - |
NewLineAtEndOfFile | 67 | - | - |
MagicNumber | 167 | - | - |
MaxLineLength | 21 | - | - |
ReturnCount | 22 | - | - |
SafeCast | 1 | - | Serializables.kt |
ExplicitGarbageCollectionCall | 2 | - | Lol |
Thanks for doing this!
I think it makes sense to start with a baseline, and over time tweak some of the rules / clean up existing violations.
Sounds good! I'll prepare a pull request today/tomorrow.
What to do about Checkstyle? Everything is on Kotlin now, so Checkstyle is no longer doing anything and Detekt comes with KtLint for style checks. Remove Checkstyle?
I also need to make sure it integrates with Travis properly.
I'm fine with removing checkstyle :)
Created a PR, still need to make sure Travis picked up Detekt properly
Hm, Travis' build failed, can't compile the code:
Task :leakcanary-android-core:compileReleaseKotlin FAILED e: /home/travis/build/square/leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakViews.kt: (53, 5): Val cannot be reassigned
I observed this issue locally too, it somehow can't recognize the method setPrimaryClip
from the ClipboardManager
class and thinks that there's no setter. Changing compileSdk
to 28
fixed the issue for me locally, but I wonder why none of the other builds are failing on CI?
I had noticed this error in the IDE but the app builds and deploys fine
See https://github.com/square/workflow/pull/2