IDEA-155877 Tests in fork mode does not work with kotlin

This commit is contained in:
Egor.Ushakov
2016-05-23 15:14:00 +03:00
parent 760707ef47
commit cea5be717d
3 changed files with 46 additions and 53 deletions
@@ -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
@@ -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
@@ -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<Element> {
@@ -75,8 +75,7 @@ public class DebuggerManagerImpl extends DebuggerManagerEx implements Persistent
private final HashMap<ProcessHandler, DebuggerSession> mySessions = new HashMap<>();
private final BreakpointManager myBreakpointManager;
private final List<NameMapper> myNameMappers = ContainerUtil.createLockFreeCopyOnWriteList();
private final List<Function<DebugProcess, PositionManager>> myCustomPositionManagerFactories =
new ArrayList<>();
private final List<Function<DebugProcess, PositionManager>> myCustomPositionManagerFactories = new SmartList<>();
private final EventDispatcher<DebuggerManagerListener> 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<Function<DebugProcess, PositionManager>> 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<DebugProcess, PositionManager> 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) {