Use local slice_chars

StrExt::slice_chars is deprecated and will be removed in Rust. This
lifts the implementation from Rust libstd and puts it in util::str.

This fixes a bunch of deprecation warnings in Servo.
This commit is contained in:
Jack Moffitt 2015-07-31 12:23:13 -06:00
parent ca9f9226b0
commit dae1a398a4
7 changed files with 41 additions and 17 deletions

View file

@ -46,7 +46,7 @@ use url::Url;
use util::geometry::{Au, ZERO_POINT}; use util::geometry::{Au, ZERO_POINT};
use util::logical_geometry::{LogicalRect, LogicalSize, LogicalMargin, WritingMode}; use util::logical_geometry::{LogicalRect, LogicalSize, LogicalMargin, WritingMode};
use util::range::*; use util::range::*;
use util::str::is_whitespace; use util::str::{is_whitespace, slice_chars};
use util; use util;
/// Fragments (`struct Fragment`) are the leaves of the layout tree. They cannot position /// Fragments (`struct Fragment`) are the leaves of the layout tree. They cannot position
@ -204,8 +204,8 @@ impl fmt::Debug for SpecificFragmentInfo {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
SpecificFragmentInfo::ScannedText(ref info) => { SpecificFragmentInfo::ScannedText(ref info) => {
write!(f, " \"{}\"", info.run.text.slice_chars(info.range.begin().get() as usize, write!(f, " \"{}\"", slice_chars(&*info.run.text, info.range.begin().get() as usize,
info.range.end().get() as usize)) info.range.end().get() as usize))
} }
_ => Ok(()) _ => Ok(())
} }
@ -2094,7 +2094,8 @@ impl Fragment {
let mut leading_whitespace_character_count = 0; let mut leading_whitespace_character_count = 0;
{ {
let text = scanned_text_fragment_info.run.text.slice_chars( let text = slice_chars(
&*scanned_text_fragment_info.run.text,
scanned_text_fragment_info.range.begin().to_usize(), scanned_text_fragment_info.range.begin().to_usize(),
scanned_text_fragment_info.range.end().to_usize()); scanned_text_fragment_info.range.end().to_usize());
for character in text.chars() { for character in text.chars() {

View file

@ -35,6 +35,7 @@ use unicode_bidi;
use util::geometry::{Au, MAX_AU, ZERO_RECT}; use util::geometry::{Au, MAX_AU, ZERO_RECT};
use util::logical_geometry::{LogicalRect, LogicalSize, WritingMode}; use util::logical_geometry::{LogicalRect, LogicalSize, WritingMode};
use util::range::{Range, RangeIndex}; use util::range::{Range, RangeIndex};
use util::str::slice_chars;
use util; use util;
// From gfxFontConstants.h in Firefox // From gfxFontConstants.h in Firefox
@ -1801,7 +1802,7 @@ fn strip_trailing_whitespace_if_necessary(text_run: &TextRun, range: &mut Range<
debug!("stripping trailing whitespace: range={:?}, len={}", debug!("stripping trailing whitespace: range={:?}, len={}",
range, range,
text_run.text.chars().count()); text_run.text.chars().count());
let text = text_run.text.slice_chars(range.begin().to_usize(), range.end().to_usize()); let text = slice_chars(&*text_run.text, range.begin().to_usize(), range.end().to_usize());
let mut trailing_whitespace_character_count = 0; let mut trailing_whitespace_character_count = 0;
for ch in text.chars().rev() { for ch in text.chars().rev() {
if util::str::char_is_whitespace(ch) { if util::str::char_is_whitespace(ch) {

View file

@ -13,7 +13,6 @@
#![feature(mpsc_select)] #![feature(mpsc_select)]
#![feature(plugin)] #![feature(plugin)]
#![feature(raw)] #![feature(raw)]
#![feature(slice_chars)]
#![feature(step_by)] #![feature(step_by)]
#![feature(str_char)] #![feature(str_char)]
#![feature(unsafe_no_drop_flag)] #![feature(unsafe_no_drop_flag)]

View file

@ -17,7 +17,7 @@ use dom::element::Element;
use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::node::{Node, NodeHelpers, NodeTypeId}; use dom::node::{Node, NodeHelpers, NodeTypeId};
use util::str::DOMString; use util::str::{DOMString, slice_chars};
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cell::Ref; use std::cell::Ref;
@ -74,7 +74,7 @@ impl<'a> CharacterDataMethods for &'a CharacterData {
} }
// Steps 3-4. // Steps 3-4.
let end = if length - offset < count { length } else { offset + count }; let end = if length - offset < count { length } else { offset + count };
Ok(data.slice_chars(offset as usize, end as usize).to_owned()) Ok(slice_chars(&*data, offset as usize, end as usize).to_owned())
} }
// https://dom.spec.whatwg.org/#dom-characterdata-appenddatadata // https://dom.spec.whatwg.org/#dom-characterdata-appenddatadata
@ -107,9 +107,9 @@ impl<'a> CharacterDataMethods for &'a CharacterData {
}; };
// Step 4: Mutation observers. // Step 4: Mutation observers.
// Step 5. // Step 5.
let mut data = self.data.borrow().slice_chars(0, offset as usize).to_owned(); let mut data = slice_chars(&*self.data.borrow(), 0, offset as usize).to_owned();
data.push_str(&arg); data.push_str(&arg);
data.push_str(&self.data.borrow().slice_chars((offset + count) as usize, length as usize)); data.push_str(slice_chars(&*self.data.borrow(), (offset + count) as usize, length as usize));
*self.data.borrow_mut() = data; *self.data.borrow_mut() = data;
// FIXME: Once we have `Range`, we should implement step7 to step11 // FIXME: Once we have `Range`, we should implement step7 to step11
Ok(()) Ok(())

View file

@ -21,7 +21,6 @@
#![feature(plugin)] #![feature(plugin)]
#![feature(ref_slice)] #![feature(ref_slice)]
#![feature(rc_unique)] #![feature(rc_unique)]
#![feature(slice_chars)]
#![feature(str_utf16)] #![feature(str_utf16)]
#![feature(unicode)] #![feature(unicode)]
#![feature(vec_push_all)] #![feature(vec_push_all)]

View file

@ -8,7 +8,7 @@ use clipboard_provider::ClipboardProvider;
use dom::keyboardevent::{KeyboardEvent, KeyboardEventHelpers, key_value}; use dom::keyboardevent::{KeyboardEvent, KeyboardEventHelpers, key_value};
use msg::constellation_msg::{SHIFT, CONTROL, ALT, SUPER}; use msg::constellation_msg::{SHIFT, CONTROL, ALT, SUPER};
use msg::constellation_msg::{Key, KeyModifiers}; use msg::constellation_msg::{Key, KeyModifiers};
use util::str::DOMString; use util::str::{DOMString, slice_chars};
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cmp::{min, max}; use std::cmp::{min, max};
@ -159,16 +159,16 @@ impl<T: ClipboardProvider> TextInput<T> {
self.get_sorted_selection().map(|(begin, end)| { self.get_sorted_selection().map(|(begin, end)| {
if begin.line != end.line { if begin.line != end.line {
let mut s = String::new(); let mut s = String::new();
s.push_str(self.lines[begin.line].slice_chars(begin.index, self.lines[begin.line].len())); s.push_str(slice_chars(&self.lines[begin.line], begin.index, self.lines[begin.line].len()));
for (_, line) in self.lines.iter().enumerate().filter(|&(i,_)| begin.line < i && i < end.line) { for (_, line) in self.lines.iter().enumerate().filter(|&(i,_)| begin.line < i && i < end.line) {
s.push_str("\n"); s.push_str("\n");
s.push_str(line); s.push_str(line);
} }
s.push_str("\n"); s.push_str("\n");
s.push_str(self.lines[end.line].slice_chars(0, end.index)); s.push_str(slice_chars(&self.lines[end.line], 0, end.index));
s s
} else { } else {
self.lines[begin.line].slice_chars(begin.index, end.index).to_owned() slice_chars(&self.lines[begin.line], begin.index, end.index).to_owned()
} }
}) })
} }
@ -178,8 +178,8 @@ impl<T: ClipboardProvider> TextInput<T> {
self.clear_selection(); self.clear_selection();
let new_lines = { let new_lines = {
let prefix = self.lines[begin.line].slice_chars(0, begin.index); let prefix = slice_chars(&self.lines[begin.line], 0, begin.index);
let suffix = self.lines[end.line].slice_chars(end.index, self.lines[end.line].chars().count()); let suffix = slice_chars(&self.lines[end.line], end.index, self.lines[end.line].chars().count());
let lines_prefix = &self.lines[..begin.line]; let lines_prefix = &self.lines[..begin.line];
let lines_suffix = &self.lines[end.line + 1..]; let lines_suffix = &self.lines[end.line + 1..];

View file

@ -335,3 +335,27 @@ pub fn str_join<T: AsRef<str>>(strs: &[T], join: &str) -> String {
acc acc
}) })
} }
// Lifted from Rust's StrExt implementation, which is being removed.
pub fn slice_chars(s: &str, begin: usize, end: usize) -> &str {
assert!(begin <= end);
let mut count = 0;
let mut begin_byte = None;
let mut end_byte = None;
// This could be even more efficient by not decoding,
// only finding the char boundaries
for (idx, _) in s.char_indices() {
if count == begin { begin_byte = Some(idx); }
if count == end { end_byte = Some(idx); break; }
count += 1;
}
if begin_byte.is_none() && count == begin { begin_byte = Some(s.len()) }
if end_byte.is_none() && count == end { end_byte = Some(s.len()) }
match (begin_byte, end_byte) {
(None, _) => panic!("slice_chars: `begin` is beyond end of string"),
(_, None) => panic!("slice_chars: `end` is beyond end of string"),
(Some(a), Some(b)) => unsafe { s.slice_unchecked(a, b) }
}
}