From 3b2ba59526f8e524aa3c1526dda2828a93653ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Wed, 7 Nov 2018 11:58:34 +0100 Subject: [PATCH] Use ArrayString instead of hand rolled data structure --- Cargo.lock | 1 + crates/ra_syntax/Cargo.toml | 1 + crates/ra_syntax/src/lib.rs | 1 + crates/ra_syntax/src/utils.rs | 36 ------------------------------ crates/ra_syntax/src/validation.rs | 6 ++--- 5 files changed, 6 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd1fb5ea5a..555efdfb91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -671,6 +671,7 @@ dependencies = [ name = "ra_syntax" version = "0.1.0" dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "drop_bomb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index de4b25e673..0f709026f4 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml @@ -8,6 +8,7 @@ description = "Comment and whitespace preserving parser for the Rust langauge" repository = "https://github.com/rust-analyzer/rust-analyzer" [dependencies] +arrayvec = "0.4.7" unicode-xid = "0.1.0" itertools = "0.7.8" drop_bomb = "0.1.4" diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index 1230028257..319fb947d3 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -20,6 +20,7 @@ #![allow(missing_docs)] //#![warn(unreachable_pub)] // rust-lang/rust#47816 +extern crate arrayvec; extern crate drop_bomb; extern crate itertools; extern crate parking_lot; diff --git a/crates/ra_syntax/src/utils.rs b/crates/ra_syntax/src/utils.rs index 5bef4a6393..cad9544bef 100644 --- a/crates/ra_syntax/src/utils.rs +++ b/crates/ra_syntax/src/utils.rs @@ -1,6 +1,5 @@ use crate::{File, SyntaxKind, SyntaxNodeRef, WalkEvent}; use std::fmt::Write; -use std::ops::Deref; use std::str; /// Parse a file and create a string representation of the resulting parse tree. @@ -80,38 +79,3 @@ pub(crate) fn validate_block_structure(root: SyntaxNodeRef) { } } } - -#[derive(Debug)] -pub struct MutAsciiString<'a> { - buf: &'a mut [u8], - len: usize, -} - -impl<'a> MutAsciiString<'a> { - pub fn new(buf: &'a mut [u8]) -> MutAsciiString<'a> { - MutAsciiString { buf, len: 0 } - } - - pub fn as_str(&self) -> &str { - str::from_utf8(&self.buf[..self.len]).unwrap() - } - - pub fn len(&self) -> usize { - self.len - } - - pub fn push(&mut self, c: char) { - assert!(self.len() < self.buf.len()); - assert!(c.is_ascii()); - - self.buf[self.len] = c as u8; - self.len += 1; - } -} - -impl<'a> Deref for MutAsciiString<'a> { - type Target = str; - fn deref(&self) -> &str { - self.as_str() - } -} diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs index a2509dc907..61cf83c846 100644 --- a/crates/ra_syntax/src/validation.rs +++ b/crates/ra_syntax/src/validation.rs @@ -1,11 +1,12 @@ use std::u32; +use arrayvec::ArrayString; + use crate::{ algo::visit::{visitor_ctx, VisitorCtx}, ast::{self, AstNode}, File, string_lexing::{self, CharComponentKind}, - utils::MutAsciiString, yellow::{ SyntaxError, SyntaxErrorKind::*, @@ -76,8 +77,7 @@ fn validate_char(node: ast::Char, errors: &mut Vec) { return; } - let mut buf = &mut [0; 6]; - let mut code = MutAsciiString::new(buf); + let mut code = ArrayString::<[_; 6]>::new(); let mut closed = false; for c in text[3..].chars() { assert!(!closed, "no characters after escape is closed");