Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jul 13, 2020. It is now read-only.
/ankoPublic archive

Commitd2e3ff2

Browse files
DarkEspressoyanex
authored andcommitted
childrenRecursiveSequence: fix NoSuchElementException being thrown when hasNext() returned true (#388)
1 parent61f3055 commitd2e3ff2

File tree

2 files changed

+83
-22
lines changed

2 files changed

+83
-22
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
packagetest
2+
3+
importandroid.app.Activity
4+
importandroid.os.Bundle
5+
importandroid.widget.LinearLayout
6+
importandroid.widget.RelativeLayout
7+
importandroid.widget.TextView
8+
importorg.jetbrains.anko.*
9+
importorg.junit.Assert.assertEquals
10+
importorg.junit.Test
11+
importorg.junit.runner.RunWith
12+
importorg.robolectric.Robolectric
13+
importorg.robolectric.RobolectricGradleTestRunner
14+
importorg.robolectric.annotation.Config
15+
16+
openclassChildrenSequenceTestActivity:Activity() {
17+
overridefunonCreate(savedInstanceState:Bundle?) {
18+
super.onCreate(savedInstanceState)
19+
20+
verticalLayout {
21+
id=1
22+
23+
relativeLayout {
24+
id=2
25+
textView {
26+
id=3
27+
}
28+
textView {
29+
id=4
30+
}
31+
relativeLayout {
32+
id=5
33+
textView {
34+
id=6
35+
}
36+
}
37+
}
38+
textView {
39+
id=7
40+
}
41+
}
42+
}
43+
}
44+
45+
@RunWith(RobolectricGradleTestRunner::class)
46+
@Config(constants=BuildConfig::class)classChildrenSequenceTest {
47+
@TestfuntestChildrenSequence() {
48+
val activity=Robolectric.buildActivity(ChildrenSequenceTestActivity::class.java).create().get()
49+
50+
val verticalLayout= activity.findViewById(1)asLinearLayout
51+
val relativeLayout= activity.findViewById(2)asRelativeLayout
52+
val textView= activity.findViewById(3)asTextView
53+
54+
assertEquals(listOf(2,7), verticalLayout.childrenSequence().map { it.id }.toList())
55+
assertEquals(listOf(3,4,5), relativeLayout.childrenSequence().map { it.id }.toList())
56+
assert(textView.childrenSequence().toList().isEmpty())
57+
}
58+
59+
@TestfuntestChildrenRecursiveSequence() {
60+
val activity=Robolectric.buildActivity(ChildrenSequenceTestActivity::class.java).create().get()
61+
62+
val verticalLayout= activity.findViewById(1)asLinearLayout
63+
val relativeLayout= activity.findViewById(2)asRelativeLayout
64+
val textView= activity.findViewById(3)asTextView
65+
66+
assertEquals(listOf(2,7,3,4,5,6), verticalLayout.childrenRecursiveSequence().map { it.id }.toList())
67+
assertEquals(listOf(3,4,5,6), relativeLayout.childrenRecursiveSequence().map { it.id }.toList())
68+
assert(textView.childrenRecursiveSequence().toList().isEmpty())
69+
}
70+
}

‎anko/library/static/commons/src/viewChildrenSequences.kt

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,43 +118,34 @@ private class ViewChildrenSequence(private val view: View) : Sequence<View> {
118118
}
119119

120120
privateclassViewChildrenRecursiveSequence(privatevalview:View) : Sequence<View> {
121-
overridefuniterator()=RecursiveViewIterator(view)
121+
overridefuniterator():Iterator<View> {
122+
if (view!isViewGroup)return emptyList<View>().iterator()
123+
returnRecursiveViewIterator(view)
124+
}
122125

123126
privateclassRecursiveViewIterator(view:View) : Iterator<View> {
124-
privateval sequences=arrayListOf(sequenceOf(view))
125-
privatevaritemIterator:Iterator<View>?=null
127+
privateval sequences=arrayListOf(view.childrenSequence())
128+
privatevarcurrent= sequences.removeLast().iterator()
126129

127130
overridefunnext():View {
128-
initItemIterator()
129-
val iterator= itemIterator?:throwNoSuchElementException()
130-
131-
val view= iterator.next()
131+
if (!hasNext())throwNoSuchElementException()
132+
val view= current.next()
132133
if (viewisViewGroup&& view.childCount>0) {
133134
sequences.add(view.childrenSequence())
134135
}
135136
return view
136137
}
137138

138139
overridefunhasNext():Boolean {
139-
initItemIterator()
140-
val iterator= itemIterator?:returnfalse
141-
return iterator.hasNext()
142-
}
143-
144-
privatefuninitItemIterator() {
145-
val seqs= sequences
146-
val iterator= itemIterator
147-
148-
if (iterator==null|| (!iterator.hasNext()&& seqs.isNotEmpty())) {
149-
itemIterator= seqs.removeLast()?.iterator()
150-
}else {
151-
itemIterator=null
140+
if (!current.hasNext()&& sequences.isNotEmpty()) {
141+
current= sequences.removeLast().iterator()
152142
}
143+
return current.hasNext()
153144
}
154145

155146
@Suppress("NOTHING_TO_INLINE")
156-
privateinlinefun <T:Any> MutableList<T>.removeLast():T? {
157-
if (isEmpty())returnnull
147+
privateinlinefun <T:Any> MutableList<T>.removeLast():T {
148+
if (isEmpty())throwNoSuchElementException()
158149
return removeAt(size-1)
159150
}
160151
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp