Skip to content

Commit e610c8b

Browse files
author
Roman Borschel
committed
Wrap tokens attached to AST nodes in AttachedToken.
1 parent fbbffea commit e610c8b

File tree

4 files changed

+38
-37
lines changed

4 files changed

+38
-37
lines changed

src/ast/mod.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use serde::{Deserialize, Serialize};
3838
use sqlparser_derive::{Visit, VisitMut};
3939

4040
use crate::keywords::Keyword;
41-
use crate::tokenizer::{Span, Token, TokenWithSpan};
41+
use crate::tokenizer::{Span, Token};
4242

4343
pub use self::data_type::{
4444
ArrayElemTypeDef, BinaryLength, CharLengthUnits, CharacterLength, DataType, EnumMember,
@@ -2120,12 +2120,12 @@ pub enum Password {
21202120
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
21212121
pub struct CaseStatement {
21222122
/// The `CASE` token that starts the statement.
2123-
pub case_token: TokenWithSpan,
2123+
pub case_token: AttachedToken,
21242124
pub match_expr: Option<Expr>,
21252125
pub when_blocks: Vec<ConditionalStatements>,
21262126
pub else_block: Option<ConditionalStatements>,
21272127
/// The last token of the statement (`END` or `CASE`).
2128-
pub end_case_token: TokenWithSpan,
2128+
pub end_case_token: AttachedToken,
21292129
}
21302130

21312131
impl fmt::Display for CaseStatement {
@@ -2135,7 +2135,7 @@ impl fmt::Display for CaseStatement {
21352135
match_expr,
21362136
when_blocks,
21372137
else_block,
2138-
end_case_token,
2138+
end_case_token: AttachedToken(end),
21392139
} = self;
21402140

21412141
write!(f, "CASE")?;
@@ -2154,7 +2154,7 @@ impl fmt::Display for CaseStatement {
21542154

21552155
write!(f, " END")?;
21562156

2157-
if let Token::Word(w) = &end_case_token.token {
2157+
if let Token::Word(w) = &end.token {
21582158
if w.keyword == Keyword::CASE {
21592159
write!(f, " CASE")?;
21602160
}
@@ -2187,12 +2187,12 @@ pub enum IfStatement {
21872187
/// [Snowflake](https://docs.snowflake.com/en/sql-reference/snowflake-scripting/if)
21882188
IfThenElseEnd {
21892189
/// The `IF` token that starts the statement.
2190-
if_token: TokenWithSpan,
2190+
if_token: AttachedToken,
21912191
if_block: ConditionalStatements,
21922192
elseif_blocks: Vec<ConditionalStatements>,
21932193
else_block: Option<ConditionalStatements>,
21942194
/// The `IF` token that ends the statement.
2195-
end_if_token: TokenWithSpan,
2195+
end_if_token: AttachedToken,
21962196
},
21972197
/// An MSSQL `IF ... ELSE ...` statement.
21982198
///
@@ -2203,7 +2203,7 @@ pub enum IfStatement {
22032203
///
22042204
/// [MSSQL](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/if-else-transact-sql?view=sql-server-ver16)
22052205
MsSqlIfElse {
2206-
if_token: TokenWithSpan,
2206+
if_token: AttachedToken,
22072207
condition: Expr,
22082208
if_statements: MsSqlIfStatements,
22092209
else_statements: Option<MsSqlIfStatements>,
@@ -2270,9 +2270,9 @@ pub enum MsSqlIfStatements {
22702270
/// END
22712271
/// ```
22722272
Block {
2273-
begin_token: TokenWithSpan,
2273+
begin_token: AttachedToken,
22742274
statements: Vec<Statement>,
2275-
end_token: TokenWithSpan,
2275+
end_token: AttachedToken,
22762276
},
22772277
}
22782278

@@ -2310,7 +2310,7 @@ impl fmt::Display for MsSqlIfStatements {
23102310
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
23112311
pub struct ConditionalStatements {
23122312
/// The start token of the conditional (`WHEN`, `IF`, `ELSEIF` or `ELSE`).
2313-
pub start_token: TokenWithSpan,
2313+
pub start_token: AttachedToken,
23142314
/// The condition expression. `None` for `ELSE` statements.
23152315
pub condition: Option<Expr>,
23162316
/// Statement list of the `THEN` clause.
@@ -2320,12 +2320,12 @@ pub struct ConditionalStatements {
23202320
impl fmt::Display for ConditionalStatements {
23212321
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
23222322
let ConditionalStatements {
2323-
start_token,
2323+
start_token: AttachedToken(start),
23242324
condition,
23252325
statements,
23262326
} = self;
23272327

2328-
let keyword = &start_token.token;
2328+
let keyword = &start.token;
23292329

23302330
if let Some(expr) = condition {
23312331
write!(f, "{keyword} {expr} THEN")?;

src/ast/spans.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use core::iter;
2121
use crate::tokenizer::Span;
2222

2323
use super::{
24-
dcl::SecondaryRoles, value::ValueWithSpan, AccessExpr, AlterColumnOperation,
24+
dcl::SecondaryRoles, value::ValueWithSpan, AccessExpr, AlterColumnOperation, AttachedToken,
2525
AlterIndexOperation, AlterTableOperation, Array, Assignment, AssignmentTarget, CaseStatement,
2626
CloseCursor, ClusteredIndex, ColumnDef, ColumnOption, ColumnOptionDef, ConditionalStatements,
2727
ConflictTarget, ConnectBy, ConstraintCharacteristics, CopySource, CreateIndex, CreateTable,
@@ -740,30 +740,30 @@ impl Spanned for CreateIndex {
740740
impl Spanned for CaseStatement {
741741
fn span(&self) -> Span {
742742
let CaseStatement {
743-
case_token,
744-
end_case_token,
743+
case_token: AttachedToken(start),
744+
end_case_token: AttachedToken(end),
745745
..
746746
} = self;
747747

748-
union_spans([case_token.span, end_case_token.span].into_iter())
748+
union_spans([start.span, end.span].into_iter())
749749
}
750750
}
751751

752752
impl Spanned for IfStatement {
753753
fn span(&self) -> Span {
754754
match self {
755755
IfStatement::IfThenElseEnd {
756-
if_token,
757-
end_if_token,
756+
if_token: AttachedToken(start),
757+
end_if_token: AttachedToken(end),
758758
..
759-
} => union_spans([if_token.span, end_if_token.span].into_iter()),
759+
} => union_spans([start.span, end.span].into_iter()),
760760
IfStatement::MsSqlIfElse {
761-
if_token,
761+
if_token: AttachedToken(start),
762762
if_statements,
763763
else_statements,
764764
..
765765
} => union_spans(
766-
[if_token.span, if_statements.span()]
766+
[start.span, if_statements.span()]
767767
.into_iter()
768768
.chain(else_statements.as_ref().into_iter().map(|s| s.span())),
769769
),
@@ -776,24 +776,24 @@ impl Spanned for MsSqlIfStatements {
776776
match self {
777777
MsSqlIfStatements::Single(s) => s.span(),
778778
MsSqlIfStatements::Block {
779-
begin_token,
780-
end_token,
779+
begin_token: AttachedToken(start),
780+
end_token: AttachedToken(end),
781781
..
782-
} => union_spans([begin_token.span, end_token.span].into_iter()),
782+
} => union_spans([start.span, end.span].into_iter()),
783783
}
784784
}
785785
}
786786

787787
impl Spanned for ConditionalStatements {
788788
fn span(&self) -> Span {
789789
let ConditionalStatements {
790-
start_token,
790+
start_token: AttachedToken(start),
791791
condition,
792792
statements,
793793
} = self;
794794

795795
union_spans(
796-
iter::once(start_token.span)
796+
iter::once(start.span)
797797
.chain(condition.as_ref().map(|c| c.span()).into_iter())
798798
.chain(statements.iter().map(|s| s.span())),
799799
)

src/dialect/mssql.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717

1818
use crate::ast::{IfStatement, MsSqlIfStatements, Statement};
19+
use crate::ast::helpers::attached_token::AttachedToken;
1920
use crate::dialect::Dialect;
2021
use crate::keywords::{self, Keyword};
2122
use crate::parser::{Parser, ParserError};
@@ -144,9 +145,9 @@ impl MsSqlDialect {
144145
let statements = self.parse_statement_list(parser, Some(Keyword::END))?;
145146
let end_token = parser.expect_keyword(Keyword::END)?;
146147
if_statements = MsSqlIfStatements::Block {
147-
begin_token,
148+
begin_token: AttachedToken(begin_token),
148149
statements,
149-
end_token,
150+
end_token: AttachedToken(end_token),
150151
};
151152
} else {
152153
let stmt = parser.parse_statement()?;
@@ -160,9 +161,9 @@ impl MsSqlDialect {
160161
let statements = self.parse_statement_list(parser, Some(Keyword::END))?;
161162
let end_token = parser.expect_keyword(Keyword::END)?;
162163
else_statements = Some(MsSqlIfStatements::Block {
163-
begin_token,
164+
begin_token: AttachedToken(begin_token),
164165
statements,
165-
end_token,
166+
end_token: AttachedToken(end_token),
166167
});
167168
} else {
168169
let stmt = parser.parse_statement()?;
@@ -171,7 +172,7 @@ impl MsSqlDialect {
171172
}
172173

173174
Ok(Statement::If(IfStatement::MsSqlIfElse {
174-
if_token,
175+
if_token: AttachedToken(if_token),
175176
condition,
176177
if_statements,
177178
else_statements,

src/parser/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -656,11 +656,11 @@ impl<'a> Parser<'a> {
656656
}
657657

658658
Ok(Statement::Case(CaseStatement {
659-
case_token,
659+
case_token: AttachedToken(case_token),
660660
match_expr,
661661
when_blocks,
662662
else_block,
663-
end_case_token,
663+
end_case_token: AttachedToken(end_case_token),
664664
}))
665665
}
666666

@@ -690,11 +690,11 @@ impl<'a> Parser<'a> {
690690
let end_if_token = self.expect_keyword(Keyword::IF)?;
691691

692692
Ok(Statement::If(IfStatement::IfThenElseEnd {
693-
if_token,
693+
if_token: AttachedToken(if_token),
694694
if_block,
695695
elseif_blocks,
696696
else_block,
697-
end_if_token,
697+
end_if_token: AttachedToken(end_if_token),
698698
}))
699699
}
700700

@@ -723,7 +723,7 @@ impl<'a> Parser<'a> {
723723
let statements = self.parse_statement_list(terminal_keywords)?;
724724

725725
Ok(ConditionalStatements {
726-
start_token,
726+
start_token: AttachedToken(start_token),
727727
condition,
728728
statements,
729729
})

0 commit comments

Comments
 (0)