Skip to content

Commit 12b674f

Browse files
authored
Merge pull request #657 from adpi2/hide-reactivex
Hide reactivex from api
2 parents 4bfc0bc + c5404d7 commit 12b674f

File tree

7 files changed

+42
-40
lines changed

7 files changed

+42
-40
lines changed

modules/core/src/main/scala/ch/epfl/scala/debugadapter/Debuggee.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ch.epfl.scala.debugadapter
22

33
import java.nio.file.Path
44
import java.io.File
5-
import io.reactivex.Observable
5+
import java.io.Closeable
66

77
trait Debuggee {
88
def name: String
@@ -12,7 +12,7 @@ trait Debuggee {
1212
def libraries: Seq[Library]
1313
def unmanagedEntries: Seq[UnmanagedEntry]
1414
def javaRuntime: Option[JavaRuntime]
15-
def classesToUpdate: Observable[Seq[String]]
15+
def observeClassesToUpdate(updateClasses: Seq[String] => Unit): Closeable
1616

1717
def managedEntries: Seq[ManagedEntry] = modules ++ libraries
1818
def classPathEntries: Seq[ClassPathEntry] = managedEntries ++ unmanagedEntries

modules/core/src/main/scala/ch/epfl/scala/debugadapter/internal/HotCodeReplaceProvider.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import com.microsoft.java.debug.core.adapter.IStackTraceProvider
1515
import com.microsoft.java.debug.core.protocol.Events
1616
import com.sun.jdi.*
1717
import io.reactivex.Observable
18-
import io.reactivex.disposables.Disposable
1918

2019
import java.util.concurrent.CompletableFuture
2120
import java.util.concurrent.atomic.AtomicReference
@@ -27,6 +26,7 @@ import scala.util.Success
2726
import scala.util.Try
2827
import scala.util.control.NonFatal
2928
import io.reactivex.subjects.PublishSubject
29+
import java.io.Closeable
3030

3131
class HotCodeReplaceProvider(
3232
debuggee: Debuggee,
@@ -35,7 +35,7 @@ class HotCodeReplaceProvider(
3535
) extends IHotCodeReplaceProvider {
3636
private var sourceLookUp: SourceLookUpProvider = null
3737
private var stackTraceProvider: StackTraceProvider = null
38-
private var subscription: Disposable = null
38+
private var subscription: Closeable = null
3939
private var context: IDebugAdapterContext = null
4040
private var currentDebugSession: IDebugSession = null
4141
private val classesAccumulator: AtomicReference[Set[String]] = new AtomicReference(Set.empty)
@@ -45,14 +45,13 @@ class HotCodeReplaceProvider(
4545
override def initialize(context: IDebugAdapterContext, options: ju.Map[String, Object]): Unit = {
4646
this.context = context
4747
this.currentDebugSession = context.getDebugSession
48-
this.subscription = debuggee.classesToUpdate.subscribe(classes => classesAccumulator.updateAndGet(_ ++ classes))
48+
this.subscription = debuggee.observeClassesToUpdate(classes => classesAccumulator.updateAndGet(_ ++ classes))
4949
this.sourceLookUp = context.getProvider(classOf[ISourceLookUpProvider]).asInstanceOf[SourceLookUpProvider]
5050
this.stackTraceProvider = context.getProvider(classOf[IStackTraceProvider]).asInstanceOf[StackTraceProvider]
51-
5251
}
5352

5453
override def close(): Unit = {
55-
if (subscription != null) subscription.dispose()
54+
if (subscription != null) subscription.close()
5655
context = null
5756
currentDebugSession = null
5857
subscription = null

modules/sbt-plugin/src/main/scala/ch/epfl/scala/debugadapter/sbtplugin/DebugAdapterPlugin.scala

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import sjsonnew.support.scalajson.unsafe.CompactPrinter
2020
import sjsonnew.support.scalajson.unsafe.Converter
2121
import sjsonnew.support.scalajson.unsafe.{Parser => JsonParser}
2222
import xsbti.FileConverter
23-
import xsbti.VirtualFileRef
2423
import xsbti.compile.CompileAnalysis
2524
import xsbti.compile.analysis.ReadStamps
2625
import xsbti.compile.analysis.Stamp
@@ -67,7 +66,7 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
6766
inputKey[URI]("Start a debug session on a remote process").withRank(KeyRanks.DTask)
6867
val debugAdapterConfig =
6968
settingKey[DebugConfig]("Configure the debug session").withRank(KeyRanks.DTask)
70-
val debugAdapterClassesObserver =
69+
val debugAdapterClassesToUpdate =
7170
settingKey[PublishSubject[Seq[String]]]("Observe the classes to be reloaded by the debuggee")
7271
.withRank(KeyRanks.DTask)
7372
val stopDebugSession =
@@ -109,7 +108,7 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
109108
startMainClassDebugSession := mainClassSessionTask.evaluated,
110109
startRemoteDebugSession := remoteSessionTask.evaluated,
111110
stopDebugSession := stopSessionTask.value,
112-
debugAdapterClassesObserver := PublishSubject.create(),
111+
debugAdapterClassesToUpdate := PublishSubject.create(),
113112
Keys.compile / Keys.javacOptions := {
114113
val jo = (Keys.compile / Keys.javacOptions).value
115114
if (jo.exists(_.startsWith("-g"))) jo
@@ -118,45 +117,38 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
118117
Keys.compile := {
119118
val currentAnalysis: CompileAnalysis = Keys.compile.value
120119
val previousAnalysis = Keys.previousCompile.value.analysis
121-
val observer = debugAdapterClassesObserver.value
120+
val classesToUpdate = debugAdapterClassesToUpdate.value
122121
val fileConverter = Keys.fileConverter.value
123122
val classDir = Keys.classDirectory.value.toPath
124123
if (previousAnalysis.isPresent) {
125-
val classesToReload =
126-
getNewClasses(currentAnalysis.readStamps, previousAnalysis.get.readStamps, fileConverter, classDir)
127-
observer.onNext(classesToReload)
124+
val currentStamps = currentAnalysis.readStamps
125+
val previousStamps = previousAnalysis.get.readStamps
126+
val newClasses = getNewClasses(currentStamps, previousStamps, fileConverter, classDir)
127+
classesToUpdate.onNext(newClasses)
128128
}
129129
currentAnalysis
130130
}
131131
)
132132

133-
def getNewClasses(
133+
private def getNewClasses(
134134
currentStamps: ReadStamps,
135135
previousStamps: ReadStamps,
136-
fileConverter: FileConverter,
136+
converter: FileConverter,
137137
classDir: java.nio.file.Path
138138
): Seq[String] = {
139-
def isNewer(current: Stamp, previous: Stamp) = {
139+
def isNewer(current: Stamp, previous: Stamp) =
140140
if (previous == null) true
141141
else {
142142
val newHash = current.getHash
143143
val oldHash = previous.getHash
144144
newHash.isPresent && (!oldHash.isPresent || newHash.get != oldHash.get)
145145
}
146-
}
147-
148-
object ClassFile {
149-
def unapply(vf: VirtualFileRef): Option[String] = {
150-
val path = fileConverter.toPath(vf)
151-
if (path.toString.endsWith(".class")) {
152-
Some(classDir.relativize(path).toString.replace(File.separator, ".").stripSuffix(".class"))
153-
} else None
154-
}
155-
}
156146

157147
val oldStamps = previousStamps.getAllProductStamps
158-
currentStamps.getAllProductStamps.asScala.collect {
159-
case (file @ ClassFile(fqcn), stamp) if isNewer(stamp, oldStamps.get(file)) => fqcn
148+
currentStamps.getAllProductStamps.asScala.iterator.collect {
149+
case (file, stamp) if file.id.endsWith(".class") && isNewer(stamp, oldStamps.get(file)) =>
150+
val path = converter.toPath(file)
151+
classDir.relativize(path).toString.replace(File.separator, ".").stripSuffix(".class")
160152
}.toSeq
161153
}
162154

@@ -291,7 +283,7 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
291283
InternalTasks.libraries.value,
292284
InternalTasks.unmanagedEntries.value,
293285
InternalTasks.javaRuntime.value,
294-
InternalTasks.classesObservable.value,
286+
InternalTasks.classesToUpdate.value,
295287
mainClass.`class`,
296288
mainClass.arguments,
297289
new LoggerAdapter(logger)
@@ -397,7 +389,7 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
397389
InternalTasks.libraries.value,
398390
InternalTasks.unmanagedEntries.value,
399391
InternalTasks.javaRuntime.value,
400-
InternalTasks.classesObservable.value,
392+
InternalTasks.classesToUpdate.value,
401393
cleanups,
402394
parallel,
403395
testRunners,
@@ -463,7 +455,7 @@ object DebugAdapterPlugin extends sbt.AutoPlugin {
463455
InternalTasks.libraries.value,
464456
InternalTasks.unmanagedEntries.value,
465457
InternalTasks.javaRuntime.value,
466-
InternalTasks.classesObservable.value,
458+
InternalTasks.classesToUpdate.value,
467459
new LoggerAdapter(logger)
468460
)
469461
startServer(jobService, scope, state, target, debuggee, debugToolsResolver, debugAdapterConfig.value)

modules/sbt-plugin/src/main/scala/ch/epfl/scala/debugadapter/sbtplugin/internal/InternalTasks.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ private[sbtplugin] object InternalTasks {
1717
modules.join(_.join)
1818
}
1919

20-
lazy val classesObservable: Def.Initialize[Observable[Seq[String]]] = Def.settingDyn {
20+
lazy val classesToUpdate: Def.Initialize[Observable[Seq[String]]] = Def.settingDyn {
2121
val internalDependencies = Keys.bspInternalDependencyConfigurations
2222
val observables = for {
2323
(proj, configs) <- Keys.bspInternalDependencyConfigurations.value
2424
config <- configs
25-
} yield (proj / config / debugAdapterClassesObserver)
25+
} yield (proj / config / debugAdapterClassesToUpdate)
2626
Def.setting {
2727
observables.join.value.fold(Observable.empty[Seq[String]])(_ mergeWith _)
2828
}

modules/sbt-plugin/src/main/scala/ch/epfl/scala/debugadapter/sbtplugin/internal/SbtDebuggee.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,16 @@ import scala.concurrent.{ExecutionContext, Future}
1414
import scala.util.control.NonFatal
1515
import ch.epfl.scala.debugadapter.testing.TestSuiteEvent
1616
import io.reactivex.Observable
17+
import java.io.Closeable
1718

1819
private[debugadapter] sealed trait SbtDebuggee extends Debuggee {
1920
val logger: LoggerAdapter
21+
val classesToUpdate: Observable[Seq[String]]
22+
23+
override def observeClassesToUpdate(updateClasses: Seq[String] => Unit): Closeable = {
24+
val subscription = classesToUpdate.subscribe(updateClasses(_))
25+
() => if (!subscription.isDisposed) subscription.dispose
26+
}
2027
}
2128

2229
private[debugadapter] final class MainClassDebuggee(

modules/tests/src/main/scala/ch/epfl/scala/debugadapter/testfmk/MockDebuggee.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import ch.epfl.scala.debugadapter.Module
1111
import ch.epfl.scala.debugadapter.Library
1212
import ch.epfl.scala.debugadapter.UnmanagedEntry
1313
import ch.epfl.scala.debugadapter.JavaRuntime
14-
import io.reactivex.subjects.PublishSubject
15-
import io.reactivex.Observable
14+
import java.io.Closeable
1615

1716
class MockDebuggee extends Debuggee {
1817
val scalaVersion: ScalaVersion = ScalaVersion.`2.12`
@@ -35,7 +34,7 @@ class MockDebuggee extends Debuggee {
3534

3635
override def javaRuntime: Option[JavaRuntime] = None
3736

38-
override val classesToUpdate: Observable[Seq[String]] = PublishSubject.create[Seq[String]]()
37+
override def observeClassesToUpdate(updateClasses: Seq[String] => Unit): Closeable = () => ()
3938
}
4039

4140
class MockCancelableFuture() extends CancelableFuture[Unit] {

modules/tests/src/main/scala/ch/epfl/scala/debugadapter/testfmk/TestingDebuggee.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ import ch.epfl.scala.debugadapter.SourceDirectory
1212
import ch.epfl.scala.debugadapter.StandaloneSourceFile
1313
import ch.epfl.scala.debugadapter.UnmanagedEntry
1414
import ch.epfl.scala.debugadapter.testfmk.TestingDebuggee._
15+
import io.reactivex.subjects.PublishSubject
16+
import io.reactivex.subjects.Subject
1517

1618
import java.io.BufferedReader
19+
import java.io.Closeable
1720
import java.io.InputStream
1821
import java.io.InputStreamReader
1922
import java.net.InetSocketAddress
@@ -25,8 +28,6 @@ import scala.concurrent.Future
2528
import scala.concurrent.Promise
2629
import scala.util.Properties
2730
import scala.util.control.NonFatal
28-
import io.reactivex.subjects.Subject
29-
import io.reactivex.subjects.PublishSubject
3031

3132
case class TestingDebuggee(
3233
tempDir: Path,
@@ -41,7 +42,11 @@ case class TestingDebuggee(
4142
) extends Debuggee
4243
with TestingContext {
4344

44-
override val classesToUpdate: Subject[Seq[String]] = PublishSubject.create()
45+
val classesToUpdate: Subject[Seq[String]] = PublishSubject.create()
46+
override def observeClassesToUpdate(updateClasses: Seq[String] => Unit): Closeable = {
47+
val subscription = classesToUpdate.subscribe(updateClasses(_))
48+
() => if (!subscription.isDisposed) subscription.dispose
49+
}
4550
def mainSource: Path = sourceFiles.head
4651

4752
override def name: String = mainClass

0 commit comments

Comments
 (0)