diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala | 10 | ||||
-rw-r--r-- | test/scaladoc/resources/Trac484.scala | 18 | ||||
-rw-r--r-- | test/scaladoc/scala/html/HtmlFactoryTest.scala | 21 |
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 + } + } } |