Move HLApplicator from fir ide module to frontend-independent
This commit is contained in:
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.api.fe10.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.idea.api.ResolveAllowanceService
|
||||||
|
|
||||||
|
class ResolveAllowanceServiceFE10Impl: ResolveAllowanceService() {
|
||||||
|
override fun switchOnAllowingResolveInEdtInCurrentThread(): SwitchResult {
|
||||||
|
return SwitchResult.ALREADY_SWITCHED
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isResolveOnEdtInCurrentThreadAllowed(): Boolean = true
|
||||||
|
|
||||||
|
override fun switchOffAllowingResolveInEdtInCurrentThread() {}
|
||||||
|
|
||||||
|
override fun switchOnForbidResolveInCurrentThread(actionName: String): SwitchResult {
|
||||||
|
return SwitchResult.ALREADY_SWITCHED
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun switchOffForbidResolveInCurrentThread() {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getResolveInCurrentThreadForbiddenReason(): String? = null
|
||||||
|
}
|
||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.api
|
package org.jetbrains.kotlin.idea.fir.api
|
||||||
|
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInputProvider
|
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInputProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticCheckerFilter
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticCheckerFilter
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import com.intellij.codeInspection.*
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.*
|
import org.jetbrains.kotlin.idea.fir.api.applicator.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
|
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.analyseWithReadAction
|
import org.jetbrains.kotlin.idea.frontend.api.analyseWithReadAction
|
||||||
@@ -33,7 +35,7 @@ abstract class AbstractHLInspection<PSI : KtElement, INPUT : HLApplicatorInput>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun visitTargetElement(element: PSI, holder: ProblemsHolder, isOnTheFly: Boolean) {
|
private fun visitTargetElement(element: PSI, holder: ProblemsHolder, isOnTheFly: Boolean) {
|
||||||
if (!applicator.isApplicableByPsi(element)) return
|
if (!applicator.isApplicableByPsi(element, holder.project)) return
|
||||||
val targets = applicabilityRange.getApplicabilityRanges(element)
|
val targets = applicabilityRange.getApplicabilityRanges(element)
|
||||||
if (targets.isEmpty()) return
|
if (targets.isEmpty()) return
|
||||||
|
|
||||||
@@ -101,7 +103,7 @@ private fun <PSI : PsiElement, INPUT : HLApplicatorInput> HLApplicator<PSI, INPU
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val element = descriptor.psiElement as PSI
|
val element = descriptor.psiElement as PSI
|
||||||
|
|
||||||
if (isApplicableByPsi(element) && input.isValidFor(element)) {
|
if (isApplicableByPsi(element, project) && input.isValidFor(element)) {
|
||||||
applyTo(element, input, project, editor = null)
|
applyTo(element, input, project, editor = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.idea.fir.api
|
|||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicabilityRange
|
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicabilityRange
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicator
|
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInputProvider
|
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInputProvider
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
|
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.analyseWithReadAction
|
import org.jetbrains.kotlin.idea.frontend.api.analyseWithReadAction
|
||||||
@@ -22,7 +22,8 @@ abstract class AbstractHLIntention<PSI : KtElement, INPUT : HLApplicatorInput>(
|
|||||||
elementType: KClass<PSI>,
|
elementType: KClass<PSI>,
|
||||||
) : SelfTargetingIntention<PSI>(elementType.java, { "" }, { "" }) {
|
) : SelfTargetingIntention<PSI>(elementType.java, { "" }, { "" }) {
|
||||||
final override fun isApplicableTo(element: PSI, caretOffset: Int): Boolean {
|
final override fun isApplicableTo(element: PSI, caretOffset: Int): Boolean {
|
||||||
if (!applicator.isApplicableByPsi(element)) return false
|
val project = element.project// TODO expensive operation, may require traversing the tree up to containing PsiFile
|
||||||
|
if (!applicator.isApplicableByPsi(element, project)) return false
|
||||||
val ranges = applicabilityRange.getApplicabilityRanges(element)
|
val ranges = applicabilityRange.getApplicabilityRanges(element)
|
||||||
if (ranges.isEmpty()) return false
|
if (ranges.isEmpty()) return false
|
||||||
val input = getInput(element)
|
val input = getInput(element)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.api
|
package org.jetbrains.kotlin.idea.fir.api
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
|
||||||
|
|
||||||
|
|||||||
+1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.api.applicator
|
package org.jetbrains.kotlin.idea.fir.api.applicator
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.api.fixes
|
package org.jetbrains.kotlin.idea.fir.api.fixes
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
|
|
||||||
class HLApplicatorTargetWithInput<PSI : PsiElement, INPUT : HLApplicatorInput>(
|
class HLApplicatorTargetWithInput<PSI : PsiElement, INPUT : HLApplicatorInput>(
|
||||||
val target: PSI,
|
val target: PSI,
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.fir.api.fixes
|
|||||||
|
|
||||||
import com.intellij.codeInsight.intention.IntentionAction
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicator
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.fir.api.fixes
|
|||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicator
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
|
import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ class HLQuickFix<PSI : PsiElement, in INPUT : HLApplicatorInput>(
|
|||||||
) : KotlinQuickFixAction<PSI>(target) {
|
) : KotlinQuickFixAction<PSI>(target) {
|
||||||
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||||
val element = element ?: return
|
val element = element ?: return
|
||||||
if (applicator.isApplicableByPsi(element) && input.isValidFor(element)) {
|
if (applicator.isApplicableByPsi(element, project) && input.isValidFor(element)) {
|
||||||
applicator.applyTo(element, input, project, editor)
|
applicator.applyTo(element, input, project, editor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.fir.api.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.idea.api.ResolveAllowanceService
|
||||||
|
import org.jetbrains.kotlin.miniStdLib.multithreadings.javaThreadLocal
|
||||||
|
|
||||||
|
class ResolveAllowanceServiceFirImpl : ResolveAllowanceService() {
|
||||||
|
private var allowResolveOnEdt by javaThreadLocal(false)
|
||||||
|
private var forbidResolve by javaThreadLocal<String?>(null)
|
||||||
|
|
||||||
|
override fun switchOnAllowingResolveInEdtInCurrentThread(): SwitchResult {
|
||||||
|
if (allowResolveOnEdt) {
|
||||||
|
return SwitchResult.ALREADY_SWITCHED
|
||||||
|
} else {
|
||||||
|
allowResolveOnEdt = true
|
||||||
|
return SwitchResult.SWITCHED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun switchOffAllowingResolveInEdtInCurrentThread() {
|
||||||
|
allowResolveOnEdt = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isResolveOnEdtInCurrentThreadAllowed(): Boolean = allowResolveOnEdt
|
||||||
|
|
||||||
|
override fun switchOnForbidResolveInCurrentThread(actionName: String): SwitchResult {
|
||||||
|
if (forbidResolve != null) {
|
||||||
|
return SwitchResult.ALREADY_SWITCHED
|
||||||
|
} else {
|
||||||
|
forbidResolve = actionName
|
||||||
|
return SwitchResult.SWITCHED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun switchOffForbidResolveInCurrentThread() {
|
||||||
|
forbidResolve = null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getResolveInCurrentThreadForbiddenReason(): String? = forbidResolve
|
||||||
|
}
|
||||||
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.fir.applicators
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.applicabilityTarget
|
import org.jetbrains.kotlin.idea.fir.api.applicator.applicabilityTarget
|
||||||
import org.jetbrains.kotlin.idea.refactoring.safeDelete.removeOverrideModifier
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||||
|
|||||||
+2
-2
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.fir.applicators
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.applicator
|
import org.jetbrains.kotlin.idea.api.applicator.applicator
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeRendererOptions
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeRendererOptions
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.fir.applicators
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.applicator
|
import org.jetbrains.kotlin.idea.api.applicator.applicator
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,9 +9,9 @@ import com.intellij.codeInspection.CleanupLocalInspectionTool
|
|||||||
import com.intellij.codeInspection.ProblemHighlightType
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.fir.api.*
|
import org.jetbrains.kotlin.idea.fir.api.*
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.with
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.presentation
|
import org.jetbrains.kotlin.idea.fir.api.applicator.presentation
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.with
|
|
||||||
import org.jetbrains.kotlin.idea.fir.applicators.ApplicabilityRanges
|
import org.jetbrains.kotlin.idea.fir.applicators.ApplicabilityRanges
|
||||||
import org.jetbrains.kotlin.idea.fir.applicators.CallableReturnTypeUpdaterApplicator
|
import org.jetbrains.kotlin.idea.fir.applicators.CallableReturnTypeUpdaterApplicator
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.isUnit
|
import org.jetbrains.kotlin.idea.frontend.api.types.isUnit
|
||||||
|
|||||||
+2
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.idea.fir.inspections.diagnosticBased
|
|||||||
|
|
||||||
import com.intellij.codeInspection.ProblemHighlightType
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.with
|
||||||
import org.jetbrains.kotlin.idea.fir.api.AbstractHLDiagnosticBasedInspection
|
import org.jetbrains.kotlin.idea.fir.api.AbstractHLDiagnosticBasedInspection
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.*
|
import org.jetbrains.kotlin.idea.fir.api.applicator.*
|
||||||
import org.jetbrains.kotlin.idea.fir.api.inputByDiagnosticProvider
|
import org.jetbrains.kotlin.idea.fir.api.inputByDiagnosticProvider
|
||||||
|
|||||||
+1
-1
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.idea.fir.intentions.declarations
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.fir.api.*
|
import org.jetbrains.kotlin.idea.fir.api.*
|
||||||
|
import org.jetbrains.kotlin.idea.api.applicator.with
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicabilityRange
|
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicabilityRange
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
import org.jetbrains.kotlin.idea.fir.api.applicator.inputProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.with
|
|
||||||
import org.jetbrains.kotlin.idea.fir.applicators.ApplicabilityRanges
|
import org.jetbrains.kotlin.idea.fir.applicators.ApplicabilityRanges
|
||||||
import org.jetbrains.kotlin.idea.fir.applicators.CallableReturnTypeUpdaterApplicator
|
import org.jetbrains.kotlin.idea.fir.applicators.CallableReturnTypeUpdaterApplicator
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|||||||
+2
-3
@@ -7,9 +7,8 @@ package org.jetbrains.kotlin.idea.quickfix.fixes
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.util.parentOfType
|
import com.intellij.psi.util.parentOfType
|
||||||
import org.jetbrains.kotlin.idea.fir.api.*
|
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput
|
import org.jetbrains.kotlin.idea.api.applicator.applicator
|
||||||
import org.jetbrains.kotlin.idea.fir.api.applicator.applicator
|
|
||||||
import org.jetbrains.kotlin.idea.fir.api.fixes.HLApplicatorTargetWithInput
|
import org.jetbrains.kotlin.idea.fir.api.fixes.HLApplicatorTargetWithInput
|
||||||
import org.jetbrains.kotlin.idea.fir.api.fixes.diagnosticFixFactory
|
import org.jetbrains.kotlin.idea.fir.api.fixes.diagnosticFixFactory
|
||||||
import org.jetbrains.kotlin.idea.fir.api.fixes.withInput
|
import org.jetbrains.kotlin.idea.fir.api.fixes.withInput
|
||||||
|
|||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.api
|
||||||
|
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
|
||||||
|
abstract class ResolveAllowanceService {
|
||||||
|
abstract fun switchOnAllowingResolveInEdtInCurrentThread(): SwitchResult
|
||||||
|
abstract fun switchOffAllowingResolveInEdtInCurrentThread()
|
||||||
|
abstract fun isResolveOnEdtInCurrentThreadAllowed(): Boolean
|
||||||
|
|
||||||
|
abstract fun switchOnForbidResolveInCurrentThread(actionName: String): SwitchResult
|
||||||
|
abstract fun switchOffForbidResolveInCurrentThread()
|
||||||
|
abstract fun getResolveInCurrentThreadForbiddenReason(): String?
|
||||||
|
|
||||||
|
enum class SwitchResult {
|
||||||
|
SWITCHED,
|
||||||
|
ALREADY_SWITCHED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> allowResolveInEdtIn(project: Project, block: () -> T): T {
|
||||||
|
val resolveAllowanceService = project.service<ResolveAllowanceService>()
|
||||||
|
return when (resolveAllowanceService.switchOnAllowingResolveInEdtInCurrentThread()) {
|
||||||
|
ResolveAllowanceService.SwitchResult.SWITCHED -> {
|
||||||
|
try {
|
||||||
|
block()
|
||||||
|
} finally {
|
||||||
|
resolveAllowanceService.switchOffAllowingResolveInEdtInCurrentThread()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResolveAllowanceService.SwitchResult.ALREADY_SWITCHED -> {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <T> forbidResolveIn(project: Project, actionName: String, block: () -> T): T {
|
||||||
|
val resolveAllowanceService = project.service<ResolveAllowanceService>()
|
||||||
|
return when (resolveAllowanceService.switchOnForbidResolveInCurrentThread(actionName)) {
|
||||||
|
ResolveAllowanceService.SwitchResult.SWITCHED -> {
|
||||||
|
try {
|
||||||
|
block()
|
||||||
|
} finally {
|
||||||
|
resolveAllowanceService.switchOffForbidResolveInCurrentThread()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResolveAllowanceService.SwitchResult.ALREADY_SWITCHED -> {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
-11
@@ -3,14 +3,14 @@
|
|||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.api.applicator
|
package org.jetbrains.kotlin.idea.api.applicator
|
||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline
|
import org.jetbrains.kotlin.idea.api.forbidResolveIn
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.ForbidKtResolve
|
|
||||||
import org.jetbrains.kotlin.idea.quickfix.KotlinPsiOnlyQuickFixAction
|
import org.jetbrains.kotlin.idea.quickfix.KotlinPsiOnlyQuickFixAction
|
||||||
|
import org.jetbrains.kotlin.miniStdLib.annotations.PrivateForInline
|
||||||
import kotlin.experimental.ExperimentalTypeInference
|
import kotlin.experimental.ExperimentalTypeInference
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
@@ -28,14 +28,14 @@ sealed class HLApplicator<in PSI : PsiElement, in INPUT : HLApplicatorInput> {
|
|||||||
* @param psi a [PsiElement] to apply fix to
|
* @param psi a [PsiElement] to apply fix to
|
||||||
* @param input additional data needed to apply the fix, the [input] can be collected by [HLApplicatorInputProvider
|
* @param input additional data needed to apply the fix, the [input] can be collected by [HLApplicatorInputProvider
|
||||||
*/
|
*/
|
||||||
fun applyTo(psi: PSI, input: INPUT, project: Project, editor: Editor?) = ForbidKtResolve.forbidResolveIn("HLApplicator.applyTo") {
|
fun applyTo(psi: PSI, input: INPUT, project: Project, editor: Editor?) = forbidResolveIn(project, "HLApplicator.applyTo") {
|
||||||
applyToImpl(psi, input, project, editor)
|
applyToImpl(psi, input, project, editor)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if applicator is applicable to specific element, can not use resolve inside
|
* Checks if applicator is applicable to specific element, can not use resolve inside
|
||||||
*/
|
*/
|
||||||
fun isApplicableByPsi(psi: PSI): Boolean = ForbidKtResolve.forbidResolveIn("HLApplicator.isApplicableByPsi") {
|
fun isApplicableByPsi(psi: PSI, project: Project): Boolean = forbidResolveIn(project, "HLApplicator.isApplicableByPsi") {
|
||||||
isApplicableByPsiImpl(psi)
|
isApplicableByPsiImpl(psi)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,18 +44,16 @@ sealed class HLApplicator<in PSI : PsiElement, in INPUT : HLApplicatorInput> {
|
|||||||
*
|
*
|
||||||
* @see com.intellij.codeInsight.intention.IntentionAction.getText
|
* @see com.intellij.codeInsight.intention.IntentionAction.getText
|
||||||
*/
|
*/
|
||||||
fun getActionName(psi: PSI, input: INPUT): String = ForbidKtResolve.forbidResolveIn("HLApplicator.getActionName") {
|
fun getActionName(psi: PSI, input: INPUT): String = getActionNameImpl(psi, input)
|
||||||
getActionNameImpl(psi, input)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Family name which will be used in inspections/intentions
|
* Family name which will be used in inspections/intentions
|
||||||
*
|
*
|
||||||
* @see com.intellij.codeInsight.intention.IntentionAction.getFamilyName
|
* @see com.intellij.codeInsight.intention.IntentionAction.getFamilyName
|
||||||
*/
|
*/
|
||||||
fun getFamilyName(): String = ForbidKtResolve.forbidResolveIn("HLApplicator.getFamilyName") {
|
fun getFamilyName(): String = getFamilyNameImpl()
|
||||||
getFamilyNameImpl()
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract fun applyToImpl(psi: PSI, input: INPUT, project: Project, editor: Editor?)
|
protected abstract fun applyToImpl(psi: PSI, input: INPUT, project: Project, editor: Editor?)
|
||||||
protected abstract fun isApplicableByPsiImpl(psi: PSI): Boolean
|
protected abstract fun isApplicableByPsiImpl(psi: PSI): Boolean
|
||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.api.applicator
|
package org.jetbrains.kotlin.idea.api.applicator
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.miniStdLib.annotations
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This annotation should be used when the declaration is semantically inline
|
||||||
|
* but cannot be marked as such because it should be used in some inline function
|
||||||
|
*/
|
||||||
|
@RequiresOptIn
|
||||||
|
annotation class PrivateForInline
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.miniStdLib.multithreadings
|
||||||
|
|
||||||
|
import kotlin.properties.ReadWriteProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
@JvmInline
|
||||||
|
value class JavaThreadLocalDelegate<V> internal constructor(private val threadLocal: ThreadLocal<V>): ReadWriteProperty<Any?, V> {
|
||||||
|
override fun getValue(thisRef: Any?, property: KProperty<*>): V {
|
||||||
|
return threadLocal.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) {
|
||||||
|
threadLocal.set(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> javaThreadLocal(initialValue: () -> T): JavaThreadLocalDelegate<T> =
|
||||||
|
JavaThreadLocalDelegate(ThreadLocal.withInitial(initialValue))
|
||||||
|
|
||||||
|
fun <T> javaThreadLocal(initialValue: T): JavaThreadLocalDelegate<T> =
|
||||||
|
JavaThreadLocalDelegate(ThreadLocal.withInitial { initialValue })
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This package should be moved to separate module
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.miniStdLib
|
||||||
@@ -164,6 +164,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
|||||||
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
|
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
|
||||||
serviceImplementation="org.jetbrains.kotlin.trackers.KotlinFE10OutOfBlockModificationTracker"/>
|
serviceImplementation="org.jetbrains.kotlin.trackers.KotlinFE10OutOfBlockModificationTracker"/>
|
||||||
|
|
||||||
|
<projectService serviceImplementation="org.jetbrains.kotlin.idea.api.fe10.impl.ResolveAllowanceServiceFE10Impl"
|
||||||
|
serviceInterface="org.jetbrains.kotlin.idea.api.ResolveAllowanceService"/>
|
||||||
|
|
||||||
<statistics.counterUsagesCollector groupId="kotlin.gradle.target" version="2"/>
|
<statistics.counterUsagesCollector groupId="kotlin.gradle.target" version="2"/>
|
||||||
<statistics.counterUsagesCollector groupId="kotlin.maven.target" version="3"/>
|
<statistics.counterUsagesCollector groupId="kotlin.maven.target" version="3"/>
|
||||||
|
|||||||
@@ -135,6 +135,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
|
|||||||
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
|
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory"/>
|
||||||
<psi.treeChangePreprocessor implementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinOutOfBlockPsiTreeChangePreprocessor"/>
|
<psi.treeChangePreprocessor implementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinOutOfBlockPsiTreeChangePreprocessor"/>
|
||||||
|
<projectService serviceImplementation="org.jetbrains.kotlin.idea.fir.api.impl.ResolveAllowanceServiceFirImpl"
|
||||||
|
serviceInterface="org.jetbrains.kotlin.idea.api.ResolveAllowanceService"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
<!-- scripts -->
|
<!-- scripts -->
|
||||||
|
|||||||
Reference in New Issue
Block a user