Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

RIDER-70660 Debug Unity test, when we are already attached #2232

Merged
merged 5 commits into from
Dec 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,25 @@ import com.intellij.util.BitUtil
import com.intellij.xdebugger.XDebuggerManager
import com.jetbrains.rd.framework.impl.RdTask
import com.jetbrains.rd.platform.util.idea.ProtocolSubscribedProjectComponent
import com.jetbrains.rd.util.reactive.*
import com.jetbrains.rd.util.reactive.AddRemove
import com.jetbrains.rd.util.reactive.Signal
import com.jetbrains.rd.util.reactive.adviseNotNull
import com.jetbrains.rd.util.reactive.valueOrDefault
import com.jetbrains.rider.debugger.DebuggerInitializingState
import com.jetbrains.rider.debugger.RiderDebugActiveDotNetSessionsTracker
import com.jetbrains.rider.plugins.unity.actions.StartUnityAction
import com.jetbrains.rider.plugins.unity.model.LogEvent
import com.jetbrains.rider.plugins.unity.model.frontendBackend.frontendBackendModel
import com.jetbrains.rider.plugins.unity.run.DefaultRunConfigurationGenerator
import com.jetbrains.rider.plugins.unity.run.UnityRemoteConnectionDetails
import com.jetbrains.rider.plugins.unity.run.configurations.UnityAttachToEditorRunConfiguration
import com.jetbrains.rider.plugins.unity.run.configurations.UnityDebugConfigurationType
import com.jetbrains.rider.plugins.unity.run.configurations.UnityProcessRunProfile
import com.jetbrains.rider.plugins.unity.run.configurations.unityExe.UnityExeConfiguration
import com.jetbrains.rider.plugins.unity.util.UnityInstallationFinder
import com.jetbrains.rider.plugins.unity.util.Utils.Companion.AllowUnitySetForegroundWindow
import com.jetbrains.rider.plugins.unity.util.toProgramParameters
import com.jetbrains.rider.plugins.unity.util.withProjectPath
import com.jetbrains.rider.projectView.solution
import java.awt.Frame
import java.io.File
Expand Down Expand Up @@ -53,31 +62,46 @@ class FrontendBackendHost(project: Project) : ProtocolSubscribedProjectComponent
val configuration =
RunManager.getInstance(project).findConfigurationByTypeAndName(UnityDebugConfigurationType.id, DefaultRunConfigurationGenerator.ATTACH_CONFIGURATION_NAME)
if (configuration == null)
{
task.set(false)
else {
val unityAttachConfiguration = configuration.configuration as UnityAttachToEditorRunConfiguration
val isAttached = sessions.any { it.runProfile != null &&
it.runProfile is UnityAttachToEditorRunConfiguration &&
(it.runProfile as UnityAttachToEditorRunConfiguration).pid == unityAttachConfiguration.pid
return@set task
}

val unityAttachConfiguration = configuration.configuration as UnityAttachToEditorRunConfiguration
unityAttachConfiguration.updatePidAndPort()

val isAttached = sessions.any {
if (it.runProfile == null) return@any false
if (it.runProfile is UnityAttachToEditorRunConfiguration) {
return@any (it.runProfile as UnityAttachToEditorRunConfiguration).pid == unityAttachConfiguration.pid
}
if (it.runProfile is UnityProcessRunProfile) {
return@any ((it.runProfile as UnityProcessRunProfile).process as UnityRemoteConnectionDetails).port == unityAttachConfiguration.port
}
if (it.runProfile is UnityExeConfiguration) {
val params = (it.runProfile as UnityExeConfiguration).parameters
val unityPath = UnityInstallationFinder.getInstance(project).getApplicationExecutablePath()
return@any File(params.exePath) == unityPath?.toFile() && params.programParameters.contains(
mutableListOf<String>().withProjectPath(project).toProgramParameters()
)
}
if (!isAttached) {
val processTracker: RiderDebugActiveDotNetSessionsTracker = RiderDebugActiveDotNetSessionsTracker.getInstance(project)
processTracker.dotNetDebugProcesses.change.advise(projectComponentLifetime) { (event, debugProcess) ->
if (event == AddRemove.Add) {
debugProcess.initializeDebuggerTask.debuggerInitializingState.advise(lt) {
if (it == DebuggerInitializingState.Initialized)
task.set(true)
if (it == DebuggerInitializingState.Canceled)
task.set(false)
}
return@any false
}
if (!isAttached) {
val processTracker: RiderDebugActiveDotNetSessionsTracker = RiderDebugActiveDotNetSessionsTracker.getInstance(project)
processTracker.dotNetDebugProcesses.change.advise(projectComponentLifetime) { (event, debugProcess) ->
if (event == AddRemove.Add) {
debugProcess.initializeDebuggerTask.debuggerInitializingState.advise(lt) {
if (it == DebuggerInitializingState.Initialized)
task.set(true)
if (it == DebuggerInitializingState.Canceled)
task.set(false)
}
}
}

ProgramRunnerUtil.executeConfiguration(configuration, DefaultDebugExecutor.getDebugExecutorInstance())
} else
task.set(true)
}
ProgramRunnerUtil.executeConfiguration(configuration, DefaultDebugExecutor.getDebugExecutorInstance())
} else task.set(true)
task
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ fun attachToUnityProcess(project: Project, process: UnityProcess) {
/**
* Simple [RunProfile] implementation to connect to a [UnityProcess] via the Attach To menu
*/
class UnityProcessRunProfile(private val project: Project, private val process: UnityProcess)
class UnityProcessRunProfile(private val project: Project, val process: UnityProcess)
: RunProfile, IRiderDebuggable {

override fun getName(): String = process.displayName
Expand Down