From cea5be717d59fd2665a291a11bc853a50f5e1d3a Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 23 May 2016 15:09:38 +0300 Subject: [PATCH] IDEA-155877 Tests in fork mode does not work with kotlin --- .../debugger/engine/DebugProcessEvents.java | 19 ++++++-- .../debugger/engine/DebugProcessImpl.java | 33 +++++++------ .../debugger/impl/DebuggerManagerImpl.java | 47 +++++-------------- 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index 9e587e4d69ca..e06eea5be478 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -15,13 +15,12 @@ */ package com.intellij.debugger.engine; -import com.intellij.debugger.DebuggerBundle; -import com.intellij.debugger.DebuggerInvocationUtil; -import com.intellij.debugger.DebuggerManagerEx; +import com.intellij.debugger.*; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.engine.events.SuspendContextCommandImpl; import com.intellij.debugger.engine.requests.LocatableEventRequestor; import com.intellij.debugger.engine.requests.MethodReturnValueWatcher; +import com.intellij.debugger.impl.DebuggerManagerImpl; import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.jdi.ThreadReferenceProxyImpl; import com.intellij.debugger.jdi.VirtualMachineProxyImpl; @@ -33,6 +32,7 @@ import com.intellij.execution.configurations.RemoteConnection; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; @@ -52,6 +52,9 @@ import com.sun.jdi.request.ThreadDeathRequest; import com.sun.jdi.request.ThreadStartRequest; import org.jetbrains.annotations.Nullable; +import java.util.Objects; +import java.util.stream.Stream; + /** * @author lex */ @@ -331,6 +334,16 @@ public class DebugProcessEvents extends DebugProcessImpl { threadDeathRequest.setSuspendPolicy(EventRequest.SUSPEND_NONE); threadDeathRequest.enable(); + // fill position managers + ((DebuggerManagerImpl)DebuggerManager.getInstance(getProject())).getCustomPositionManagerFactories() + .map(factory -> factory.fun(this)) + .filter(Objects::nonNull) + .forEach(this::appendPositionManager); + Stream.of(Extensions.getExtensions(PositionManagerFactory.EP_NAME, getProject())) + .map(factory -> factory.createPositionManager(this)) + .filter(Objects::nonNull) + .forEach(this::appendPositionManager); + myDebugProcessDispatcher.getMulticaster().processAttached(this); // breakpoints should be initialized after all processAttached listeners work diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 33d8d6009b10..ed583f404a05 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -271,9 +271,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb LOG.error("State is invalid " + myState.get()); } DebuggerManagerThreadImpl.assertIsManagerThread(); - if (myPositionManager == null) { // no need to reset on reattach - myPositionManager = createPositionManager(); - } + myPositionManager = new CompoundPositionManager(new PositionManagerImpl(this)); LOG.debug("*******************VM attached******************"); checkVirtualMachineVersion(vm); @@ -348,11 +346,6 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb } } - @NotNull - protected CompoundPositionManager createPositionManager() { - return new CompoundPositionManager(new PositionManagerImpl(this)); - } - @Override public void printToConsole(final String text) { myExecutionResult.getProcessHandler().notifyTextAvailable(text, ProcessOutputTypes.SYSTEM); @@ -1834,18 +1827,28 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb } public void reattach(final DebugEnvironment environment) throws ExecutionException { - ApplicationManager.getApplication().assertIsDispatchThread(); //TODO: remove this requirement - ((XDebugSessionImpl)getXdebugProcess().getSession()).reset(); - myState.set(State.INITIAL); getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { - myRequestManager.processDetached(DebugProcessImpl.this, false); + closeProcess(false); + doReattach(); + } + + @Override + protected void commandCancelled() { + doReattach(); // if the original process is already finished + } + + private void doReattach() { + DebuggerInvocationUtil.swingInvokeLater(myProject, () -> { + ((XDebugSessionImpl)getXdebugProcess().getSession()).reset(); + myState.set(State.INITIAL); + myConnection = environment.getRemoteConnection(); + getManagerThread().restartIfNeeded(); + createVirtualMachine(environment.getSessionName(), environment.isPollConnection()); + }); } }); - myConnection = environment.getRemoteConnection(); - getManagerThread().restartIfNeeded(); - createVirtualMachine(environment.getSessionName(), environment.isPollConnection()); } @Nullable diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java index ce0eebef450d..75d602c8ffd9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java @@ -26,7 +26,6 @@ import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.RemoteConnection; -import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.process.KillableColoredProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; @@ -40,7 +39,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.colors.EditorColorsListener; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; @@ -56,6 +54,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.util.EventDispatcher; import com.intellij.util.Function; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -66,6 +65,7 @@ import javax.swing.*; import java.io.File; import java.util.*; import java.util.jar.Attributes; +import java.util.stream.Stream; @State(name = "DebuggerManager", storages = {@Storage(StoragePathMacros.WORKSPACE_FILE)}) public class DebuggerManagerImpl extends DebuggerManagerEx implements PersistentStateComponent { @@ -75,8 +75,7 @@ public class DebuggerManagerImpl extends DebuggerManagerEx implements Persistent private final HashMap mySessions = new HashMap<>(); private final BreakpointManager myBreakpointManager; private final List myNameMappers = ContainerUtil.createLockFreeCopyOnWriteList(); - private final List> myCustomPositionManagerFactories = - new ArrayList<>(); + private final List> myCustomPositionManagerFactories = new SmartList<>(); private final EventDispatcher myDispatcher = EventDispatcher.create(DebuggerManagerListener.class); private final MyDebuggerStateManager myDebuggerStateManager = new MyDebuggerStateManager(); @@ -209,41 +208,19 @@ public class DebuggerManagerImpl extends DebuggerManagerEx implements Persistent myBreakpointManager.writeExternal(element); } + /** + * @deprecated to be removed with {@link DebuggerManager#registerPositionManagerFactory(Function)} + */ + @Deprecated + public Stream> getCustomPositionManagerFactories() { + return myCustomPositionManagerFactories.stream(); + } + @Override @Nullable public DebuggerSession attachVirtualMachine(@NotNull DebugEnvironment environment) throws ExecutionException { ApplicationManager.getApplication().assertIsDispatchThread(); - final DebugProcessEvents debugProcess = new DebugProcessEvents(myProject); - debugProcess.addDebugProcessListener(new DebugProcessListener() { - @Override - public void processAttached(final DebugProcess process) { - process.removeDebugProcessListener(this); - for (Function factory : myCustomPositionManagerFactories) { - final PositionManager positionManager = factory.fun(process); - if (positionManager != null) { - process.appendPositionManager(positionManager); - } - } - for (PositionManagerFactory factory : Extensions.getExtensions(PositionManagerFactory.EP_NAME, myProject)) { - final PositionManager manager = factory.createPositionManager(debugProcess); - if (manager != null) { - process.appendPositionManager(manager); - } - } - } - - @Override - public void processDetached(final DebugProcess process, final boolean closedByUser) { - debugProcess.removeDebugProcessListener(this); - } - - @Override - public void attachException(final RunProfileState state, - final ExecutionException exception, - final RemoteConnection remoteConnection) { - debugProcess.removeDebugProcessListener(this); - } - }); + DebugProcessEvents debugProcess = new DebugProcessEvents(myProject); DebuggerSession session = DebuggerSession.create(environment.getSessionName(), debugProcess, environment); ExecutionResult executionResult = session.getProcess().getExecutionResult(); if (executionResult == null) {