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