1use std::iter::FromIterator;
2
3#[derive(
4 Debug,
5 PartialEq,
6 Eq,
7 Clone,
8 Copy,
9 strum_macros::IntoStaticStr,
10 strum_macros::EnumString,
11 Hash,
12 PartialOrd,
13 Ord,
14 Default,
15)]
16#[strum(serialize_all = "snake_case")]
17pub enum SyntaxKind {
18 Unparsable,
19 File,
20 ColumnReference,
21 ObjectReference,
22 Expression,
23 WildcardIdentifier,
24 Function,
25 FunctionContents,
26 HavingClause,
27 PathSegment,
28 LimitClause,
29 CubeRollupClause,
30 GroupingSetsClause,
31 GroupingExpressionList,
32 SetClause,
33 FetchClause,
34 FunctionDefinition,
35 AlterSequenceOptionsSegment,
36 RoleReference,
37 TablespaceReference,
38 ExtensionReference,
39 TagReference,
40 ColumnDefinition,
41 ColumnConstraintSegment,
42 CommentClause,
43 TableEndClause,
44 MergeMatch,
45 MergeWhenNotMatchedClause,
46 MergeInsertClause,
47 MergeUpdateClause,
48 MergeDeleteClause,
49 MergeTreeOrderByClause,
50 SetClauseList,
51 TableReference,
52 GroupbyClause,
53 FrameClause,
54 WithCompoundStatement,
55 CommonTableExpression,
56 CTEColumnList,
57 TriggerReference,
58 TableConstraint,
59 JoinOnCondition,
60 DatabaseReference,
61 CollationReference,
62 OverClause,
63 NamedWindow,
64 WindowSpecification,
65 PartitionbyClause,
66 JoinClause,
67 DropTriggerStatement,
68 SampleExpression,
69 TableExpression,
70 CreateTriggerStatement,
71 DropModelStatement,
72 DescribeStatement,
73 UseStatement,
74 ExplainStatement,
75 CreateSequenceStatement,
76 CreateSequenceOptionsSegment,
77 AlterSequenceStatement,
78 DropSequenceStatement,
79 DropCastStatement,
80 CreateFunctionStatement,
81 DropFunctionStatement,
82 CreateModelStatement,
83 CreateViewStatement,
84 DeleteStatement,
85 UpdateStatement,
86 CreateCastStatement,
87 CreateRoleStatement,
88 DropRoleStatement,
89 AlterTableStatement,
90 CreateSchemaStatement,
91 SetSchemaStatement,
92 DropSchemaStatement,
93 DropTypeStatement,
94 CreateDatabaseStatement,
95 DropDatabaseStatement,
96 FunctionParameterList,
97 CreateIndexStatement,
98 DropIndexStatement,
99 CreateTableStatement,
100 AccessStatement,
101 InsertStatement,
102 TransactionStatement,
103 DropTableStatement,
104 DropViewStatement,
105 CreateUserStatement,
106 DropUserStatement,
107 ArrayExpression,
108 LocalAlias,
109 MergeStatement,
110 IndexColumnDefinition,
111 AggregateOrderByClause,
112 FunctionName,
113 CaseExpression,
114 WhenClause,
115 ElseClause,
116 PreWhereClause,
117 WhereClause,
118 SetOperator,
119 ValuesClause,
120 EmptyStructLiteral,
121 ObjectLiteral,
122 ObjectLiteralElement,
123 TimeZoneGrammar,
124 BracketedArguments,
125 DataType,
126 AliasExpression,
127 ArrayAccessor,
128 ArrayLiteral,
129 TypedArrayLiteral,
130 StructType,
131 StructLiteral,
132 TypedStructLiteral,
133 IntervalExpression,
134 ArrayType,
135 SizedArrayType,
136 SelectStatement,
137 OverlapsClause,
138 SelectClause,
139 Statement,
140 WithNoSchemaBindingClause,
141 WithDataClause,
142 SetExpression,
143 FromClause,
144 EmptyStructLiteralBrackets,
145 WildcardExpression,
146 OrderbyClause,
147 TruncateStatement,
148 FromExpression,
149 FromExpressionElement,
150 SelectClauseModifier,
151 NamedWindowExpression,
152 SelectClauseElement,
153 QualifyClause,
154 MultiStatementSegment,
155 AssertStatement,
156 ForInStatements,
157 ForInStatement,
158 RepeatStatements,
159 RepeatStatement,
160 IfStatements,
161 IfStatement,
162 LoopStatements,
163 LoopStatement,
164 WhileStatements,
165 WhileStatement,
166 DatePartWeek,
167 SelectExceptClause,
168 SelectReplaceClause,
169 StructTypeSchema,
170 Tuple,
171 NamedArgument,
172 DeclareSegment,
173 SetSegment,
174 PartitionBySegment,
175 ClusterBySegment,
176 OptionsSegment,
177 CreateExternalTableStatement,
178 AlterViewStatement,
179 CreateMaterializedViewStatement,
180 AlterMaterializedViewSetOptionsStatement,
181 DropMaterializedViewStatement,
182 ParameterizedExpression,
183 PivotForClause,
184 FromPivotExpression,
185 UnpivotClause,
186 FromUnpivotExpression,
187 NotMatchedByTargetClause,
188 MergeWhenMatchedClause,
189 ProcedureName,
190 ExportStatement,
191 ProcedureParameterList,
192 ProcedureStatements,
193 CallStatement,
194 ReturnStatement,
195 BreakStatement,
196 LeaveStatement,
197 ContinueStatement,
198 RaiseStatement,
199 PsqlVariable,
200 ComparisonOperator,
201 DatetimeTypeIdentifier,
202 DatetimeLiteral,
203 IndexAccessMethod,
204 OperatorClassReference,
205 DefinitionParameter,
206 DefinitionParameters,
207 RelationOption,
208 RelationOptions,
209 AlterFunctionActionSegment,
210 AlterProcedureActionSegment,
211 AlterProcedureStatement,
212 DropProcedureStatement,
213 WktGeometryType,
214 IntoClause,
215 ForClause,
216 AlterRoleStatement,
217 ExplainOption,
218 CreateTableAsStatement,
219 AlterPublicationStatement,
220 CreatePublicationStatement,
221 PublicationObjects,
222 PublicationTable,
223 PublicationReference,
224 DropExtensionStatement,
225 CreateExtensionStatement,
226 VersionIdentifier,
227 AlterTableActionSegment,
228 DropPublicationStatement,
229 AlterMaterializedViewStatement,
230 AlterMaterializedViewActionSegment,
231 RefreshMaterializedViewStatement,
232 WithCheckOption,
233 AlterPolicyStatement,
234 AlterDatabaseStatement,
235 VacuumStatement,
236 LikeOptionSegment,
237 PartitionBoundSpec,
238 IndexParameters,
239 ReferentialActionSegment,
240 IndexElement,
241 ExclusionConstraintElement,
242 AlterDefaultPrivilegesStatement,
243 AlterDefaultPrivilegesObjectPrivilege,
244 AlterDefaultPrivilegesSchemaObject,
245 AlterDefaultPrivilegesToFromRoles,
246 AlterDefaultPrivilegesGrant,
247 DropOwnedStatement,
248 ReassignOwnedStatement,
249 IndexElementOptions,
250 AlterDefaultPrivilegesRevoke,
251 AlterIndexStatement,
252 ReindexStatementSegment,
253 AnalyzeStatement,
254 AlterTrigger,
255 OperationClassReference,
256 ConflictAction,
257 ConflictTarget,
258 SetStatement,
259 CreatePolicyStatement,
260 CreateDomainStatement,
261 AlterDomainStatement,
262 DropDomainStatement,
263 DropPolicyStatement,
264 LoadStatement,
265 ResetStatement,
266 ListenStatement,
267 NotifyStatement,
268 UnlistenStatement,
269 ClusterStatement,
270 LanguageClause,
271 DoStatement,
272 CreateUserMappingStatement,
273 ImportForeignSchemaStatement,
274 CreateServerStatement,
275 CreateCollationStatement,
276 AlterTypeStatement,
277 CreateTypeStatement,
278 LockTableStatement,
279 CopyStatement,
280 DiscardStatement,
281 AlterSchemaStatement,
282 ServerReference,
283 ArrayJoinClause,
284 TableEngineFunction,
285 OnClusterClause,
286 Engine,
287 EngineFunction,
288 DatabaseEngine,
289 ColumnTtlSegment,
290 TableTtlSegment,
291 DropDictionaryStatement,
292 DropQuotaStatement,
293 DropSettingProfileStatement,
294 SystemMergesSegment,
295 SystemTtlMergesSegment,
296 SystemMovesSegment,
297 SystemReplicaSegment,
298 SystemFilesystemSegment,
299 SystemReplicatedSegment,
300 SystemReplicationSegment,
301 SystemFetchesSegment,
302 SystemDistributedSegment,
303 SystemModelSegment,
304 SystemFileSegment,
305 SystemUnfreezeSegment,
306 SystemStatement,
307 ConnectbyClause,
308 CallSegment,
309 WithingroupClause,
310 PatternExpression,
311 MatchRecognizeClause,
312 ChangesClause,
313 MatchConditionClause,
314 FromAtExpression,
315 FromBeforeExpression,
316 SnowflakeKeywordExpression,
317 SemiStructuredExpression,
318 SelectExcludeClause,
319 SelectRenameClause,
320 AlterTableTableColumnAction,
321 AlterTableClusteringAction,
322 AlterTableConstraintAction,
323 AlterWarehouseStatement,
324 AlterShareStatement,
325 AlterStorageIntegrationStatement,
326 AlterExternalTableStatement,
327 CommentEqualsClause,
328 TagBracketedEquals,
329 TagEquals,
330 CreateCloneStatement,
331 CreateDatabaseFromShareStatement,
332 CreateProcedureStatement,
333 ScriptingBlockStatement,
334 ScriptingLetStatement,
335 AlterFunctionStatement,
336 CreateExternalFunctionStatement,
337 WarehouseObjectProperties,
338 ConstraintPropertiesSegment,
339 CopyOptions,
340 SchemaObjectProperties,
341 CreateTaskStatement,
342 SnowflakeTaskExpressionSegment,
343 CreateStatement,
344 CreateFileFormatSegment,
345 AlterFileFormatSegment,
346 CsvFileFormatTypeParameters,
347 JsonFileFormatTypeParameters,
348 AvroFileFormatTypeParameters,
349 OrcFileFormatTypeParameters,
350 ParquetFileFormatTypeParameters,
351 XmlFileFormatTypeParameters,
352 AlterPipeSegment,
353 FileFormatSegment,
354 FormatTypeOptions,
355 CopyIntoLocationStatement,
356 CopyIntoTableStatement,
357 StorageLocation,
358 StageParameters,
359 S3ExternalStageParameters,
360 GcsExternalStageParameters,
361 AzureBlobStorageExternalStageParameters,
362 CreateStageStatement,
363 AlterStageStatement,
364 CreateStreamStatement,
365 AlterStreamStatement,
366 ShowStatement,
367 AlterUserStatement,
368 AlterSessionStatement,
369 AlterSessionSetStatement,
370 AlterSessionUnsetClause,
371 AlterTaskStatement,
372 AlterTaskSpecialSetClause,
373 AlterTaskSetClause,
374 AlterTaskUnsetClause,
375 ExecuteTaskClause,
376 UndropStatement,
377 CommentStatement,
378 DropExternalTableStatement,
379 ListStatement,
380 GetStatement,
381 PutStatement,
382 RemoveStatement,
383 CastExpression,
384 DropObjectStatement,
385 UnsetStatement,
386 SqlConfOption,
387 BinaryOperator,
388 PrimitiveType,
389 CreateWidgetStatement,
390 ReplaceTableStatement,
391 RemoveWidgetStatement,
392 UseDatabaseStatement,
393 InsertOverwriteDirectoryStatement,
394 InsertOverwriteDirectoryHiveFmtStatement,
395 LoadDataStatement,
396 ClusterByClause,
397 DistributeByClause,
398 HintFunction,
399 SelectHint,
400 WithCubeRollupClause,
401 SortByClause,
402 LateralViewClause,
403 PivotClause,
404 TransformClause,
405 AddFileStatement,
406 AddJarStatement,
407 AnalyzeTableStatement,
408 CacheTable,
409 ClearCache,
410 ListFileStatement,
411 ListJarStatement,
412 RefreshStatement,
413 UncacheTable,
414 FileReference,
415 PropertyNameIdentifier,
416 GeneratedColumnDefinition,
417 IntervalLiteral,
418 DescribeHistoryStatement,
419 DescribeDetailStatement,
420 GenerateManifestFileStatement,
421 ConvertToDeltaStatement,
422 RestoreTableStatement,
423 ConstraintStatement,
424 ApplyChangesIntoStatement,
425 UsingClause,
426 DataSourceFormat,
427 IcebergTransformation,
428 MsckRepairTableStatement,
429 RowFormatClause,
430 SkewedByClause,
431 Bracketed,
432 NumericLiteral,
433 Keyword,
434 EndOfFile,
435 Whitespace,
436 Newline,
437 NakedIdentifier,
438 Unlexable,
439 StartBracket,
440 EndBracket,
441 InlineComment,
442 Identifier,
443 Raw,
444 QuotedIdentifier,
445 Star,
446 Dot,
447 Comma,
448 Comment,
449 EmitsSegment,
450 Literal,
451 BareFunction,
452 NullLiteral,
453 BooleanLiteral,
454 BlockComment,
455 QuotedLiteral,
456 DoubleDivide,
457 Meta,
458 #[default]
459 Colon,
460 StatementTerminator,
461 StartSquareBracket,
462 EndSquareBracket,
463 StartCurlyBracket,
464 Tilde,
465 CastingOperator,
466 RawComparisonOperator,
467 DatePart,
468 Pipe,
469 SignIndicator,
470 LikeOperator,
471 Word,
472 DoubleQuote,
473 SingleQuote,
474 Dash,
475 Semicolon,
476 BackQuote,
477 DollarQuote,
478 Not,
479 Ampersand,
480 Question,
481 Percent,
482 Divide,
483 Minus,
484 Plus,
485 Caret,
486 VerticalBar,
487 EndCurlyBracket,
488 FunctionNameIdentifier,
489 Dedent,
490 Indent,
491 Implicit,
492 AtSignLiteral,
493 TsqlVariable,
494 QuestionMark,
495 RightArrow,
496 UdfBody,
497 StartAngleBracket,
498 EndAngleBracket,
499 Lambda,
500 NakedIdentifierAll,
501 ProcedureNameIdentifier,
502 Parameter,
503 DateConstructorLiteral,
504 ProcedureOption,
505 ExportOption,
506 PropertiesNakedIdentifier,
507 Symbol,
508 DataTypeIdentifier,
509 Placeholder,
510 ExecuteScriptStatement,
511 AssignmentOperator,
512 Batch,
513 PivotColumnReference,
514 IntoTableClause,
515 PasswordAuth,
516 ExecuteAsClause,
517 ExecuteImmediateClause,
518 UnicodeSingleQuote,
519 EscapedSingleQuote,
520 UnicodeDoubleQuote,
521 JsonOperator,
522 At,
523 BitStringLiteral,
524 DollarNumericLiteral,
525 WidgetNameIdentifier,
526 FileKeyword,
527 SemiStructuredElement,
528 BytesDoubleQuote,
529 BytesSingleQuote,
530 FileFormat,
531 FileType,
532 StartHint,
533 EndHint,
534 FunctionAssigner,
535 UnquotedFilePath,
536 Dollar,
537 SystemFunctionName,
538 IntegerLiteral,
539 StageEncryptionOption,
540 BucketPath,
541 QuotedStar,
542 StagePath,
543 FileLiteral,
544 BytesQuotedLiteral,
545 SignedQuotedLiteral,
546 ParameterAssigner,
547 ColumnSelector,
548 DollarLiteral,
549 ExcludeBracketClose,
550 WalrusOperator,
551 WarehouseSize,
552 Variable,
553 ExcludeBracketOpen,
554 SymlinkFormatManifest,
555 StartExcludeBracket,
556 CompressionType,
557 CopyOnErrorOption,
558 ColumnIndexIdentifierSegment,
559 ScalingPolicy,
560 ValidationModeOption,
561 EndExcludeBracket,
562 IdentifierList,
563 TemplateLoop,
564 ColonDelimiter,
565 SqlcmdOperator,
566 Slice,
567 TableEndClauseSegment,
568 PragmaStatement,
569 PragmaReference,
570 Slash,
571 DataFormatSegment,
572 AuthorizationSegment,
573 ColumnAttributeSegment,
574 ShowModelStatement,
575 CreateExternalSchemaStatement,
576 CreateLibraryStatement,
577 UnloadStatement,
578 DeclareStatement,
579 FetchStatement,
580 CloseStatement,
581 CreateDatashareStatement,
582 DescDatashareStatement,
583 DropDatashareStatement,
584 ShowDatasharesStatement,
585 GrantDatashareStatement,
586 CreateRlsPolicyStatement,
587 ManageRlsPolicyStatement,
588 DropRlsPolicyStatement,
589 AnalyzeCompressionStatement,
590 PartitionedBySegment,
591 RowFormatDelimitedSegment,
592 ObjectUnpivoting,
593 ArrayUnnesting,
594 AlterGroup,
595 CreateGroup,
596 ListaggOverflowClauseSegment,
597 UnorderedSelectStatementSegment,
598 MapType,
599 MapTypeSchema,
600 PrepareStatement,
601 ExecuteStatement,
602 RenameTableStatement,
603}
604
605impl SyntaxKind {
606 pub fn indent_val(self) -> i8 {
607 match self {
608 SyntaxKind::Indent | SyntaxKind::Implicit => 1,
609 SyntaxKind::Dedent => -1,
610 _ => 0,
611 }
612 }
613}
614
615impl SyntaxKind {
616 pub fn as_str(&self) -> &'static str {
617 self.into()
618 }
619}
620
621#[derive(Clone, PartialEq, Eq, Default)]
622pub struct SyntaxSet([u64; 10]);
623
624impl std::fmt::Debug for SyntaxSet {
625 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
626 f.debug_list().entries(self.iter()).finish()
627 }
628}
629
630impl SyntaxSet {
631 pub const EMPTY: SyntaxSet = Self([0; 10]);
632 const SLICE_BITS: u16 = u64::BITS as u16;
633
634 pub const fn new(kinds: &[SyntaxKind]) -> Self {
635 let mut set = SyntaxSet::EMPTY;
636
637 let mut index = 0;
638 while index < kinds.len() {
639 set = set.union(&Self::single(kinds[index]));
640 index += 1;
641 }
642
643 set
644 }
645
646 pub const fn single(kind: SyntaxKind) -> Self {
647 let kind = kind as u16;
648
649 let index = (kind / Self::SLICE_BITS) as usize;
650
651 debug_assert!(
652 index < Self::EMPTY.0.len(),
653 "Index out of bounds. Increase the size of the bitset array."
654 );
655
656 let shift = kind % Self::SLICE_BITS;
657 let mask = 1 << shift;
658
659 let mut bits = Self::EMPTY.0;
660 bits[index] = mask;
661
662 Self(bits)
663 }
664
665 pub fn is_empty(&self) -> bool {
666 self == &SyntaxSet::EMPTY
667 }
668
669 pub fn insert(&mut self, value: SyntaxKind) {
670 let set = std::mem::take(self);
671 *self = set.union(&SyntaxSet::single(value));
672 }
673
674 pub const fn intersection(mut self, other: &Self) -> Self {
675 let mut index = 0;
676
677 while index < self.0.len() {
678 self.0[index] &= other.0[index];
679 index += 1;
680 }
681
682 self
683 }
684
685 pub const fn union(mut self, other: &Self) -> Self {
686 let mut i = 0;
687
688 while i < self.0.len() {
689 self.0[i] |= other.0[i];
690 i += 1;
691 }
692
693 self
694 }
695
696 pub const fn intersects(&self, other: &Self) -> bool {
697 let mut i = 0;
698
699 while i < self.0.len() {
700 if self.0[i] & other.0[i] != 0 {
701 return true;
702 }
703 i += 1;
704 }
705
706 false
707 }
708
709 pub const fn contains(&self, kind: SyntaxKind) -> bool {
710 let kind = kind as u16;
711 let index = kind as usize / Self::SLICE_BITS as usize;
712 let shift = kind % Self::SLICE_BITS;
713 let mask = 1 << shift;
714
715 self.0[index] & mask != 0
716 }
717
718 pub const fn len(&self) -> usize {
719 let mut len: u32 = 0;
720
721 let mut index = 0;
722 while index < self.0.len() {
723 len += self.0[index].count_ones();
724 index += 1;
725 }
726
727 len as usize
728 }
729
730 pub fn iter(&self) -> SyntaxSetIter {
731 SyntaxSetIter {
732 set: self.clone(),
733 index: 0,
734 }
735 }
736}
737
738impl Extend<SyntaxKind> for SyntaxSet {
739 fn extend<T: IntoIterator<Item = SyntaxKind>>(&mut self, iter: T) {
740 let set = std::mem::take(self);
741 *self = set.union(&SyntaxSet::from_iter(iter));
742 }
743}
744
745impl IntoIterator for SyntaxSet {
746 type Item = SyntaxKind;
747 type IntoIter = SyntaxSetIter;
748
749 fn into_iter(self) -> Self::IntoIter {
750 self.iter()
751 }
752}
753
754impl IntoIterator for &SyntaxSet {
755 type Item = SyntaxKind;
756 type IntoIter = SyntaxSetIter;
757
758 fn into_iter(self) -> Self::IntoIter {
759 self.iter()
760 }
761}
762
763impl FromIterator<SyntaxKind> for SyntaxSet {
764 fn from_iter<T: IntoIterator<Item = SyntaxKind>>(iter: T) -> Self {
765 let mut set = SyntaxSet::EMPTY;
766
767 for kind in iter {
768 set.insert(kind);
769 }
770
771 set
772 }
773}
774
775pub struct SyntaxSetIter {
776 set: SyntaxSet,
777 index: u16,
778}
779
780impl Iterator for SyntaxSetIter {
781 type Item = SyntaxKind;
782
783 fn next(&mut self) -> Option<Self::Item> {
784 loop {
785 let slice = self.set.0.get_mut(self.index as usize)?;
786 let bit = slice.trailing_zeros() as u16;
787
788 if bit < SyntaxSet::SLICE_BITS {
789 *slice ^= 1 << bit;
790 let value = self.index * SyntaxSet::SLICE_BITS + bit;
791 return Some(unsafe { std::mem::transmute::<u16, SyntaxKind>(value) });
792 }
793
794 self.index += 1;
795 }
796 }
797
798 fn size_hint(&self) -> (usize, Option<usize>) {
799 let len = self.set.len();
800
801 (len, Some(len))
802 }
803}