1 // Copyright (c) Facebook, Inc. and its affiliates.
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
6 use parser_rust as parser;
8 use parser::lexable_token::LexableToken;
9 use parser::positioned_token::PositionedToken;
10 use parser::source_text::SourceText;
11 use parser::token_kind::TokenKind;
12 use parser_rust::positioned_trivia::PositionedTrivia;
14 use crate::editable_positioned_original_source_data::SourceData;
17 pub struct SyntheticTokenData {
22 pub enum TokenData<'a> {
23 Original(SourceData<'a>),
24 SynthesizedFromOriginal(SyntheticTokenData, SourceData<'a>),
25 Synthetic(SyntheticTokenData),
29 pub struct EditablePositionedToken<'a> {
31 pub leading_text: String,
32 pub trailing_text: String,
33 pub token_data: TokenData<'a>,
36 impl<'a> LexableToken<'a> for EditablePositionedToken<'a> {
37 type Trivia = PositionedTrivia;
41 _source_text: &SourceText,
44 _leading: Vec<Self::Trivia>,
45 _trailing: Vec<Self::Trivia>,
50 fn kind(&self) -> TokenKind {
54 fn leading_start_offset(&self) -> Option<usize> {
58 fn width(&self) -> usize {
62 fn leading_width(&self) -> usize {
66 fn trailing_width(&self) -> usize {
70 fn full_width(&self) -> usize {
74 fn leading(&self) -> &[Self::Trivia] {
78 fn trailing(&self) -> &[Self::Trivia] {
82 fn with_leading(self, _leading: Vec<Self::Trivia>) -> Self {
86 fn with_trailing(self, _trailing: Vec<Self::Trivia>) -> Self {
90 fn with_kind(self, _kind: TokenKind) -> Self {
95 impl<'a> EditablePositionedToken<'a> {
96 pub fn from_positioned_token(
97 positioned_token: &PositionedToken,
98 source_text: &SourceText<'a>,
101 String::from_utf8(positioned_token.leading_text(source_text).to_vec()).unwrap();
103 String::from_utf8(positioned_token.trailing_text(source_text).to_vec()).unwrap();
105 kind: positioned_token.kind(),
108 token_data: TokenData::Original(SourceData::from_positioned_token(