All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.analysis.api.permissions.KaAnalysisPermissionRegistry.kt Maven / Gradle / Ivy

/*
 * Copyright 2010-2024 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.analysis.api.permissions

import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
import org.jetbrains.kotlin.analysis.api.permissions.KaAnalysisPermissionRegistry.KaExplicitAnalysisRestriction

/**
 * [KaAnalysisPermissionRegistry] stores settings required by permission functions such as [forbidAnalysis], [allowAnalysisOnEdt], and
 * [allowAnalysisFromWriteAction].
 *
 * [KaAnalysisPermissionRegistry] is an *application service* because we want users to call permission functions without having to pass a
 * project, which would be required if this class was a project service.
 */
@KaImplementationDetail
public interface KaAnalysisPermissionRegistry {
    public class KaExplicitAnalysisRestriction(public val description: String)

    public var explicitAnalysisRestriction: KaExplicitAnalysisRestriction?

    public var isAnalysisAllowedOnEdt: Boolean

    public var isAnalysisAllowedInWriteAction: Boolean

    @KaImplementationDetail
    public companion object {
        private val permissionRegistry = KaAnalysisPermissionRegistryImpl()

        /**
         * This [getInstance] has the exact same signature as a `getInstance` for an application service, to allow implementing
         * [KaAnalysisPermissionRegistry] as an application service in the future when KT-68386 has been fixed.
         */
        public fun getInstance(): KaAnalysisPermissionRegistry = permissionRegistry
    }
}

/**
 * This implementation is a workaround for KT-68386, as we currently cannot register it as an application service in Standalone mode.
 */
@OptIn(KaImplementationDetail::class)
private class KaAnalysisPermissionRegistryImpl : KaAnalysisPermissionRegistry {
    private val threadLocalExplicitAnalysisRestriction: ThreadLocal =
        ThreadLocal.withInitial { null }

    private val threadLocalAllowOnEdt: ThreadLocal =
        ThreadLocal.withInitial { false }

    private val threadLocalAllowInWriteAction: ThreadLocal =
        ThreadLocal.withInitial { false }

    override var explicitAnalysisRestriction: KaExplicitAnalysisRestriction?
        get() = threadLocalExplicitAnalysisRestriction.get()
        set(value) = threadLocalExplicitAnalysisRestriction.set(value)

    override var isAnalysisAllowedOnEdt: Boolean
        get() = threadLocalAllowOnEdt.get()
        set(value) = threadLocalAllowOnEdt.set(value)

    override var isAnalysisAllowedInWriteAction: Boolean
        get() = threadLocalAllowInWriteAction.get()
        set(value) = threadLocalAllowInWriteAction.set(value)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy