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