Skip to content

Commit b555c43

Browse files
committed
Remove word view, use index methods
1 parent 45f1aec commit b555c43

File tree

7 files changed

+90
-144
lines changed

7 files changed

+90
-144
lines changed

stdlib/public/core/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ set(SWIFTLIB_ESSENTIAL
171171
StringUTF8View.swift
172172
StringUTF8Validation.swift
173173
StringWordBreaking.swift
174-
StringWordView.swift
175174
Substring.swift
176175
SwiftNativeNSArray.swift
177176
TemporaryAllocation.swift

stdlib/public/core/GroupInfo.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
"StringUTF8Validation.swift",
4343
"StringUnicodeScalarView.swift",
4444
"StringWordBreaking.swift",
45-
"StringWordView.swift",
4645
"Substring.swift",
4746
"Unicode.swift",
4847
"UnicodeData.swift",

stdlib/public/core/StringIndexValidation.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -402,22 +402,16 @@ extension _StringGuts {
402402
// Word index validation (String)
403403
extension _StringGuts {
404404
internal func validateWordIndex(
405-
_ i: String._WordView.Index
406-
) -> String._WordView.Index {
407-
let i = String.Index(_encodedOffset: i._encodedOffset)
408-
409-
return roundDownToNearestWord(
410-
String._WordView.Index(scalarAlign(validateSubscalarIndex(i)))
411-
)
405+
_ i: String.Index
406+
) -> String.Index {
407+
return roundDownToNearestWord(scalarAlign(validateSubscalarIndex(i)))
412408
}
413409

414410
internal func validateInclusiveWordIndex(
415-
_ i: String._WordView.Index
416-
) -> String._WordView.Index {
417-
let i = String.Index(_encodedOffset: i._encodedOffset)
418-
411+
_ i: String.Index
412+
) -> String.Index {
419413
return roundDownToNearestWord(
420-
String._WordView.Index(scalarAlign(validateInclusiveSubscalarIndex(i)))
414+
scalarAlign(validateInclusiveSubscalarIndex(i))
421415
)
422416
}
423417
}

stdlib/public/core/StringWordBreaking.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
extension _StringGuts {
1313
internal func roundDownToNearestWord(
14-
_ i: String._WordView.Index
15-
) -> String._WordView.Index {
14+
_ i: String.Index
15+
) -> String.Index {
1616
_internalInvariant(i._encodedOffset <= count)
1717

1818
let offset = i._encodedOffset
@@ -26,8 +26,8 @@ extension _StringGuts {
2626

2727
@inline(never)
2828
internal func _slowRoundDownToNearestWord(
29-
_ i: String._WordView.Index
30-
) -> String._WordView.Index {
29+
_ i: String.Index
30+
) -> String.Index {
3131
let offset = i._encodedOffset
3232
let start = previousWordIndex(endingAt: offset)
3333
let end = nextWordIndex(startingAt: start)
@@ -37,7 +37,7 @@ extension _StringGuts {
3737
return i
3838
}
3939

40-
return String._WordView.Index(_encodedOffset: start)
40+
return String.Index(_encodedOffset: start)
4141
}
4242

4343
@inline(never)

stdlib/public/core/StringWordView.swift

Lines changed: 0 additions & 113 deletions
This file was deleted.

stdlib/public/core/UnicodeSPI.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,32 @@ extension Unicode.Scalar.Properties {
199199
return result
200200
}
201201
}
202+
203+
//===----------------------------------------------------------------------===//
204+
// String Word Breaking
205+
//===----------------------------------------------------------------------===//
206+
207+
extension String {
208+
@_spi(_Unicode)
209+
@available(SwiftStdlib 5.7, *)
210+
public func _wordIndex(after i: String.Index) -> String.Index {
211+
_precondition(i < endIndex)
212+
213+
let i = _guts.validateWordIndex(i)
214+
215+
let next = _guts.nextWordIndex(startingAt: i._encodedOffset)
216+
return String.Index(_encodedOffset: next)
217+
}
218+
219+
@_spi(_Unicode)
220+
@available(SwiftStdlib 5.7, *)
221+
public func _wordIndex(before i: String.Index) -> String.Index {
222+
_precondition(i > startIndex)
223+
_precondition(i <= endIndex)
224+
225+
let i = _guts.validateInclusiveWordIndex(i)
226+
227+
let previous = _guts.previousWordIndex(endingAt: i._encodedOffset)
228+
return String.Index(_encodedOffset: previous)
229+
}
230+
}

validation-test/stdlib/StringWordBreaking.swift

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,57 @@ let StringWordBreaking = TestSuite("StringWordBreaking")
2828
// }
2929
// }
3030

31+
extension String {
32+
@available(SwiftStdlib 5.7, *)
33+
var _words: [String] {
34+
var result: [String] = []
35+
36+
var i = startIndex
37+
38+
while i < endIndex {
39+
let start = i
40+
let end = _wordIndex(after: i)
41+
42+
let substr = self[start ..< end]
43+
result.append(String(substr))
44+
45+
i = end
46+
}
47+
48+
return result
49+
}
50+
51+
@available(SwiftStdlib 5.7, *)
52+
var _wordsBackwards: [String] {
53+
var result: [String] = []
54+
55+
var i = endIndex
56+
57+
while i > startIndex {
58+
let end = i
59+
let start = _wordIndex(before: i)
60+
61+
let substr = self[start ..< end]
62+
result.append(String(substr))
63+
64+
i = start
65+
}
66+
67+
return result
68+
}
69+
}
70+
3171
if #available(SwiftStdlib 5.7, *) {
3272
StringWordBreaking.test("word breaking") {
3373
for wordBreakTest in wordBreakTests {
3474
expectEqual(
3575
wordBreakTest.1,
36-
wordBreakTest.0._words().map { String($0) },
76+
wordBreakTest.0._words,
77+
"string: \(String(reflecting: wordBreakTest.0))")
78+
expectEqual(
79+
wordBreakTest.1.reversed(),
80+
wordBreakTest.0._wordsBackwards,
3781
"string: \(String(reflecting: wordBreakTest.0))")
38-
// FIXME: Reenable once we figure out what to do with WordView
39-
// expectEqual(
40-
// wordBreakTest.1.reversed(),
41-
// wordBreakTest.0._words().reversed().map { String($0) },
42-
// "string: \(String(reflecting: wordBreakTest.0))")
4382
}
4483
}
4584
}
@@ -107,13 +146,12 @@ if #available(SwiftStdlib 5.7, *) {
107146
expectTrue(test._guts._isForeign())
108147
expectEqual(
109148
wordBreakTest.1,
110-
test._words().map { String($0) },
149+
test._words,
150+
"string: \(String(reflecting: wordBreakTest.0))")
151+
expectEqual(
152+
wordBreakTest.1.reversed(),
153+
test._wordsBackwards,
111154
"string: \(String(reflecting: wordBreakTest.0))")
112-
// FIXME: Reenable once we figure out what to do with WordView
113-
// expectEqual(
114-
// wordBreakTest.1,
115-
// test._words().reversed().map { String($0) },
116-
// "string: \(String(reflecting: wordBreakTest.0))")
117155
}
118156
}
119157
}

0 commit comments

Comments
 (0)