mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-13 15:52:01 +07:00
IJPL-1036 remove AccessToken from IncompleteDependenciesAccessToken because finish() requires write action
Signed-off-by: Liudmila Kornilova <liudmila.kornilova@jetbrains.com> GitOrigin-RevId: 9a2b8a697471ac4bf32ecf51936e5dc022e80e07
This commit is contained in:
committed by
intellij-monorepo-bot
parent
47357a976c
commit
59f500b605
@@ -5,6 +5,8 @@ import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase;
|
||||
import com.intellij.openapi.application.WriteAction;
|
||||
import com.intellij.openapi.project.IncompleteDependenciesService;
|
||||
|
||||
import static com.intellij.openapi.project.IncompleteDependenciesServiceKt.asAutoCloseable;
|
||||
|
||||
public final class IncompleteModelHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/incompleteHighlighting";
|
||||
|
||||
@@ -13,12 +15,12 @@ public final class IncompleteModelHighlightingTest extends LightDaemonAnalyzerTe
|
||||
}
|
||||
|
||||
private void doTest(String fileName) {
|
||||
var ignored = WriteAction.compute(() -> getProject().getService(IncompleteDependenciesService.class).enterIncompleteState());
|
||||
try {
|
||||
IncompleteDependenciesService service = getProject().getService(IncompleteDependenciesService.class);
|
||||
try (var ignored = asAutoCloseable(WriteAction.compute(() -> service.enterIncompleteState()))) {
|
||||
doTest(BASE_PATH + "/" + fileName, true, true);
|
||||
}
|
||||
finally {
|
||||
WriteAction.run(ignored::close);
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.openapi.project
|
||||
|
||||
import com.intellij.openapi.application.AccessToken
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.project.IncompleteDependenciesService.IncompleteDependenciesAccessToken
|
||||
import com.intellij.util.concurrency.annotations.RequiresBlockingContext
|
||||
import com.intellij.util.concurrency.annotations.RequiresReadLock
|
||||
import com.intellij.util.concurrency.annotations.RequiresWriteLock
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
@@ -30,8 +32,20 @@ interface IncompleteDependenciesService {
|
||||
INCOMPLETE(false)
|
||||
}
|
||||
|
||||
abstract class IncompleteDependenciesAccessToken : AccessToken() {
|
||||
abstract class IncompleteDependenciesAccessToken {
|
||||
@RequiresWriteLock
|
||||
abstract override fun finish()
|
||||
abstract fun finish()
|
||||
}
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
fun IncompleteDependenciesAccessToken.asAutoCloseable(): AutoCloseable = WriteActionAutoCloseable(this::finish)
|
||||
|
||||
private class WriteActionAutoCloseable(private val finish: () -> Unit) : AutoCloseable {
|
||||
@RequiresBlockingContext
|
||||
override fun close() {
|
||||
ApplicationManager.getApplication().runWriteAction {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.openapi.project
|
||||
|
||||
import com.intellij.openapi.application.AccessToken
|
||||
import com.intellij.openapi.project.IncompleteDependenciesService.DependenciesState
|
||||
import com.intellij.openapi.project.IncompleteDependenciesService.IncompleteDependenciesAccessToken
|
||||
import com.intellij.util.concurrency.ThreadingAssertions
|
||||
@@ -14,7 +13,7 @@ import org.jetbrains.annotations.ApiStatus
|
||||
@ApiStatus.Internal
|
||||
class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
||||
override val stateFlow = MutableStateFlow(DependenciesState.COMPLETE)
|
||||
private val tokens = HashSet<AccessToken>()
|
||||
private val tokens = HashSet<IncompleteDependenciesAccessToken>()
|
||||
|
||||
@RequiresReadLock
|
||||
override fun getState(): DependenciesState {
|
||||
@@ -35,7 +34,7 @@ class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
||||
}
|
||||
|
||||
@RequiresWriteLock
|
||||
private fun registerToken(token: AccessToken) {
|
||||
private fun registerToken(token: IncompleteDependenciesAccessToken) {
|
||||
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
||||
synchronized(tokens) {
|
||||
val wasEmpty = tokens.isEmpty()
|
||||
@@ -47,7 +46,7 @@ class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
||||
}
|
||||
|
||||
@RequiresWriteLock
|
||||
private fun deregisterToken(token: AccessToken) {
|
||||
private fun deregisterToken(token: IncompleteDependenciesAccessToken) {
|
||||
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
||||
synchronized(tokens) {
|
||||
tokens.remove(token)
|
||||
|
||||
@@ -7,6 +7,8 @@ import com.intellij.testFramework.PlatformTestUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import static com.intellij.openapi.project.IncompleteDependenciesServiceKt.asAutoCloseable;
|
||||
|
||||
public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
|
||||
public void testLombokBasics() { doTest(); }
|
||||
@@ -18,12 +20,12 @@ public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTes
|
||||
}
|
||||
|
||||
private void doTest(String fileName) {
|
||||
var ignored = WriteAction.compute(() -> getProject().getService(IncompleteDependenciesService.class).enterIncompleteState());
|
||||
try {
|
||||
IncompleteDependenciesService service = getProject().getService(IncompleteDependenciesService.class);
|
||||
try (var ignored = asAutoCloseable(WriteAction.compute(() -> service.enterIncompleteState()))) {
|
||||
doTest("/plugins/lombok/testData/highlightingIncompleteMode/" + fileName, true, true);
|
||||
}
|
||||
finally {
|
||||
WriteAction.run(ignored::close);
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user