Skip to content

Commit

Permalink
Stop applying treeCopyHandler extension in analysis environment
Browse files Browse the repository at this point in the history
This was previously used by ktlint to support autocorrect for some rules,
but is being phased out due to pinterest/ktlint#1981.
detekt should do the same. This has no impact on any core rules, or the
formatting module (since ktlint no longer depends on this extension as of
ktlint v0.50.0).

This will impact third party rule sets, only if:
- they support autocorrect, and
- autocorrect support relies on the treeCopyHandler extension

ktlint rules were updated to remove the dependency on treeCopyHandler, so
affected third party detekt rule sets can do the same.

This is all being caused by upstream changes in Kotlin. There's some very
useful analysis in pinterest/ktlint#2044 that can
be reviewed by anyone affected downstream by this change.
  • Loading branch information
3flex committed Jul 4, 2023
1 parent 0209143 commit 024c701
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -1,44 +1,18 @@
package io.github.detekt.parser

import io.github.davidburstrom.contester.ConTesterBreakpoint
import org.jetbrains.kotlin.com.intellij.openapi.extensions.ExtensionPoint
import org.jetbrains.kotlin.com.intellij.openapi.extensions.Extensions.getRootArea
import org.jetbrains.kotlin.com.intellij.openapi.project.Project
import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolderBase
import org.jetbrains.kotlin.com.intellij.pom.PomModel
import org.jetbrains.kotlin.com.intellij.pom.PomModelAspect
import org.jetbrains.kotlin.com.intellij.pom.PomTransaction
import org.jetbrains.kotlin.com.intellij.pom.impl.PomTransactionBase
import org.jetbrains.kotlin.com.intellij.pom.tree.TreeAspect
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.TreeCopyHandler
import sun.reflect.ReflectionFactory

/**
* Adapted from https://github.com/pinterest/ktlint/blob/master/ktlint-core/src/main/kotlin/com/pinterest/ktlint/core/internal/KotlinPsiFileFactory.kt
* Adapted from https://github.com/pinterest/ktlint/blob/0.50.0/ktlint-rule-engine/src/main/kotlin/com/pinterest/ktlint/rule/engine/internal/KotlinPsiFileFactory.kt
* Licenced under the MIT licence - https://github.com/pinterest/ktlint/blob/master/LICENSE
*/
class DetektPomModel(project: Project) : UserDataHolderBase(), PomModel {

init {
val extension = "org.jetbrains.kotlin.com.intellij.treeCopyHandler"
val extensionClass = TreeCopyHandler::class.java.name
@Suppress("DEPRECATION")
for (extensionArea in listOf(project.extensionArea, getRootArea())) {
// Addresses https://github.com/detekt/detekt/issues/4609
synchronized(extensionArea) {
if (!extensionArea.hasExtensionPoint(extension)) {
ConTesterBreakpoint.defineBreakpoint("DetektPomModel.registerExtensionPoint") {
extensionArea == getRootArea()
}
extensionArea.registerExtensionPoint(
extension,
extensionClass,
ExtensionPoint.Kind.INTERFACE
)
}
}
}
}
object DetektPomModel : UserDataHolderBase(), PomModel {

override fun runTransaction(transaction: PomTransaction) {
val transactionCandidate = transaction as? PomTransactionBase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ fun createKotlinCoreEnvironment(
"MockProject type expected, actual - ${projectCandidate.javaClass.simpleName}"
}

project.registerService(PomModel::class.java, DetektPomModel(project))
project.registerService(PomModel::class.java, DetektPomModel)

return environment
}
Expand Down

0 comments on commit 024c701

Please sign in to comment.