Skip to content

Commit df3eebb

Browse files
committed
better diagnostics
1 parent 30b5cef commit df3eebb

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

src/main/scala/gopher/GopherAPI.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,13 @@ class GopherAPI(as: ActorSystem, es: ExecutionContext)
3030
* }
3131
* }}}
3232
*/
33-
def select: SelectFactory =
33+
val select: SelectFactory =
3434
new SelectFactory(this)
3535

36+
/**
37+
* Generic schema for making objects, which requiere gopherAPI for constructions.
38+
*
39+
**/
3640
def make[T](args: Any*): T = macro GopherAPI.makeImpl[T]
3741

3842
/**

src/main/scala/gopher/channels/SelectorBuilder.scala

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,15 @@ object SelectorBuilder
242242
import c.universe._
243243
cases map { cs =>
244244
cs.pat match {
245-
case Bind(ident, t) => foreachTransformReadWriteCaseDef(c)(bn,cs)
245+
case Bind(ident, t) => foreachTransformReadWriteTimeoutCaseDef(c)(bn,cs)
246246
case Ident(TermName("_")) => foreachTransformIdleCaseDef(c)(bn,cs)
247247
case _ => c.abort(cs.pat.pos,"expected Bind or Default in pattern, have:"+cs.pat)
248248
}
249249
}
250250
}
251251

252252

253-
def foreachTransformReadWriteCaseDef(c:Context)(builderName:c.TermName, caseDef: c.universe.CaseDef):c.Tree=
253+
def foreachTransformReadWriteTimeoutCaseDef(c:Context)(builderName:c.TermName, caseDef: c.universe.CaseDef):c.Tree=
254254
{
255255
import c.universe._
256256

@@ -346,18 +346,27 @@ object SelectorBuilder
346346
tpo match {
347347
case Select(ch,TypeName("read")) =>
348348
if (!caseDef.guard.isEmpty) {
349-
c.abort(caseDef.guard.pos,"guard is not supported in select case")
349+
c.abort(caseDef.guard.pos,"guard is not supported in read in select case")
350350
}
351351
val reading = q"${builderName}.reading(${ch}){ ${param} => ${body} }"
352-
reading
352+
atPos(caseDef.pat.pos)(reading)
353353
case Select(ch,TypeName("write")) =>
354354
val expression = if (!caseDef.guard.isEmpty) {
355355
parseGuardInSelectorCaseDef(c)(termName,caseDef.guard)
356356
} else {
357-
Ident(termName)
357+
atPos(caseDef.pat.pos)(Ident(termName))
358358
}
359359
val writing = q"${builderName}.writing(${ch},${expression})(${param} => ${body} )"
360-
writing
360+
atPos(caseDef.pat.pos)(writing)
361+
case Select(select,TypeName("timeout")) =>
362+
val expression = if (!caseDef.guard.isEmpty) {
363+
parseGuardInSelectorCaseDef(c)(termName,caseDef.guard)
364+
} else {
365+
atPos(caseDef.pat.pos)(q"implicitly[akka.util.Timeout]")
366+
}
367+
val timeout = q"${builderName}.timeout(${expression})(${param} => ${body} )"
368+
System.err.println(s"generate timeout statement: ${timeout}")
369+
atPos(caseDef.pat.pos)(timeout)
361370
case _ =>
362371
if (caseDef.guard.isEmpty) {
363372
c.abort(tp.pos, "row caseDef:"+showRaw(caseDef) );
@@ -396,7 +405,7 @@ object SelectorBuilder
396405
}
397406
c.abort(caseDef.pat.pos, s"match must be in form x:channel.write or x:channel.read, have: ${rawToShow}");
398407
case _ =>
399-
c.abort(caseDef.pat.pos, "match must be in form x:channel.write or x:channel.read");
408+
c.abort(caseDef.pat.pos, "match must be in form x:channel.write or x:channel.read or x:select.timeout");
400409
}
401410

402411
retval

src/main/scala/gopher/channels/SelectorFactory.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import scala.reflect.api._
66
import gopher._
77
import gopher.util._
88
import scala.concurrent._
9+
import scala.concurrent.duration._
910
import scala.annotation.unchecked._
1011

1112

@@ -23,6 +24,8 @@ class SelectFactory(val api: GopherAPI)
2324

2425
selectFactory =>
2526

27+
type timeout = FiniteDuration
28+
2629
trait SelectFactoryApi
2730
{
2831
def api = selectFactory.api

src/test/scala/gopher/channels/MacroSelectSuite.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,23 @@ class MacroSelectSuite extends FunSuite
335335
assert(x2.isInstanceOf[ChannelClosedException])
336336
}
337337

338+
test("select with constant timeout") {
339+
pending
340+
/*
341+
import gopherApi._
342+
val ch1 = makeChannel[Int](10)
343+
val r = select.amap {
344+
case x:ch1.read =>
345+
System.err.println(s"readed ${x}")
346+
x
347+
case x:select.timeout if (x==500.milliseconds) =>
348+
System.err.println(s"timeout 500 ms")
349+
-1
350+
}
351+
val f1 = ch1.awrite(1)
352+
*/
353+
}
354+
338355
lazy val gopherApi = CommonTestObjects.gopherApi
339356

340357
}

0 commit comments

Comments
 (0)