From 18ab9c7b25975882a67bbd0c9fefa609120f13b2 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 26 Mar 2021 18:54:56 +0100 Subject: [PATCH] Move HLApplicator from fir ide module to frontend-independent --- .../impl/ResolveAllowanceServiceFE10Impl.kt | 27 +++++++++ .../AbstractHLDiagnosticBasedInspection.kt | 2 +- .../idea/fir/api/AbstractHLInspection.kt | 6 +- .../idea/fir/api/AbstractHLIntention.kt | 7 ++- .../fir/api/HLInputByDiagnosticProvider.kt | 2 +- .../applicator/HLApplicatorInputProvider.kt | 1 + .../api/fixes/HLApplicatorTargetWithInput.kt | 2 +- .../fir/api/fixes/HLDiagnosticFixFactory.kt | 4 +- .../kotlin/idea/fir/api/fixes/HLQuickFix.kt | 6 +- .../impl/ResolveAllowanceServiceFirImpl.kt | 44 +++++++++++++++ .../fir/applicators/ApplicabilityRanges.kt | 1 - .../CallableReturnTypeUpdaterApplicator.kt | 4 +- .../fir/applicators/ModifierApplicators.kt | 4 +- .../HLRedundantUnitReturnTypeInspection.kt | 2 +- ...HLRedundantVisibilityModifierInspection.kt | 2 + ...icitTypeForCallableDeclarationIntention.kt | 2 +- .../ChangeReturnTypeOnOverrideQuickFix.kt | 5 +- .../idea/api/ResolveAllowanceService.kt | 56 +++++++++++++++++++ .../idea}/api/applicator/HLApplicator.kt | 20 +++---- .../idea}/api/applicator/HLApplicatorInput.kt | 2 +- .../annotations/PrivateForInline.kt | 13 +++++ .../miniStdLib/multithreadings/threadLocal.kt | 27 +++++++++ .../kotlin/miniStdLib/package-info.kt | 9 +++ .../resources-descriptors/META-INF/plugin.xml | 2 + idea/resources-fir/META-INF/plugin.xml | 2 + 25 files changed, 217 insertions(+), 35 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/api/fe10/impl/ResolveAllowanceServiceFE10Impl.kt create mode 100644 idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/impl/ResolveAllowanceServiceFirImpl.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/ResolveAllowanceService.kt rename idea/{idea-fir/src/org/jetbrains/kotlin/idea/fir => idea-frontend-independent/src/org/jetbrains/kotlin/idea}/api/applicator/HLApplicator.kt (91%) rename idea/{idea-fir/src/org/jetbrains/kotlin/idea/fir => idea-frontend-independent/src/org/jetbrains/kotlin/idea}/api/applicator/HLApplicatorInput.kt (95%) create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/annotations/PrivateForInline.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/multithreadings/threadLocal.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/package-info.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/api/fe10/impl/ResolveAllowanceServiceFE10Impl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/api/fe10/impl/ResolveAllowanceServiceFE10Impl.kt new file mode 100644 index 00000000000..11f2e2e5b09 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/api/fe10/impl/ResolveAllowanceServiceFE10Impl.kt @@ -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 +} \ No newline at end of file diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLDiagnosticBasedInspection.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLDiagnosticBasedInspection.kt index ded580e5fbb..258f14f5105 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLDiagnosticBasedInspection.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLDiagnosticBasedInspection.kt @@ -5,7 +5,7 @@ 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.inputProvider import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticCheckerFilter diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLInspection.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLInspection.kt index 8b10f8beb73..3f549135288 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLInspection.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/AbstractHLInspection.kt @@ -9,6 +9,8 @@ import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange 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.frontend.api.HackToForceAllowRunningAnalyzeOnEDT import org.jetbrains.kotlin.idea.frontend.api.analyseWithReadAction @@ -33,7 +35,7 @@ abstract class AbstractHLInspection( } 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) if (targets.isEmpty()) return @@ -101,7 +103,7 @@ private fun HLApplicator( elementType: KClass, ) : SelfTargetingIntention(elementType.java, { "" }, { "" }) { 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) if (ranges.isEmpty()) return false val input = getInput(element) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/HLInputByDiagnosticProvider.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/HLInputByDiagnosticProvider.kt index eb069c0018a..9da6b18fdb3 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/HLInputByDiagnosticProvider.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/HLInputByDiagnosticProvider.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.idea.fir.api 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.diagnostics.KtDiagnosticWithPsi diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInputProvider.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInputProvider.kt index 9cd5cffbf74..8d586bfc135 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInputProvider.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInputProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.fir.api.applicator import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession /** diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLApplicatorTargetWithInput.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLApplicatorTargetWithInput.kt index 08df55371e1..40bb4d202ac 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLApplicatorTargetWithInput.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLApplicatorTargetWithInput.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.idea.fir.api.fixes import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput class HLApplicatorTargetWithInput( val target: PSI, diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt index 7ff07601b84..630ab0689f7 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLDiagnosticFixFactory.kt @@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.fir.api.fixes import com.intellij.codeInsight.intention.IntentionAction import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicator -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.HLApplicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLQuickFix.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLQuickFix.kt index 40dc648423a..4e86ff2f260 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLQuickFix.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/fixes/HLQuickFix.kt @@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.fir.api.fixes import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicator -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.HLApplicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.psi.KtFile @@ -20,7 +20,7 @@ class HLQuickFix( ) : KotlinQuickFixAction(target) { override fun invoke(project: Project, editor: Editor?, file: KtFile) { 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) } } diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/impl/ResolveAllowanceServiceFirImpl.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/impl/ResolveAllowanceServiceFirImpl.kt new file mode 100644 index 00000000000..a4f790dc035 --- /dev/null +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/impl/ResolveAllowanceServiceFirImpl.kt @@ -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(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 +} \ No newline at end of file diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt index 9b60bddf435..f74d81104d9 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.fir.applicators import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet 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.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/CallableReturnTypeUpdaterApplicator.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/CallableReturnTypeUpdaterApplicator.kt index 5bdd848ced9..df7c55c0316 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/CallableReturnTypeUpdaterApplicator.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/CallableReturnTypeUpdaterApplicator.kt @@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.fir.applicators import com.intellij.psi.PsiElement import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput -import org.jetbrains.kotlin.idea.fir.api.applicator.applicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.applicator import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeRendererOptions import org.jetbrains.kotlin.idea.frontend.api.types.KtType diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ModifierApplicators.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ModifierApplicators.kt index b0b5025c49d..d2a99e84ca8 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ModifierApplicators.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/applicators/ModifierApplicators.kt @@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.fir.applicators import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput -import org.jetbrains.kotlin.idea.fir.api.applicator.applicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.applicator import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.lexer.KtModifierKeywordToken diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/declarations/HLRedundantUnitReturnTypeInspection.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/declarations/HLRedundantUnitReturnTypeInspection.kt index 9b068ecce16..62ead47272c 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/declarations/HLRedundantUnitReturnTypeInspection.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/declarations/HLRedundantUnitReturnTypeInspection.kt @@ -9,9 +9,9 @@ import com.intellij.codeInspection.CleanupLocalInspectionTool import com.intellij.codeInspection.ProblemHighlightType import org.jetbrains.kotlin.idea.KotlinBundle 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.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.CallableReturnTypeUpdaterApplicator import org.jetbrains.kotlin.idea.frontend.api.types.isUnit diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLRedundantVisibilityModifierInspection.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLRedundantVisibilityModifierInspection.kt index 30d797c6324..54e16a85a2e 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLRedundantVisibilityModifierInspection.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLRedundantVisibilityModifierInspection.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.idea.fir.inspections.diagnosticBased import com.intellij.codeInspection.ProblemHighlightType 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.applicator.* import org.jetbrains.kotlin.idea.fir.api.inputByDiagnosticProvider diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/intentions/declarations/HLSpecifyExplicitTypeForCallableDeclarationIntention.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/intentions/declarations/HLSpecifyExplicitTypeForCallableDeclarationIntention.kt index 6c41a54aabe..61d7f475f5e 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/intentions/declarations/HLSpecifyExplicitTypeForCallableDeclarationIntention.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/intentions/declarations/HLSpecifyExplicitTypeForCallableDeclarationIntention.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.idea.fir.intentions.declarations import org.jetbrains.kotlin.idea.KotlinBundle 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.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.CallableReturnTypeUpdaterApplicator import org.jetbrains.kotlin.psi.* diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt index abdffb60005..74433d1f0c9 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt @@ -7,9 +7,8 @@ package org.jetbrains.kotlin.idea.quickfix.fixes import com.intellij.psi.PsiElement import com.intellij.psi.util.parentOfType -import org.jetbrains.kotlin.idea.fir.api.* -import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicatorInput -import org.jetbrains.kotlin.idea.fir.api.applicator.applicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.applicator 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.withInput diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/ResolveAllowanceService.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/ResolveAllowanceService.kt new file mode 100644 index 00000000000..b15d4f7f559 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/ResolveAllowanceService.kt @@ -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 allowResolveInEdtIn(project: Project, block: () -> T): T { + val resolveAllowanceService = project.service() + return when (resolveAllowanceService.switchOnAllowingResolveInEdtInCurrentThread()) { + ResolveAllowanceService.SwitchResult.SWITCHED -> { + try { + block() + } finally { + resolveAllowanceService.switchOffAllowingResolveInEdtInCurrentThread() + } + } + ResolveAllowanceService.SwitchResult.ALREADY_SWITCHED -> { + block() + } + } +} + +inline fun forbidResolveIn(project: Project, actionName: String, block: () -> T): T { + val resolveAllowanceService = project.service() + return when (resolveAllowanceService.switchOnForbidResolveInCurrentThread(actionName)) { + ResolveAllowanceService.SwitchResult.SWITCHED -> { + try { + block() + } finally { + resolveAllowanceService.switchOffForbidResolveInCurrentThread() + } + } + ResolveAllowanceService.SwitchResult.ALREADY_SWITCHED -> { + block() + } + } +} diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicator.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicator.kt similarity index 91% rename from idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicator.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicator.kt index 95929220f62..5549bf9a854 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicator.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicator.kt @@ -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. */ -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.project.Project import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.PrivateForInline -import org.jetbrains.kotlin.idea.frontend.api.ForbidKtResolve +import org.jetbrains.kotlin.idea.api.forbidResolveIn import org.jetbrains.kotlin.idea.quickfix.KotlinPsiOnlyQuickFixAction +import org.jetbrains.kotlin.miniStdLib.annotations.PrivateForInline import kotlin.experimental.ExperimentalTypeInference import kotlin.reflect.KClass @@ -28,14 +28,14 @@ sealed class HLApplicator { * @param psi a [PsiElement] to apply fix to * @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) } /** * 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) } @@ -44,18 +44,16 @@ sealed class HLApplicator { * * @see com.intellij.codeInsight.intention.IntentionAction.getText */ - fun getActionName(psi: PSI, input: INPUT): String = ForbidKtResolve.forbidResolveIn("HLApplicator.getActionName") { - getActionNameImpl(psi, input) - } + fun getActionName(psi: PSI, input: INPUT): String = getActionNameImpl(psi, input) + /** * Family name which will be used in inspections/intentions * * @see com.intellij.codeInsight.intention.IntentionAction.getFamilyName */ - fun getFamilyName(): String = ForbidKtResolve.forbidResolveIn("HLApplicator.getFamilyName") { - getFamilyNameImpl() - } + fun getFamilyName(): String = getFamilyNameImpl() + protected abstract fun applyToImpl(psi: PSI, input: INPUT, project: Project, editor: Editor?) protected abstract fun isApplicableByPsiImpl(psi: PSI): Boolean diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInput.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicatorInput.kt similarity index 95% rename from idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInput.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicatorInput.kt index 2cf07c91bc7..0bc0ea379ab 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/fir/api/applicator/HLApplicatorInput.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/api/applicator/HLApplicatorInput.kt @@ -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. */ -package org.jetbrains.kotlin.idea.fir.api.applicator +package org.jetbrains.kotlin.idea.api.applicator import com.intellij.psi.PsiElement diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/annotations/PrivateForInline.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/annotations/PrivateForInline.kt new file mode 100644 index 00000000000..05f2b86b984 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/annotations/PrivateForInline.kt @@ -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 diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/multithreadings/threadLocal.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/multithreadings/threadLocal.kt new file mode 100644 index 00000000000..3905a3dca12 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/multithreadings/threadLocal.kt @@ -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 internal constructor(private val threadLocal: ThreadLocal): ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): V { + return threadLocal.get() + } + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) { + threadLocal.set(value) + } + +} + +fun javaThreadLocal(initialValue: () -> T): JavaThreadLocalDelegate = + JavaThreadLocalDelegate(ThreadLocal.withInitial(initialValue)) + +fun javaThreadLocal(initialValue: T): JavaThreadLocalDelegate = + JavaThreadLocalDelegate(ThreadLocal.withInitial { initialValue }) \ No newline at end of file diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/package-info.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/package-info.kt new file mode 100644 index 00000000000..f2cd2455fc5 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/miniStdLib/package-info.kt @@ -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 diff --git a/idea/resources-descriptors/META-INF/plugin.xml b/idea/resources-descriptors/META-INF/plugin.xml index 3d2086afc93..e3b3135e36a 100644 --- a/idea/resources-descriptors/META-INF/plugin.xml +++ b/idea/resources-descriptors/META-INF/plugin.xml @@ -164,6 +164,8 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio. + diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index 49cb90daf46..1a331b51512 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -135,6 +135,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu +