saveourtool / diktat

Strict coding standard for Kotlin and a custom set of rules for detecting code smells, code style issues and bugs
https://diktat.saveourtool.com
MIT License
521 stars 39 forks source link

KdocMethods assertion failed #1650

Open sanyavertolet opened 1 year ago

sanyavertolet commented 1 year ago

Describe the bug

Got exception on ./gradlew diktatFix

ERROR: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
java.lang.Throwable: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:201)
        at org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.CompositeElement.addChild(CompositeElement.java:571)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:350)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix(Warnings.kt:267)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix$default(Warnings.kt:209)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.handleParamCheck(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.checkSignatureDescription(KdocMethods.kt:128)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.logic(KdocMethods.kt:93)
        at org.cqfn.diktat.ruleset.rules.DiktatRule.visit(DiktatRule.kt:63)
        at org.cqfn.diktat.ruleset.rules.OrderedRuleSet$Companion$OrderedRule.visit(OrderedRuleSet.kt:92)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:251)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:244)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:236)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:237)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:115)
        at com.pinterest.ktlint.core.KtLint.format(KtLint.kt:244)
        at com.pinterest.ktlint.internal.FileUtilsKt.formatFile(FileUtils.kt:202)
        at com.pinterest.ktlint.internal.KtlintCommandLine.process(KtlintCommandLine.kt:355)
        at com.pinterest.ktlint.internal.KtlintCommandLine.access$process(KtlintCommandLine.kt:48)
        at com.pinterest.ktlint.internal.KtlintCommandLine$lintFiles$3.invoke$lambda-1(KtlintCommandLine.kt:274)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)
18:08:00.317 [pool-1-thread-2] ERROR org.cqfn.diktat.ruleset.rules.DiktatRule - Internal error has occurred in rule [diktat-ruleset:kdoc-methods]. Please make an issue on this bug at https://github.com/saveourtool/diKTat/.
                       As a workaround you can disable these inspections in yml config: <[KDOC_TRIVIAL_KDOC_ON_FUNCTION, KDOC_WITHOUT_PARAM_TAG, KDOC_WITHOUT_RETURN_TAG, KDOC_WITHOUT_THROWS_TAG, MISSING_KDOC_ON_FUNCTION]>.
                       Root cause of the problem is in [/Users/sanyavertolet/StudioProjects/iomt-android1/app/src/main/java/com/iomt/android/jetpack/components/textfield/Cell.kt] file.
java.lang.AssertionError: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.DefaultLogger.error(DefaultLogger.java:57)
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.error(Logger.java:187)
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:201)
        at org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.CompositeElement.addChild(CompositeElement.java:571)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:350)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix(Warnings.kt:267)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix$default(Warnings.kt:209)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.handleParamCheck(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.checkSignatureDescription(KdocMethods.kt:128)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.logic(KdocMethods.kt:93)
        at org.cqfn.diktat.ruleset.rules.DiktatRule.visit(DiktatRule.kt:63)
        at org.cqfn.diktat.ruleset.rules.OrderedRuleSet$Companion$OrderedRule.visit(OrderedRuleSet.kt:92)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:251)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:244)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:236)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:237)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:115)
        at com.pinterest.ktlint.core.KtLint.format(KtLint.kt:244)
        at com.pinterest.ktlint.internal.FileUtilsKt.formatFile(FileUtils.kt:202)
        at com.pinterest.ktlint.internal.KtlintCommandLine.process(KtlintCommandLine.kt:355)
        at com.pinterest.ktlint.internal.KtlintCommandLine.access$process(KtlintCommandLine.kt:48)
        at com.pinterest.ktlint.internal.KtlintCommandLine$lintFiles$3.invoke$lambda-1(KtlintCommandLine.kt:274)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.Throwable: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
        ... 28 common frames omitted
Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.Error: Internal error in diktat application
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at com.pinterest.ktlint.internal.KtlintCommandLine.parallel(KtlintCommandLine.kt:578)
        at com.pinterest.ktlint.internal.KtlintCommandLine.parallel$default(KtlintCommandLine.kt:536)
        at com.pinterest.ktlint.internal.KtlintCommandLine.lintFiles(KtlintCommandLine.kt:283)
        at com.pinterest.ktlint.internal.KtlintCommandLine.run(KtlintCommandLine.kt:235)
        at com.pinterest.ktlint.Main.main(Main.kt:31)
Caused by: java.lang.Error: Internal error in diktat application
        at org.cqfn.diktat.ruleset.rules.DiktatRule.visit(DiktatRule.kt:74)
        at org.cqfn.diktat.ruleset.rules.OrderedRuleSet$Companion$OrderedRule.visit(OrderedRuleSet.kt:92)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:251)
        at com.pinterest.ktlint.core.KtLint$format$1.invoke(KtLint.kt:244)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1$1$1$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:236)
        at com.pinterest.ktlint.core.ast.PackageKt.visit(package.kt:237)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:123)
        at com.pinterest.ktlint.core.internal.VisitorProvider$sequentialVisitor$1.invoke(VisitorProvider.kt:115)
        at com.pinterest.ktlint.core.KtLint.format(KtLint.kt:244)
        at com.pinterest.ktlint.internal.FileUtilsKt.formatFile(FileUtils.kt:202)
        at com.pinterest.ktlint.internal.KtlintCommandLine.process(KtlintCommandLine.kt:355)
        at com.pinterest.ktlint.internal.KtlintCommandLine.access$process(KtlintCommandLine.kt:48)
        at com.pinterest.ktlint.internal.KtlintCommandLine$lintFiles$3.invoke$lambda-1(KtlintCommandLine.kt:274)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.AssertionError: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.DefaultLogger.error(DefaultLogger.java:57)
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.error(Logger.java:187)
        at org.jetbrains.kotlin.com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:201)
        at org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.CompositeElement.addChild(CompositeElement.java:571)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:350)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods$handleParamCheck$2.invoke(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix(Warnings.kt:267)
        at org.cqfn.diktat.ruleset.constants.Warnings.warnAndFix$default(Warnings.kt:209)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.handleParamCheck(KdocMethods.kt:225)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.checkSignatureDescription(KdocMethods.kt:128)
        at org.cqfn.diktat.ruleset.rules.chapter2.kdoc.KdocMethods.logic(KdocMethods.kt:93)
        at org.cqfn.diktat.ruleset.rules.DiktatRule.visit(DiktatRule.kt:63)
        ... 18 more
Caused by: java.lang.Throwable: Assertion failed: anchorBefore == null || anchorBefore.getTreeParent() == parent
        ... 28 more

on code like:

/**
 * @property value current cell value
 * @property validator callback that validates the value
 * @property onValueChange callback invoked on [value] change
 * @return [Cell] for height
 */
fun heightCell(
    value: String,
    validator: ((String) -> Boolean)? = null,
    onValueChange: (String) -> Unit,
) = Cell(value, R.drawable.height, "height", validator, onValueChange)

Expected behavior

Either replace @property with @param or message like that:

[KDOC_WITHOUT_PARAM_TAG] all methods which take arguments should have @param tags in KDoc: heightCell (value, validator, onValueChange) (diktat-ruleset:kdoc-methods)

Observed behavior

Exception that leads to diktat crush

Reproducer

/**
 * @property value
 * @return Unit
 */
fun foo(value: String) = Unit

Environment information

paul-dingemans commented 1 year ago

I have seen similar problems when investigating/resolving https://github.com/pinterest/ktlint/issues/1981.

orchestr7 commented 1 year ago

I have seen similar problems when investigating/resolving pinterest/ktlint#1981.

Thank you, this is important, we will have a look

nulls commented 8 months ago

Created a branch with tests which reproduce the issue: https://github.com/saveourtool/diktat/tree/bugfix/error-kdoc-fixing%231650

Looks like @property leads to invalid detecting a prev node before @return or @throw