diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 0cb94a0c..8c13600e 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -103,15 +103,6 @@
-
diff --git a/build.gradle b/build.gradle
index c0dbf2af..03b03fa4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -110,6 +110,7 @@ apply plugin: libs.detekt.gradlePluginId
dependencies {
detekt libs.detekt.formatting
detekt libs.detekt.cli
+ detektPlugins libs.kurePotlin
}
tasks.withType(Detekt) {
diff --git a/detekt-config.yml b/detekt-config.yml
index a20be7cc..39141930 100644
--- a/detekt-config.yml
+++ b/detekt-config.yml
@@ -290,3 +290,29 @@ style:
active: true
WildcardImport:
active: true
+
+impure:
+ active: true
+ LoopUsage:
+ active: true
+ ReturnStatement:
+ active: true
+ VariableUsage:
+ active: true
+ ReturnUnit:
+ active: true
+ ignoreFunctionType: false
+ ignoredAnnotations: [ ]
+ ignoreDsl: false
+ ClassDefinition:
+ active: false
+ AbstractClassDefinition:
+ active: false
+ ThrowExpression:
+ active: true
+ MutableCollections:
+ active: true
+ BranchStatement:
+ active: true
+ MissingElse:
+ active: false
diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle
index 396e5218..74d21418 100644
--- a/gradle/dependencies.gradle
+++ b/gradle/dependencies.gradle
@@ -48,6 +48,7 @@ ext.libs = [
"formatting": "io.gitlab.arturbosch.detekt:detekt-formatting:${versions.detekt}",
"cli": "io.gitlab.arturbosch.detekt:detekt-cli:${versions.detekt}",
],
+ "kurePotlin": "pl.setblack:kure-potlin:0.5.0",
"gradleVersions": [
"gradlePlugin": "com.github.ben-manes:gradle-versions-plugin:0.39.0",
"gradlePluginId": "com.github.ben-manes.versions",
diff --git a/library/ruler-android-startup/src/main/java/io/mehow/ruler/startup/RulerInitializer.kt b/library/ruler-android-startup/src/main/java/io/mehow/ruler/startup/RulerInitializer.kt
index a6f6763c..3957a016 100644
--- a/library/ruler-android-startup/src/main/java/io/mehow/ruler/startup/RulerInitializer.kt
+++ b/library/ruler-android-startup/src/main/java/io/mehow/ruler/startup/RulerInitializer.kt
@@ -7,13 +7,10 @@ import io.mehow.ruler.format.FormattingDriver
import io.mehow.ruler.format.withAndroidContext
public object RulerInitializer : Initializer {
- override fun create(context: Context): FormattingDriver {
- val driver = FormattingDriver.Builder()
- .withAndroidContext(context)
- .build()
- Ruler.driver = driver
- return driver
- }
+ override fun create(context: Context): FormattingDriver = FormattingDriver.Builder()
+ .withAndroidContext(context)
+ .build()
+ .also { Ruler.driver = it }
override fun dependencies(): List>> = emptyList()
}
diff --git a/library/ruler/src/main/java/io/mehow/ruler/Distance.kt b/library/ruler/src/main/java/io/mehow/ruler/Distance.kt
index 6afa2825..a3ded021 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/Distance.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/Distance.kt
@@ -147,6 +147,7 @@ public class Distance private constructor(
/**
* Divides this distance by specified value.
*/
+ @Suppress("ThrowExpression")
public operator fun div(divisor: Long): Distance = when (divisor) {
0L -> throw ArithmeticException("Cannot divide by 0.")
1L -> this
@@ -161,6 +162,7 @@ public class Distance private constructor(
/**
* Divides this distance by specified value.
*/
+ @Suppress("ThrowExpression")
public operator fun div(divisor: Double): Distance = when (divisor) {
0.0 -> throw ArithmeticException("Cannot divide by 0.")
1.0 -> this
@@ -175,10 +177,10 @@ public class Distance private constructor(
/**
* Compares this distance based on the space quantity.
*/
- override fun compareTo(other: Distance): Int {
- val cmp = metersPart.compareTo(other.metersPart)
- return if (cmp != 0) cmp else nanosPart.compareTo(other.nanosPart)
- }
+ override fun compareTo(other: Distance): Int = metersPart
+ .compareTo(other.metersPart)
+ .takeIf { it != 0 }
+ ?: nanosPart.compareTo(other.nanosPart)
override fun equals(other: Any?): Boolean = other is Distance &&
metersPart == other.metersPart &&
@@ -212,7 +214,8 @@ public class Distance private constructor(
*/
public val Epsilon: Distance = Distance(nanosPart = 1)
- internal fun create(meters: BigDecimal): Distance {
+ @Suppress("ThrowExpression")
+ internal fun create(meters: BigDecimal): Distance = run {
val nanos = meters.movePointRight(9).toBigInteger()
val divRem = nanos.divideAndRemainder(nanosInMeterBig)
if (divRem[0].bitLength() > 63) {
@@ -220,19 +223,20 @@ public class Distance private constructor(
}
val storedMeters = divRem[0].toLong()
val storedNanometers = divRem[1].toLong()
- return create(storedMeters, storedNanometers)
+ create(storedMeters, storedNanometers)
}
+ @Suppress("ThrowExpression")
internal fun create(
meters: Long = 0,
nanometers: Long = 0,
- ): Distance {
- var meterPart = nanometers / nanosInMeter
- var nanoPart = nanometers % nanosInMeter
- if (nanoPart < 0) {
- nanoPart += nanosInMeter
- meterPart--
- }
+ ): Distance = run {
+ val rawNanoPart = nanometers % nanosInMeter
+ val rawMeterPart = nanometers / nanosInMeter
+ val takeIfNoOverflow: Long.() -> Long? = { takeUnless { rawNanoPart < 0 } }
+
+ val nanoPart = rawNanoPart.takeIfNoOverflow() ?: rawNanoPart + nanosInMeter
+ val meterPart = rawMeterPart.takeIfNoOverflow() ?: rawMeterPart - 1
val totalMeters = meters.safeAdd(meterPart)
val totalNanometers = nanoPart
@@ -242,7 +246,7 @@ public class Distance private constructor(
throw ArithmeticException("Exceeded meters capacity: $totalMeters m")
}
- return Distance(totalMeters, totalNanometers)
+ Distance(totalMeters, totalNanometers)
}
/**
diff --git a/library/ruler/src/main/java/io/mehow/ruler/Length.kt b/library/ruler/src/main/java/io/mehow/ruler/Length.kt
index fefd13af..72224a2c 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/Length.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/Length.kt
@@ -58,6 +58,7 @@ public class Length> internal constructor(
/**
* Ensures that a unit is within a specified range.
*/
+ @Suppress("ThrowExpression")
public fun coerceUnitIn(range: ClosedRange): Length = when {
range.isEmpty() -> throw IllegalArgumentException("Range cannot be empty!")
unit > range.endInclusive -> Length(distance, range.endInclusive)
@@ -118,10 +119,7 @@ public class Length> internal constructor(
driver: FormattingDriver,
converter: LengthConverter?,
formatter: LengthFormatter,
- ): String {
- val length = converter?.convert(this) ?: this
- return formatter.format(length, driver)
- }
+ ): String = formatter.format(converter?.convert(this) ?: this, driver)
/**
* Returns a length whose value is the absolute value of this length.
diff --git a/library/ruler/src/main/java/io/mehow/ruler/LongMath.kt b/library/ruler/src/main/java/io/mehow/ruler/LongMath.kt
index c77985f4..6e23e3e1 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/LongMath.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/LongMath.kt
@@ -1,3 +1,5 @@
+@file:Suppress("ReturnStatement", "ThrowExpression")
+
/*
* Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
*
diff --git a/library/ruler/src/main/java/io/mehow/ruler/Ruler.kt b/library/ruler/src/main/java/io/mehow/ruler/Ruler.kt
index b8914801..f7014abb 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/Ruler.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/Ruler.kt
@@ -15,6 +15,7 @@ import io.mehow.ruler.format.NoOpFormatter
* or [formatter factories][LengthFormatter.Factory]. If no factories are installed Ruler uses built-in factories
* to convert and format input.
*/
+@Suppress("VariableDefinition")
public object Ruler : LengthConverter, LengthFormatter {
/**
* Default driver for lengths and distances formatting.
diff --git a/library/ruler/src/main/java/io/mehow/ruler/format/FormattingDriver.kt b/library/ruler/src/main/java/io/mehow/ruler/format/FormattingDriver.kt
index a23ec019..d85399bd 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/format/FormattingDriver.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/format/FormattingDriver.kt
@@ -42,11 +42,11 @@ public class FormattingDriver internal constructor(
/**
* Formats length to a human-readable form using a supplied context.
*/
- public fun format(length: Length<*>, context: FormattingContext = formattingContext): String {
+ public fun format(length: Length<*>, context: FormattingContext = formattingContext): String = run {
val value = measureFormatter.format(length.measure, MeasureContext(context.fractionalPrecision, translator.locale))
val separator = context.unitSeparator
val unit = translator.symbol(length.unit)
- return value + separator + unit
+ value + separator + unit
}
/**
diff --git a/library/ruler/src/main/java/io/mehow/ruler/format/ImperialFormatter.kt b/library/ruler/src/main/java/io/mehow/ruler/format/ImperialFormatter.kt
index 14c133ec..d8d1bf13 100644
--- a/library/ruler/src/main/java/io/mehow/ruler/format/ImperialFormatter.kt
+++ b/library/ruler/src/main/java/io/mehow/ruler/format/ImperialFormatter.kt
@@ -25,12 +25,12 @@ public class ImperialFormatter internal constructor(
private val partSeparator = builder.partSeparator
private val fallbackFormatter = builder.fallbackFormatter
- override fun format(length: Length<*>, driver: FormattingDriver): String {
+ override fun format(length: Length<*>, driver: FormattingDriver): String = run {
val noFractionContext = driver.formattingContext.newBuilder().withPrecision(0).build()
val noFractionDriver = driver.newBuilder().withFormattingContext(noFractionContext).build()
val parts = length.formatUnitParts(noFractionDriver)
- return when {
+ when {
parts.isEmpty() -> fallbackFormatter.format(length, noFractionDriver)
else -> parts.joinToString(partSeparator)
}
diff --git a/sample/src/main/java/io/mehow/ruler/sample/SampleActivity.kt b/sample/src/main/java/io/mehow/ruler/sample/SampleActivity.kt
index c76d5d05..6eba6cf6 100644
--- a/sample/src/main/java/io/mehow/ruler/sample/SampleActivity.kt
+++ b/sample/src/main/java/io/mehow/ruler/sample/SampleActivity.kt
@@ -23,6 +23,7 @@ import io.mehow.ruler.SiLengthUnit.Micrometer
import io.mehow.ruler.SiLengthUnit.Millimeter
import io.mehow.ruler.SiLengthUnit.Nanometer
+@Suppress("ReturnStatement")
internal class SampleActivity : Activity() {
override fun onCreate(inState: Bundle?) {
super.onCreate(inState)
diff --git a/sample/src/main/java/io/mehow/ruler/sample/UnitAdapter.kt b/sample/src/main/java/io/mehow/ruler/sample/UnitAdapter.kt
index 999ad7eb..620c05c8 100644
--- a/sample/src/main/java/io/mehow/ruler/sample/UnitAdapter.kt
+++ b/sample/src/main/java/io/mehow/ruler/sample/UnitAdapter.kt
@@ -11,7 +11,7 @@ import io.mehow.ruler.sample.R.layout
internal class UnitAdapter : BaseAdapter() {
private val units = LengthUnit.units
- override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup): View = run {
val inflater = LayoutInflater.from(parent.context)
val viewHolder = if (convertView == null) {
val view = inflater.inflate(layout.io_mehow_ruler_unit_spinner_item, parent, false)
@@ -20,10 +20,10 @@ internal class UnitAdapter : BaseAdapter() {
convertView.tag as UnitViewHolder
}
viewHolder.bind(getItem(position))
- return viewHolder.item
+ viewHolder.item
}
- override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
+ override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View = run {
val inflater = LayoutInflater.from(parent.context)
val viewHolder = if (convertView == null) {
val view = inflater.inflate(layout.io_mehow_ruler_unit_drop_down_item, parent, false)
@@ -32,7 +32,7 @@ internal class UnitAdapter : BaseAdapter() {
convertView.tag as UnitViewHolder
}
viewHolder.bind(getItem(position))
- return viewHolder.item
+ viewHolder.item
}
override fun getCount() = units.size
diff --git a/sample/src/main/java/io/mehow/ruler/sample/UnitViewGroup.kt b/sample/src/main/java/io/mehow/ruler/sample/UnitViewGroup.kt
index c088d32d..d93861a1 100644
--- a/sample/src/main/java/io/mehow/ruler/sample/UnitViewGroup.kt
+++ b/sample/src/main/java/io/mehow/ruler/sample/UnitViewGroup.kt
@@ -8,6 +8,7 @@ import androidx.appcompat.widget.AppCompatSpinner
import io.mehow.ruler.LengthUnit
import androidx.appcompat.R as AppCompatR
+@Suppress("VariableDefinition")
internal class UnitViewGroup @JvmOverloads constructor(
context: Context,
attrs: AttributeSet,