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.application.WriteAction;
|
||||||
import com.intellij.openapi.project.IncompleteDependenciesService;
|
import com.intellij.openapi.project.IncompleteDependenciesService;
|
||||||
|
|
||||||
|
import static com.intellij.openapi.project.IncompleteDependenciesServiceKt.asAutoCloseable;
|
||||||
|
|
||||||
public final class IncompleteModelHighlightingTest extends LightDaemonAnalyzerTestCase {
|
public final class IncompleteModelHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||||
static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/incompleteHighlighting";
|
static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/incompleteHighlighting";
|
||||||
|
|
||||||
@@ -13,12 +15,12 @@ public final class IncompleteModelHighlightingTest extends LightDaemonAnalyzerTe
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void doTest(String fileName) {
|
private void doTest(String fileName) {
|
||||||
var ignored = WriteAction.compute(() -> getProject().getService(IncompleteDependenciesService.class).enterIncompleteState());
|
IncompleteDependenciesService service = getProject().getService(IncompleteDependenciesService.class);
|
||||||
try {
|
try (var ignored = asAutoCloseable(WriteAction.compute(() -> service.enterIncompleteState()))) {
|
||||||
doTest(BASE_PATH + "/" + fileName, true, true);
|
doTest(BASE_PATH + "/" + fileName, true, true);
|
||||||
}
|
}
|
||||||
finally {
|
catch (Exception e) {
|
||||||
WriteAction.run(ignored::close);
|
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.
|
// 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
|
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.RequiresReadLock
|
||||||
import com.intellij.util.concurrency.annotations.RequiresWriteLock
|
import com.intellij.util.concurrency.annotations.RequiresWriteLock
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -30,8 +32,20 @@ interface IncompleteDependenciesService {
|
|||||||
INCOMPLETE(false)
|
INCOMPLETE(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class IncompleteDependenciesAccessToken : AccessToken() {
|
abstract class IncompleteDependenciesAccessToken {
|
||||||
@RequiresWriteLock
|
@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.
|
// 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
|
package com.intellij.openapi.project
|
||||||
|
|
||||||
import com.intellij.openapi.application.AccessToken
|
|
||||||
import com.intellij.openapi.project.IncompleteDependenciesService.DependenciesState
|
import com.intellij.openapi.project.IncompleteDependenciesService.DependenciesState
|
||||||
import com.intellij.openapi.project.IncompleteDependenciesService.IncompleteDependenciesAccessToken
|
import com.intellij.openapi.project.IncompleteDependenciesService.IncompleteDependenciesAccessToken
|
||||||
import com.intellij.util.concurrency.ThreadingAssertions
|
import com.intellij.util.concurrency.ThreadingAssertions
|
||||||
@@ -14,7 +13,7 @@ import org.jetbrains.annotations.ApiStatus
|
|||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
||||||
override val stateFlow = MutableStateFlow(DependenciesState.COMPLETE)
|
override val stateFlow = MutableStateFlow(DependenciesState.COMPLETE)
|
||||||
private val tokens = HashSet<AccessToken>()
|
private val tokens = HashSet<IncompleteDependenciesAccessToken>()
|
||||||
|
|
||||||
@RequiresReadLock
|
@RequiresReadLock
|
||||||
override fun getState(): DependenciesState {
|
override fun getState(): DependenciesState {
|
||||||
@@ -35,7 +34,7 @@ class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RequiresWriteLock
|
@RequiresWriteLock
|
||||||
private fun registerToken(token: AccessToken) {
|
private fun registerToken(token: IncompleteDependenciesAccessToken) {
|
||||||
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
||||||
synchronized(tokens) {
|
synchronized(tokens) {
|
||||||
val wasEmpty = tokens.isEmpty()
|
val wasEmpty = tokens.isEmpty()
|
||||||
@@ -47,7 +46,7 @@ class IncompleteDependenciesServiceImpl : IncompleteDependenciesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RequiresWriteLock
|
@RequiresWriteLock
|
||||||
private fun deregisterToken(token: AccessToken) {
|
private fun deregisterToken(token: IncompleteDependenciesAccessToken) {
|
||||||
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
ThreadingAssertions.assertWriteAccess() // @RequiresWriteLock does nothing in Kotlin
|
||||||
synchronized(tokens) {
|
synchronized(tokens) {
|
||||||
tokens.remove(token)
|
tokens.remove(token)
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import com.intellij.testFramework.PlatformTestUtil;
|
|||||||
import org.jetbrains.annotations.NonNls;
|
import org.jetbrains.annotations.NonNls;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import static com.intellij.openapi.project.IncompleteDependenciesServiceKt.asAutoCloseable;
|
||||||
|
|
||||||
public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTestCase {
|
public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||||
|
|
||||||
public void testLombokBasics() { doTest(); }
|
public void testLombokBasics() { doTest(); }
|
||||||
@@ -18,12 +20,12 @@ public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTes
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void doTest(String fileName) {
|
private void doTest(String fileName) {
|
||||||
var ignored = WriteAction.compute(() -> getProject().getService(IncompleteDependenciesService.class).enterIncompleteState());
|
IncompleteDependenciesService service = getProject().getService(IncompleteDependenciesService.class);
|
||||||
try {
|
try (var ignored = asAutoCloseable(WriteAction.compute(() -> service.enterIncompleteState()))) {
|
||||||
doTest("/plugins/lombok/testData/highlightingIncompleteMode/" + fileName, true, true);
|
doTest("/plugins/lombok/testData/highlightingIncompleteMode/" + fileName, true, true);
|
||||||
}
|
}
|
||||||
finally {
|
catch (Exception e) {
|
||||||
WriteAction.run(ignored::close);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user