diff --git a/compiler/parse/src/ident.rs b/compiler/parse/src/ident.rs index 6a55b8a049..447afa8cc8 100644 --- a/compiler/parse/src/ident.rs +++ b/compiler/parse/src/ident.rs @@ -377,12 +377,13 @@ fn chomp_private_tag(buffer: &[u8], row: Row, col: Col) -> Result<&str, BadIdent match chomp_uppercase_part(&buffer[1..]) { Ok(name) => { - let chomped = 1 + name.len(); + let width = 1 + name.len(); - if let Ok(('.', _)) = char::from_utf8_slice_start(&buffer[chomped..]) { - Err(BadIdent::BadPrivateTag(row, col + chomped as u16)) + if let Ok(('.', _)) = char::from_utf8_slice_start(&buffer[width..]) { + Err(BadIdent::BadPrivateTag(row, col + width as u16)) } else { - Ok(name) + let value = unsafe { std::str::from_utf8_unchecked(&buffer[..width]) }; + Ok(value) } } Err(_) => Err(BadIdent::BadPrivateTag(row, col + 1)), diff --git a/compiler/parse/tests/test_parse.rs b/compiler/parse/tests/test_parse.rs index 58dfb65174..412898dfb4 100644 --- a/compiler/parse/tests/test_parse.rs +++ b/compiler/parse/tests/test_parse.rs @@ -1005,7 +1005,7 @@ mod test_parse { use roc_parse::ident::BadIdent; let arena = Bump::new(); - let expected = Expr::MalformedIdent("@One.Two.Whee", BadIdent::QualifiedTag(0, 13)); + let expected = Expr::MalformedIdent("@One.Two.Whee", BadIdent::BadPrivateTag(0, 4)); let actual = parse_expr_with(&arena, "@One.Two.Whee"); assert_eq!(Ok(expected), actual);