summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/compiler/scala/tools/nsc/ast/DocComments.scala6
-rw-r--r--src/library/scala/collection/Iterator.scala32
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala1
-rw-r--r--test/junit/scala/collection/IteratorTest.scala10
-rw-r--r--test/scaladoc/run/SI-8210.check1
-rw-r--r--test/scaladoc/run/SI-8210.scala24
6 files changed, 51 insertions, 23 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala
index 02a199f7ac..6442ef2d54 100755
--- a/src/compiler/scala/tools/nsc/ast/DocComments.scala
+++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala
@@ -76,9 +76,9 @@ trait DocComments { self: Global =>
superComment(sym) match {
case None =>
- if (ownComment.indexOf("@inheritdoc") != -1)
- reporter.warning(sym.pos, "The comment for " + sym +
- " contains @inheritdoc, but no parent comment is available to inherit from.")
+ // SI-8210 - The warning would be false negative when this symbol is a setter
+ if (ownComment.indexOf("@inheritdoc") != -1 && ! sym.isSetter)
+ reporter.warning(sym.pos, s"The comment for ${sym} contains @inheritdoc, but no parent comment is available to inherit from.")
ownComment.replaceAllLiterally("@inheritdoc", "<invalid inheritdoc annotation>")
case Some(sc) =>
if (ownComment == "") sc
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 0783beac0f..c9037eb3e3 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -580,29 +580,21 @@ trait Iterator[+A] extends TraversableOnce[A] {
def span(p: A => Boolean): (Iterator[A], Iterator[A]) = {
val self = buffered
- /*
- * Giving a name to following iterator (as opposed to trailing) because
- * anonymous class is represented as a structural type that trailing
- * iterator is referring (the finish() method) and thus triggering
- * handling of structural calls. It's not what's intended here.
- */
+ // Must be a named class to avoid structural call to finish from trailing iterator
class Leading extends AbstractIterator[A] {
- val lookahead = new mutable.Queue[A]
- def advance() = {
- self.hasNext && p(self.head) && {
- lookahead += self.next
- true
- }
+ private val drained = new mutable.Queue[A]
+ private var finished = false
+ def finish(): Unit = {
+ require(!finished)
+ finished = true
+ while (selfish) drained += self.next
}
- def finish() = {
- while (advance()) ()
- }
- def hasNext = lookahead.nonEmpty || advance()
+ private def selfish = self.hasNext && p(self.head)
+ def hasNext = if (finished) drained.nonEmpty else selfish
def next() = {
- if (lookahead.isEmpty)
- advance()
-
- lookahead.dequeue()
+ if (finished) drained.dequeue()
+ else if (selfish) self.next()
+ else empty.next()
}
}
val leading = new Leading
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
index 86155845b0..6cdd99c9ee 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
@@ -59,6 +59,7 @@ abstract class HtmlPage extends Page { thisPage =>
writeFile(site) { (w: Writer) =>
w.write(doctype.toString + "\n")
w.write(xml.Xhtml.toXhtml(html))
+ w.write('\n')
}
if (site.universe.settings.docRawOutput)
diff --git a/test/junit/scala/collection/IteratorTest.scala b/test/junit/scala/collection/IteratorTest.scala
index d5389afd0c..1c1e50aed9 100644
--- a/test/junit/scala/collection/IteratorTest.scala
+++ b/test/junit/scala/collection/IteratorTest.scala
@@ -154,4 +154,14 @@ class IteratorTest {
results += (Stream from 1).toIterator.drop(10).toStream.drop(10).toIterator.next()
assertSameElements(List(1,1,21), results)
}
+ // SI-9332
+ @Test def spanExhaustsLeadingIterator(): Unit = {
+ def it = Iterator.iterate(0)(_ + 1).take(6)
+ val (x, y) = it.span(_ != 1)
+ val z = x.toList
+ assertEquals(1, z.size)
+ assertFalse(x.hasNext)
+ assertEquals(1, y.next)
+ assertFalse(x.hasNext) // was true, after advancing underlying iterator
+ }
}
diff --git a/test/scaladoc/run/SI-8210.check b/test/scaladoc/run/SI-8210.check
new file mode 100644
index 0000000000..619c56180b
--- /dev/null
+++ b/test/scaladoc/run/SI-8210.check
@@ -0,0 +1 @@
+Done.
diff --git a/test/scaladoc/run/SI-8210.scala b/test/scaladoc/run/SI-8210.scala
new file mode 100644
index 0000000000..3bd818473f
--- /dev/null
+++ b/test/scaladoc/run/SI-8210.scala
@@ -0,0 +1,24 @@
+import scala.tools.nsc.doc.model._
+import scala.tools.partest.ScaladocModelTest
+
+object Test extends ScaladocModelTest {
+ override def code = """
+object Foo {
+ trait Config {
+ /** The bar obviously. */
+ def bar: Int
+ }
+ class ConfigBuilder extends Config {
+ /** @inheritdoc
+ *
+ * The default value is 1234.
+ */
+ var bar: Int = 1234
+ }
+}
+ """
+
+ def scaladocSettings = ""
+
+ def testModel(root: Package) = ()
+}