diff --git a/platform/core-api/src/com/intellij/openapi/application/TransactionGuard.java b/platform/core-api/src/com/intellij/openapi/application/TransactionGuard.java index 46184d21863b..af115abb006b 100644 --- a/platform/core-api/src/com/intellij/openapi/application/TransactionGuard.java +++ b/platform/core-api/src/com/intellij/openapi/application/TransactionGuard.java @@ -107,7 +107,8 @@ public abstract class TransactionGuard { * @param transaction code to execute inside a transaction. */ public static void submitTransaction(@NotNull Disposable parentDisposable, @NotNull Runnable transaction) { - getInstance().submitMergeableTransaction(parentDisposable, TransactionKind.ANY_CHANGE, transaction); + TransactionGuard guard = getInstance(); + guard.submitMergeableTransaction(parentDisposable, guard.getContextTransaction(), transaction); } /** @@ -119,28 +120,11 @@ public abstract class TransactionGuard { /** * Schedules a transaction and waits for it to be completed. Fails if invoked on UI thread inside an incompatible transaction, * or inside a read action on non-UI thread. - * @see #submitMergeableTransaction(Disposable, TransactionKind, Runnable) + * @see #submitMergeableTransaction(Disposable, TransactionId, Runnable) * @throws ProcessCanceledException if current thread is interrupted */ public abstract void submitTransactionAndWait(@NotNull Runnable transaction) throws ProcessCanceledException; - /** - * A synchronous version of {@link #submitMergeableTransaction(Disposable, TransactionKind, Runnable)}. - * @return a token object for this transaction. Call {@link AccessToken#finish()} (inside finally) when the transaction is complete. - */ - @NotNull - public abstract AccessToken startSynchronousTransaction(@NotNull TransactionKind kind); - - /** - * Same as {@link #submitMergeableTransaction(Disposable, TransactionKind, Runnable)} with no parent disposable. - */ - public void submitMergeableTransaction(@NotNull TransactionKind kind, @NotNull Runnable transaction) { - submitMergeableTransaction(ApplicationManager.getApplication(), kind, transaction); - } - - @Deprecated - public abstract void submitMergeableTransaction(@NotNull Disposable parentDisposable, @NotNull TransactionKind kind, @NotNull Runnable transaction); - /** * Executes the given runnable inside a transaction as soon as possible on the UI thread. The runnable is executed either when there's * no active transaction running, or when the running transaction has the same (or compatible) id as {@code mergeInto}. If the id of @@ -154,13 +138,6 @@ public abstract class TransactionGuard { */ public abstract void submitMergeableTransaction(@NotNull Disposable parentDisposable, @Nullable TransactionId mergeInto, @NotNull Runnable transaction); - /** - * Asserts that a transaction is currently running, or not. Callable only on Swing thread. - * @param transactionRequired whether the assertion should check that the application is inside transaction or not - * @param errorMessage the message that will be logged if current transaction status differs from the expected one - */ - public abstract void assertInsideTransaction(boolean transactionRequired, @NotNull String errorMessage); - /** * @return the id of the currently running transaction for using in {@link #submitMergeableTransaction(Disposable, TransactionId, Runnable)}, * or null if there's no transaction running or merging is not allowed in the callee context (e.g. from invokeLater). diff --git a/platform/core-api/src/com/intellij/openapi/application/TransactionKind.java b/platform/core-api/src/com/intellij/openapi/application/TransactionKind.java deleted file mode 100644 index 672728d00f34..000000000000 --- a/platform/core-api/src/com/intellij/openapi/application/TransactionKind.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.application; - -import com.intellij.openapi.Disposable; -import com.intellij.openapi.editor.Document; - -/** - * A kind of transaction used in {@link TransactionGuard#submitMergeableTransaction(Disposable, TransactionKind, Runnable)}. - */ -public interface TransactionKind { - /** - * Same as {@link Common#TEXT_EDITING} - */ - TransactionKind TEXT_EDITING = Common.TEXT_EDITING; - - /** - * Same as {@link Common#ANY_CHANGE} - */ - TransactionKind ANY_CHANGE = Common.ANY_CHANGE; - - /** - * An auxiliary enum to make it possible to use transaction kinds in annotations - */ - enum Common implements TransactionKind { - - /** - * This kind represents document modifications via editor actions, code completion and document->PSI commit. - * @see com.intellij.psi.PsiDocumentManager#commitDocument(Document) - */ - TEXT_EDITING, - - /** - * This kind represents any model modifications: - *
  • PSI or document changes - *
  • Virtual file system changes, e.g. files created/deleted/renamed/content-changed, - * caused by refresh process or explicit operations. - *
  • Project root set change - *
  • Dumb mode (reindexing) start/finish, (see {@link com.intellij.openapi.project.DumbService}). - */ - ANY_CHANGE - - } -} diff --git a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java index bc2381f901bc..38feab805022 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java @@ -16,7 +16,6 @@ package com.intellij.openapi.application; import com.intellij.openapi.Disposable; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicatorProvider; @@ -38,7 +37,6 @@ import java.util.concurrent.atomic.AtomicLong; * @author peter */ public class TransactionGuardImpl extends TransactionGuard { - private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.application.TransactionGuardImpl"); private final Queue myQueue = new LinkedBlockingQueue(); private final Map myModality2Transaction = ContainerUtil.createConcurrentWeakMap(); private final Set myWriteSafeModalities = Collections.newSetFromMap(ContainerUtil.createConcurrentWeakMap()); @@ -49,22 +47,6 @@ public class TransactionGuardImpl extends TransactionGuard { myWriteSafeModalities.add(ModalityState.NON_MODAL); } - @Override - @NotNull - public AccessToken startSynchronousTransaction(@NotNull TransactionKind kind) throws IllegalStateException { - if (isInsideTransaction() && !myWritingAllowed) { - // please assign exceptions that occur here to Peter - /* - LOG.error("Synchronous transactions are allowed only from user actions. " + - "Please use submit*Transaction instead of invokeLater. " + - "See FAQ in TransactionGuard class javadoc."); - */ - return AccessToken.EMPTY_ACCESS_TOKEN; - } - - return startTransactionUnchecked(); - } - @NotNull private AccessToken startTransactionUnchecked() { final TransactionIdImpl prevTransaction = myCurrentTransaction; @@ -127,26 +109,10 @@ public class TransactionGuardImpl extends TransactionGuard { } } - private boolean isInsideTransaction() { - ApplicationManager.getApplication().assertIsDispatchThread(); - return myCurrentTransaction != null; - } - @Override - public void submitMergeableTransaction(@NotNull final Disposable parentDisposable, @NotNull final TransactionKind kind, @NotNull final Runnable _transaction) { - submitMergeableTransaction(parentDisposable, kind, getContextTransaction(), _transaction); - } - - @Override - public void submitMergeableTransaction(@NotNull Disposable parentDisposable, @Nullable TransactionId mergeInto, @NotNull Runnable transaction) { - submitMergeableTransaction(parentDisposable, TransactionKind.ANY_CHANGE, (TransactionIdImpl)mergeInto, transaction); - } - - private void submitMergeableTransaction(@NotNull final Disposable parentDisposable, - @NotNull final TransactionKind kind, - @Nullable final TransactionIdImpl expectedId, - @NotNull final Runnable _transaction) { - @NotNull final Transaction transaction = new Transaction(_transaction, expectedId, kind, parentDisposable); + public void submitMergeableTransaction(@NotNull Disposable parentDisposable, @Nullable TransactionId mergeInto, @NotNull Runnable _transaction) { + final TransactionIdImpl expectedId = (TransactionIdImpl)mergeInto; + final Transaction transaction = new Transaction(_transaction, expectedId, parentDisposable); final Application app = ApplicationManager.getApplication(); final boolean isDispatchThread = app.isDispatchThread(); Runnable runnable = new Runnable() { @@ -183,18 +149,11 @@ public class TransactionGuardImpl extends TransactionGuard { return transaction.mergeInto != null && currentId.myStartCounter <= transaction.mergeInto.myStartCounter; } - @Override - public void assertInsideTransaction(boolean transactionRequired, @NotNull String errorMessage) { - if (transactionRequired != isInsideTransaction()) { - LOG.error(errorMessage); - } - } - @Override public void submitTransactionAndWait(@NotNull final Runnable runnable) throws ProcessCanceledException { Application app = ApplicationManager.getApplication(); if (app.isDispatchThread()) { - Transaction transaction = new Transaction(runnable, getContextTransaction(), TransactionKind.ANY_CHANGE, app); + Transaction transaction = new Transaction(runnable, getContextTransaction(), app); if (!canRunTransactionNow(transaction, true)) { throw new AssertionError("Cannot run synchronous submitTransactionAndWait from invokeLater. " + "Please use asynchronous submit*Transaction. " + @@ -208,7 +167,7 @@ public class TransactionGuardImpl extends TransactionGuard { final Semaphore semaphore = new Semaphore(); semaphore.down(); final Throwable[] exception = {null}; - submitMergeableTransaction(Disposer.newDisposable("never disposed"), TransactionKind.ANY_CHANGE, new Runnable() { + submitMergeableTransaction(Disposer.newDisposable("never disposed"), getContextTransaction(), new Runnable() { @Override public void run() { try { @@ -333,16 +292,11 @@ public class TransactionGuardImpl extends TransactionGuard { private static class Transaction { @NotNull final Runnable runnable; @Nullable final TransactionIdImpl mergeInto; - @NotNull final TransactionKind kind; @NotNull final Disposable parentDisposable; - Transaction(@NotNull Runnable runnable, - @Nullable TransactionIdImpl mergeInto, - @NotNull TransactionKind kind, - @NotNull Disposable parentDisposable) { + Transaction(@NotNull Runnable runnable, @Nullable TransactionIdImpl mergeInto, @NotNull Disposable parentDisposable) { this.runnable = runnable; this.mergeInto = mergeInto; - this.kind = kind; this.parentDisposable = parentDisposable; } }