Add keep_shadowed_builtins feature to roc_parse

This commit is contained in:
satotake 2021-11-07 12:27:43 +00:00 committed by GitHub
parent 0922c86352
commit f3ee0bef40
2 changed files with 26 additions and 12 deletions

View file

@ -5,6 +5,11 @@ authors = ["The Roc Contributors"]
license = "UPL-1.0" license = "UPL-1.0"
edition = "2018" edition = "2018"
[features]
# If enabled, parser accepts `Dict.#hashTestOnly` etc.
# For development puporpse.
keep_shadowed_builtins = []
[dependencies] [dependencies]
roc_collections = { path = "../collections" } roc_collections = { path = "../collections" }
roc_region = { path = "../region" } roc_region = { path = "../region" }

View file

@ -220,6 +220,10 @@ pub enum BadIdent {
BadPrivateTag(Row, Col), BadPrivateTag(Row, Col),
} }
fn chomp_lowercase_part_keep_shadowed_builtins(buffer: &[u8]) -> Result<&str, Progress> {
chomp_part(|c: char| c.is_lowercase() || c == '#', buffer)
}
fn chomp_lowercase_part(buffer: &[u8]) -> Result<&str, Progress> { fn chomp_lowercase_part(buffer: &[u8]) -> Result<&str, Progress> {
chomp_part(|c: char| c.is_lowercase(), buffer) chomp_part(|c: char| c.is_lowercase(), buffer)
} }
@ -499,7 +503,12 @@ fn chomp_access_chain<'a>(buffer: &'a [u8], parts: &mut Vec<'a, &'a str>) -> Res
while let Some(b'.') = buffer.get(chomped) { while let Some(b'.') = buffer.get(chomped) {
match &buffer.get(chomped + 1..) { match &buffer.get(chomped + 1..) {
Some(slice) => match chomp_lowercase_part(slice) { Some(slice) => {
let res = match cfg!(feature = "keep_shadowed_builtins") {
true => chomp_lowercase_part_keep_shadowed_builtins(slice),
false => chomp_lowercase_part(slice),
};
match res {
Ok(name) => { Ok(name) => {
let value = unsafe { let value = unsafe {
std::str::from_utf8_unchecked( std::str::from_utf8_unchecked(
@ -507,11 +516,11 @@ fn chomp_access_chain<'a>(buffer: &'a [u8], parts: &mut Vec<'a, &'a str>) -> Res
) )
}; };
parts.push(value); parts.push(value);
chomped += name.len() + 1; chomped += name.len() + 1;
} }
Err(_) => return Err(chomped as u16 + 1), Err(_) => return Err(chomped as u16 + 1),
}, }
}
None => return Err(chomped as u16 + 1), None => return Err(chomped as u16 + 1),
} }
} }