From 5335f81835b75b528c1002599dbdc38ed9e49ae9 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 8 May 2022 15:36:09 +0300 Subject: [PATCH 1/4] Improve exception message Report detailed location of an error. --- .../gitlab/arturbosch/detekt/core/Analyzer.kt | 5 ++++ .../arturbosch/detekt/core/AnalyzerSpec.kt | 26 +++++++++++++++++++ .../configs/config-value-type-correct.yml | 2 ++ 3 files changed, 33 insertions(+) diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt index ea0641521fb..831d8e8c371 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt @@ -153,8 +153,13 @@ private fun MutableMap>.mergeSmells(other: Map ${it.className} => ${it.methodName} => ${it.lineNumber}." + } ?: "Unknown." + val message = """ Analyzing ${file.absolutePath()} led to an exception. + Location: $location The original exception message was: ${error.localizedMessage} Running detekt '${whichDetekt() ?: "unknown"}' on Java '${whichJava()}' on OS '${whichOS()}' If the exception message does not help, please feel free to create an issue on our GitHub page. diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt index df4c53566dd..f444e24b856 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt @@ -86,6 +86,20 @@ class AnalyzerSpec { assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }).isEmpty() } + + @Test + fun `with faulty rule`() { + val testFile = path.resolve("Test.kt") + val settings = createProcessingSettings( + testFile, + yamlConfig("configs/config-value-type-correct.yml") + ) + val analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider()), emptyList()) + + assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } + .hasCauseInstanceOf(IllegalStateException::class.java) + .hasMessageContaining(FaultyRule::class.java.name) + } } } @@ -106,3 +120,15 @@ private class MaxLineLength(config: Config, threshold: Int?) : Rule(config) { } } } + +private class FaultyRuleSetProvider : RuleSetProvider { + override val ruleSetId: String = "style" + override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRule(config))) +} + +private class FaultyRule(config: Config) : Rule(config) { + override val issue = Issue(this::class.java.simpleName, Severity.Style, "", Debt.FIVE_MINS) + override fun visitKtFile(file: KtFile) { + error("Deliberately triggered error.") + } +} diff --git a/detekt-core/src/test/resources/configs/config-value-type-correct.yml b/detekt-core/src/test/resources/configs/config-value-type-correct.yml index a3109a61d11..554881e357c 100644 --- a/detekt-core/src/test/resources/configs/config-value-type-correct.yml +++ b/detekt-core/src/test/resources/configs/config-value-type-correct.yml @@ -2,3 +2,5 @@ style: MaxLineLength: active: true maxLineLength: 120 + FaultyRule: + active: true From e5c0f6584b623fd991fe192f0c876391d85af388 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Tue, 10 May 2022 14:07:05 +0300 Subject: [PATCH 2/4] Add test case --- .../arturbosch/detekt/core/AnalyzerSpec.kt | 22 ++++++++++++++----- .../configs/config-value-type-correct.yml | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt index f444e24b856..63d72316ebc 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt @@ -94,11 +94,17 @@ class AnalyzerSpec { testFile, yamlConfig("configs/config-value-type-correct.yml") ) - val analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider()), emptyList()) + var analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider(false)), emptyList()) assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } .hasCauseInstanceOf(IllegalStateException::class.java) .hasMessageContaining(FaultyRule::class.java.name) + + analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider(true)), emptyList()) + + assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } + .hasCauseInstanceOf(IllegalStateException::class.java) + .hasMessageContaining("Unknown.") } } } @@ -121,14 +127,20 @@ private class MaxLineLength(config: Config, threshold: Int?) : Rule(config) { } } -private class FaultyRuleSetProvider : RuleSetProvider { +private class FaultyRuleSetProvider(private val isStackTraceEmpty: Boolean) : RuleSetProvider { override val ruleSetId: String = "style" - override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRule(config))) + override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRule(config, isStackTraceEmpty))) } -private class FaultyRule(config: Config) : Rule(config) { +private class FaultyRule(config: Config, private val isStackTraceEmpty: Boolean) : Rule(config) { override val issue = Issue(this::class.java.simpleName, Severity.Style, "", Debt.FIVE_MINS) override fun visitKtFile(file: KtFile) { - error("Deliberately triggered error.") + throw object : IllegalStateException("Deliberately triggered error.") { + init { + if (isStackTraceEmpty) { + stackTrace = emptyArray() + } + } + } } } diff --git a/detekt-core/src/test/resources/configs/config-value-type-correct.yml b/detekt-core/src/test/resources/configs/config-value-type-correct.yml index 554881e357c..cbbba42840b 100644 --- a/detekt-core/src/test/resources/configs/config-value-type-correct.yml +++ b/detekt-core/src/test/resources/configs/config-value-type-correct.yml @@ -4,3 +4,4 @@ style: maxLineLength: 120 FaultyRule: active: true + isStacktraceEmpty: false From dc43d05e173839b8f1b92e1e6e18292deb19f4ed Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Tue, 10 May 2022 19:31:08 +0300 Subject: [PATCH 3/4] Split tests --- .../arturbosch/detekt/core/AnalyzerSpec.kt | 38 +++++++++++++------ .../configs/config-value-type-correct.yml | 3 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt index 63d72316ebc..4b713972a56 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt @@ -94,13 +94,21 @@ class AnalyzerSpec { testFile, yamlConfig("configs/config-value-type-correct.yml") ) - var analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider(false)), emptyList()) + val analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider()), emptyList()) assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } .hasCauseInstanceOf(IllegalStateException::class.java) .hasMessageContaining(FaultyRule::class.java.name) + } - analyzer = Analyzer(settings, listOf(FaultyRuleSetProvider(true)), emptyList()) + @Test + fun `with faulty rule without stack trace`() { + val testFile = path.resolve("Test.kt") + val settings = createProcessingSettings( + testFile, + yamlConfig("configs/config-value-type-correct.yml") + ) + val analyzer = Analyzer(settings, listOf(FaultyRuleNoStackTraceSetProvider()), emptyList()) assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } .hasCauseInstanceOf(IllegalStateException::class.java) @@ -127,20 +135,28 @@ private class MaxLineLength(config: Config, threshold: Int?) : Rule(config) { } } -private class FaultyRuleSetProvider(private val isStackTraceEmpty: Boolean) : RuleSetProvider { +private class FaultyRuleSetProvider : RuleSetProvider { override val ruleSetId: String = "style" - override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRule(config, isStackTraceEmpty))) + override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRule(config))) } -private class FaultyRule(config: Config, private val isStackTraceEmpty: Boolean) : Rule(config) { +private class FaultyRule(config: Config) : Rule(config) { override val issue = Issue(this::class.java.simpleName, Severity.Style, "", Debt.FIVE_MINS) override fun visitKtFile(file: KtFile) { - throw object : IllegalStateException("Deliberately triggered error.") { - init { - if (isStackTraceEmpty) { - stackTrace = emptyArray() - } - } + throw object : IllegalStateException("Deliberately triggered error.") {} + } +} + +private class FaultyRuleNoStackTraceSetProvider : RuleSetProvider { + override val ruleSetId: String = "style" + override fun instance(config: Config) = RuleSet(ruleSetId, listOf(FaultyRuleNoStackTrace(config))) +} + +private class FaultyRuleNoStackTrace(config: Config) : Rule(config) { + override val issue = Issue(this::class.java.simpleName, Severity.Style, "", Debt.FIVE_MINS) + override fun visitKtFile(file: KtFile) { + throw object : IllegalStateException("Deliberately triggered error without stack trace.") { + init { stackTrace = emptyArray() } } } } diff --git a/detekt-core/src/test/resources/configs/config-value-type-correct.yml b/detekt-core/src/test/resources/configs/config-value-type-correct.yml index cbbba42840b..b512e9f819d 100644 --- a/detekt-core/src/test/resources/configs/config-value-type-correct.yml +++ b/detekt-core/src/test/resources/configs/config-value-type-correct.yml @@ -4,4 +4,5 @@ style: maxLineLength: 120 FaultyRule: active: true - isStacktraceEmpty: false + FaultyRuleNoStackTrace: + active: true From b4740a28e09b5243935a530d946f7c73e85f23bf Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Thu, 12 May 2022 14:36:57 +0300 Subject: [PATCH 4/4] Improve error location message presentation --- .../kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt | 6 +----- .../kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt index 831d8e8c371..3d68a3f2f41 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt @@ -153,13 +153,9 @@ private fun MutableMap>.mergeSmells(other: Map ${it.className} => ${it.methodName} => ${it.lineNumber}." - } ?: "Unknown." - val message = """ Analyzing ${file.absolutePath()} led to an exception. - Location: $location + Location: ${error.stackTrace.firstOrNull()?.toString()} The original exception message was: ${error.localizedMessage} Running detekt '${whichDetekt() ?: "unknown"}' on Java '${whichJava()}' on OS '${whichOS()}' If the exception message does not help, please feel free to create an issue on our GitHub page. diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt index 4b713972a56..79ba0e0c051 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt @@ -98,7 +98,7 @@ class AnalyzerSpec { assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } .hasCauseInstanceOf(IllegalStateException::class.java) - .hasMessageContaining(FaultyRule::class.java.name) + .hasMessageContaining("Location: ${FaultyRule::class.java.name}") } @Test @@ -112,7 +112,7 @@ class AnalyzerSpec { assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } .hasCauseInstanceOf(IllegalStateException::class.java) - .hasMessageContaining("Unknown.") + .hasMessageContaining("Location: ${null}") } } }