summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala10
-rw-r--r--test/scaladoc/resources/Trac484.scala18
-rw-r--r--test/scaladoc/scala/html/HtmlFactoryTest.scala21
3 files changed, 47 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
index 5d7b1d1214..4edfa83a0d 100644
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -596,8 +596,14 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory
/* Refined types */
case RefinedType(parents, defs) =>
appendTypes0((if (parents.length > 1) parents filterNot (_ == ObjectClass.tpe) else parents), " with ")
- if (!defs.isEmpty) {
- nameBuffer append " {...}" // TODO: actually print the refinement
+ // XXX Still todo: properly printing refinements.
+ // Since I didn't know how to go about displaying a multi-line type, I went with
+ // printing single method refinements (which should be the most common) and printing
+ // the number of members if there are more.
+ defs.toList match {
+ case Nil => ()
+ case x :: Nil => nameBuffer append (" { " + x.defString + " }")
+ case xs => nameBuffer append (" { ... /* %d definitions in type refinement */ }" format xs.size)
}
/* Eval-by-name types */
case NullaryMethodType(result) =>
diff --git a/test/scaladoc/resources/Trac484.scala b/test/scaladoc/resources/Trac484.scala
new file mode 100644
index 0000000000..b4f81ae172
--- /dev/null
+++ b/test/scaladoc/resources/Trac484.scala
@@ -0,0 +1,18 @@
+class RefinementAndExistentials {
+ type Foo = {
+ type Dingus
+ def bippy(x: Int): String
+ def dingus(): String
+ }
+ type Bar = {
+ type Dingus <: T forSome { type T <: String }
+ }
+ def f(x: Foo) = 51
+ def g(x: T forSome { type T <: String }) = x
+ def h(x: Float): { def quux(x: Int, y: Int): Int } = new {
+ def quux(x: Int, y: Int) = 55
+ }
+ def hh(x: Float) = new { def quux(x: Int, y: Int) = 55 }
+ def j(x: Int): Bar = sys.error("")
+ def k(): AnyRef { type Dingus <: T forSome { type T <: String } } = sys.error("")
+}
diff --git a/test/scaladoc/scala/html/HtmlFactoryTest.scala b/test/scaladoc/scala/html/HtmlFactoryTest.scala
index 0c9f7ff48d..738f459157 100644
--- a/test/scaladoc/scala/html/HtmlFactoryTest.scala
+++ b/test/scaladoc/scala/html/HtmlFactoryTest.scala
@@ -211,4 +211,25 @@ object Test extends Properties("HtmlFactory") {
case _ => false
}
}
+
+ property("Trac #484 - refinements and existentials") = {
+ val files = createTemplates("Trac484.scala")
+ val lines = """
+ |type Bar = AnyRef { type Dingus <: T forSome { type T <: String } }
+ |type Foo = AnyRef { ... /* 3 definitions in type refinement */ }
+ |def g (x: T forSome { type T <: String }): String
+ |def h (x: Float): AnyRef { def quux(x: Int,y: Int): Int }
+ |def hh (x: Float): AnyRef { def quux(x: Int,y: Int): Int }
+ |def j (x: Int): Bar
+ |def k (): AnyRef { type Dingus <: T forSome { type T <: String } }
+ """.stripMargin.trim.lines map (_.trim)
+
+ files("RefinementAndExistentials.html") match {
+ case node: scala.xml.Node => {
+ val s = node.text.replaceAll("\\s+", " ")
+ lines forall (s contains _)
+ }
+ case _ => false
+ }
+ }
}