diff --git a/libraries/stdlib/src/Iterators.kt b/libraries/stdlib/src/Iterators.kt index e6e52586e08..5dbbba0586d 100644 --- a/libraries/stdlib/src/Iterators.kt +++ b/libraries/stdlib/src/Iterators.kt @@ -5,14 +5,14 @@ import kotlin.support.AbstractIterator import java.util.* import java.util.Iterator -/** Filters the iterator for all elements of a certain kind */ -inline fun java.util.Iterator.filterIs(): Iterator = FilterIsIterator(this) +/** Filters the iterator for all elements of a certain sub class */ +inline fun java.util.Iterator.filterIsInstance(klass: Class): Iterator = FilterIsIterator(this, klass) -private class FilterIsIterator(val iter: java.util.Iterator) : AbstractIterator() { +private class FilterIsIterator(val iter: java.util.Iterator, val klass: Class) : AbstractIterator() { override fun computeNext(): R? { while (iter.hasNext()) { val next = iter.next() - if (next is R) { + if (klass.isInstance(next)) { return next as R } } diff --git a/libraries/stdlib/src/dom/Dom.kt b/libraries/stdlib/src/dom/Dom.kt index 072c529733e..41991555e89 100644 --- a/libraries/stdlib/src/dom/Dom.kt +++ b/libraries/stdlib/src/dom/Dom.kt @@ -225,10 +225,10 @@ protected class PreviousSiblingIterator(var node: Node) : AbstractIterator } /** Returns an [[Iterator]] of all the next [[Element]] siblings */ -fun Node.nextElements(): Iterator = nextSiblings().filterIs() +fun Node.nextElements(): Iterator = nextSiblings().filterIsInstance(javaClass()) /** Returns an [[Iterator]] of all the previous [[Element]] siblings */ -fun Node.previousElements(): Iterator = previousSiblings().filterIs() +fun Node.previousElements(): Iterator = previousSiblings().filterIsInstance(javaClass()) /** Returns the attribute value or empty string if its not present */ inline fun Element.attribute(name: String): String { diff --git a/libraries/stdlib/test/dom/DomBuilderTest.kt b/libraries/stdlib/test/dom/DomBuilderTest.kt index af5bcb49d77..459e922e2a2 100644 --- a/libraries/stdlib/test/dom/DomBuilderTest.kt +++ b/libraries/stdlib/test/dom/DomBuilderTest.kt @@ -61,7 +61,9 @@ class DomBuilderTest() : TestCase() { assertEquals(1, doc["#id3"].size()) val root = doc.rootElement - if (root != null) { + if (root == null) { + fail("No root!") + } else { assertTrue { root.hasClass("bar") } @@ -82,10 +84,13 @@ class DomBuilderTest() : TestCase() { assertEquals(1, root["#id1"].size()) assertEquals(1, root["#id2"].size()) assertEquals(1, root["#id3"].size()) - } else { - fail("No root!") - } + // iterating through next element siblings + for (e in root.nextElements()) { + println("found element: $e") + } + + } val grandChild = doc["grandChild"].first if (grandChild != null) { println("got element ${grandChild.toXmlString()} with text '${grandChild.text}`") @@ -119,5 +124,6 @@ class DomBuilderTest() : TestCase() { val xml = nodesToXmlString(children) println("root element has children: ${xml}") assertEquals(1, children.size()) + } }