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 MatchConditionClause,
311 FromAtExpression,
312 FromBeforeExpression,
313 SnowflakeKeywordExpression,
314 SemiStructuredExpression,
315 SelectExcludeClause,
316 SelectRenameClause,
317 AlterTableTableColumnAction,
318 AlterTableClusteringAction,
319 AlterTableConstraintAction,
320 AlterWarehouseStatement,
321 AlterShareStatement,
322 AlterStorageIntegrationStatement,
323 AlterExternalTableStatement,
324 CommentEqualsClause,
325 TagBracketedEquals,
326 TagEquals,
327 CreateCloneStatement,
328 CreateDatabaseFromShareStatement,
329 CreateProcedureStatement,
330 ScriptingBlockStatement,
331 ScriptingLetStatement,
332 AlterFunctionStatement,
333 CreateExternalFunctionStatement,
334 WarehouseObjectProperties,
335 ConstraintPropertiesSegment,
336 CopyOptions,
337 SchemaObjectProperties,
338 CreateTaskStatement,
339 SnowflakeTaskExpressionSegment,
340 CreateStatement,
341 CreateFileFormatSegment,
342 AlterFileFormatSegment,
343 CsvFileFormatTypeParameters,
344 JsonFileFormatTypeParameters,
345 AvroFileFormatTypeParameters,
346 OrcFileFormatTypeParameters,
347 ParquetFileFormatTypeParameters,
348 XmlFileFormatTypeParameters,
349 AlterPipeSegment,
350 FileFormatSegment,
351 FormatTypeOptions,
352 CopyIntoLocationStatement,
353 CopyIntoTableStatement,
354 StorageLocation,
355 StageParameters,
356 S3ExternalStageParameters,
357 GcsExternalStageParameters,
358 AzureBlobStorageExternalStageParameters,
359 CreateStageStatement,
360 AlterStageStatement,
361 CreateStreamStatement,
362 AlterStreamStatement,
363 ShowStatement,
364 AlterUserStatement,
365 AlterSessionStatement,
366 AlterSessionSetStatement,
367 AlterSessionUnsetClause,
368 AlterTaskStatement,
369 AlterTaskSpecialSetClause,
370 AlterTaskSetClause,
371 AlterTaskUnsetClause,
372 ExecuteTaskClause,
373 UndropStatement,
374 CommentStatement,
375 DropExternalTableStatement,
376 ListStatement,
377 GetStatement,
378 PutStatement,
379 RemoveStatement,
380 CastExpression,
381 DropObjectStatement,
382 UnsetStatement,
383 SqlConfOption,
384 BinaryOperator,
385 PrimitiveType,
386 CreateWidgetStatement,
387 ReplaceTableStatement,
388 RemoveWidgetStatement,
389 UseDatabaseStatement,
390 InsertOverwriteDirectoryStatement,
391 InsertOverwriteDirectoryHiveFmtStatement,
392 LoadDataStatement,
393 ClusterByClause,
394 DistributeByClause,
395 HintFunction,
396 SelectHint,
397 WithCubeRollupClause,
398 SortByClause,
399 LateralViewClause,
400 PivotClause,
401 TransformClause,
402 AddFileStatement,
403 AddJarStatement,
404 AnalyzeTableStatement,
405 CacheTable,
406 ClearCache,
407 ListFileStatement,
408 ListJarStatement,
409 RefreshStatement,
410 UncacheTable,
411 FileReference,
412 PropertyNameIdentifier,
413 GeneratedColumnDefinition,
414 IntervalLiteral,
415 DescribeHistoryStatement,
416 DescribeDetailStatement,
417 GenerateManifestFileStatement,
418 ConvertToDeltaStatement,
419 RestoreTableStatement,
420 ConstraintStatement,
421 ApplyChangesIntoStatement,
422 UsingClause,
423 DataSourceFormat,
424 IcebergTransformation,
425 MsckRepairTableStatement,
426 RowFormatClause,
427 SkewedByClause,
428 Bracketed,
429 NumericLiteral,
430 Keyword,
431 EndOfFile,
432 Whitespace,
433 Newline,
434 NakedIdentifier,
435 Unlexable,
436 StartBracket,
437 EndBracket,
438 InlineComment,
439 Identifier,
440 Raw,
441 QuotedIdentifier,
442 Star,
443 Dot,
444 Comma,
445 Comment,
446 EmitsSegment,
447 Literal,
448 BareFunction,
449 NullLiteral,
450 BooleanLiteral,
451 BlockComment,
452 QuotedLiteral,
453 DoubleDivide,
454 Meta,
455 #[default]
456 Colon,
457 StatementTerminator,
458 StartSquareBracket,
459 EndSquareBracket,
460 StartCurlyBracket,
461 Tilde,
462 CastingOperator,
463 RawComparisonOperator,
464 DatePart,
465 Pipe,
466 SignIndicator,
467 LikeOperator,
468 Word,
469 DoubleQuote,
470 SingleQuote,
471 Dash,
472 Semicolon,
473 BackQuote,
474 DollarQuote,
475 Not,
476 Ampersand,
477 Question,
478 Percent,
479 Divide,
480 Minus,
481 Plus,
482 Caret,
483 VerticalBar,
484 EndCurlyBracket,
485 FunctionNameIdentifier,
486 Dedent,
487 Indent,
488 Implicit,
489 AtSignLiteral,
490 TsqlVariable,
491 QuestionMark,
492 RightArrow,
493 UdfBody,
494 StartAngleBracket,
495 EndAngleBracket,
496 Lambda,
497 NakedIdentifierAll,
498 ProcedureNameIdentifier,
499 Parameter,
500 DateConstructorLiteral,
501 ProcedureOption,
502 ExportOption,
503 PropertiesNakedIdentifier,
504 Symbol,
505 DataTypeIdentifier,
506 Placeholder,
507 ExecuteScriptStatement,
508 AssignmentOperator,
509 Batch,
510 PivotColumnReference,
511 IntoTableClause,
512 PasswordAuth,
513 ExecuteAsClause,
514 UnicodeSingleQuote,
515 EscapedSingleQuote,
516 UnicodeDoubleQuote,
517 JsonOperator,
518 At,
519 BitStringLiteral,
520 DollarNumericLiteral,
521 WidgetNameIdentifier,
522 FileKeyword,
523 SemiStructuredElement,
524 BytesDoubleQuote,
525 BytesSingleQuote,
526 FileFormat,
527 FileType,
528 StartHint,
529 EndHint,
530 FunctionAssigner,
531 UnquotedFilePath,
532 Dollar,
533 SystemFunctionName,
534 IntegerLiteral,
535 StageEncryptionOption,
536 BucketPath,
537 QuotedStar,
538 StagePath,
539 FileLiteral,
540 BytesQuotedLiteral,
541 SignedQuotedLiteral,
542 ParameterAssigner,
543 ColumnSelector,
544 DollarLiteral,
545 ExcludeBracketClose,
546 WalrusOperator,
547 WarehouseSize,
548 Variable,
549 ExcludeBracketOpen,
550 SymlinkFormatManifest,
551 StartExcludeBracket,
552 CompressionType,
553 CopyOnErrorOption,
554 ColumnIndexIdentifierSegment,
555 ScalingPolicy,
556 ValidationModeOption,
557 EndExcludeBracket,
558 IdentifierList,
559 TemplateLoop,
560 ColonDelimiter,
561 SqlcmdOperator,
562 Slice,
563 TableEndClauseSegment,
564 PragmaStatement,
565 PragmaReference,
566 Slash,
567 DataFormatSegment,
568 AuthorizationSegment,
569 ColumnAttributeSegment,
570 ShowModelStatement,
571 CreateExternalSchemaStatement,
572 CreateLibraryStatement,
573 UnloadStatement,
574 DeclareStatement,
575 FetchStatement,
576 CloseStatement,
577 CreateDatashareStatement,
578 DescDatashareStatement,
579 DropDatashareStatement,
580 ShowDatasharesStatement,
581 GrantDatashareStatement,
582 CreateRlsPolicyStatement,
583 ManageRlsPolicyStatement,
584 DropRlsPolicyStatement,
585 AnalyzeCompressionStatement,
586 PartitionedBySegment,
587 RowFormatDelimitedSegment,
588 ObjectUnpivoting,
589 ArrayUnnesting,
590 AlterGroup,
591 CreateGroup,
592 ListaggOverflowClauseSegment,
593 UnorderedSelectStatementSegment,
594 MapType,
595 MapTypeSchema,
596 PrepareStatement,
597 ExecuteStatement,
598}
599
600impl SyntaxKind {
601 pub fn indent_val(self) -> i8 {
602 match self {
603 SyntaxKind::Indent | SyntaxKind::Implicit => 1,
604 SyntaxKind::Dedent => -1,
605 _ => 0,
606 }
607 }
608}
609
610impl SyntaxKind {
611 pub fn as_str(&self) -> &'static str {
612 self.into()
613 }
614}
615
616#[derive(Clone, PartialEq, Eq, Default)]
617pub struct SyntaxSet([u64; 10]);
618
619impl std::fmt::Debug for SyntaxSet {
620 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
621 f.debug_list().entries(self.iter()).finish()
622 }
623}
624
625impl SyntaxSet {
626 pub const EMPTY: SyntaxSet = Self([0; 10]);
627 const SLICE_BITS: u16 = u64::BITS as u16;
628
629 pub const fn new(kinds: &[SyntaxKind]) -> Self {
630 let mut set = SyntaxSet::EMPTY;
631
632 let mut index = 0;
633 while index < kinds.len() {
634 set = set.union(&Self::single(kinds[index]));
635 index += 1;
636 }
637
638 set
639 }
640
641 pub const fn single(kind: SyntaxKind) -> Self {
642 let kind = kind as u16;
643
644 let index = (kind / Self::SLICE_BITS) as usize;
645
646 debug_assert!(
647 index < Self::EMPTY.0.len(),
648 "Index out of bounds. Increase the size of the bitset array."
649 );
650
651 let shift = kind % Self::SLICE_BITS;
652 let mask = 1 << shift;
653
654 let mut bits = Self::EMPTY.0;
655 bits[index] = mask;
656
657 Self(bits)
658 }
659
660 pub fn is_empty(&self) -> bool {
661 self == &SyntaxSet::EMPTY
662 }
663
664 pub fn insert(&mut self, value: SyntaxKind) {
665 let set = std::mem::take(self);
666 *self = set.union(&SyntaxSet::single(value));
667 }
668
669 pub const fn intersection(mut self, other: &Self) -> Self {
670 let mut index = 0;
671
672 while index < self.0.len() {
673 self.0[index] &= other.0[index];
674 index += 1;
675 }
676
677 self
678 }
679
680 pub const fn union(mut self, other: &Self) -> Self {
681 let mut i = 0;
682
683 while i < self.0.len() {
684 self.0[i] |= other.0[i];
685 i += 1;
686 }
687
688 self
689 }
690
691 pub const fn intersects(&self, other: &Self) -> bool {
692 let mut i = 0;
693
694 while i < self.0.len() {
695 if self.0[i] & other.0[i] != 0 {
696 return true;
697 }
698 i += 1;
699 }
700
701 false
702 }
703
704 pub const fn contains(&self, kind: SyntaxKind) -> bool {
705 let kind = kind as u16;
706 let index = kind as usize / Self::SLICE_BITS as usize;
707 let shift = kind % Self::SLICE_BITS;
708 let mask = 1 << shift;
709
710 self.0[index] & mask != 0
711 }
712
713 pub const fn len(&self) -> usize {
714 let mut len: u32 = 0;
715
716 let mut index = 0;
717 while index < self.0.len() {
718 len += self.0[index].count_ones();
719 index += 1;
720 }
721
722 len as usize
723 }
724
725 pub fn iter(&self) -> SyntaxSetIter {
726 SyntaxSetIter {
727 set: self.clone(),
728 index: 0,
729 }
730 }
731}
732
733impl Extend<SyntaxKind> for SyntaxSet {
734 fn extend<T: IntoIterator<Item = SyntaxKind>>(&mut self, iter: T) {
735 let set = std::mem::take(self);
736 *self = set.union(&SyntaxSet::from_iter(iter));
737 }
738}
739
740impl IntoIterator for SyntaxSet {
741 type Item = SyntaxKind;
742 type IntoIter = SyntaxSetIter;
743
744 fn into_iter(self) -> Self::IntoIter {
745 self.iter()
746 }
747}
748
749impl IntoIterator for &SyntaxSet {
750 type Item = SyntaxKind;
751 type IntoIter = SyntaxSetIter;
752
753 fn into_iter(self) -> Self::IntoIter {
754 self.iter()
755 }
756}
757
758impl FromIterator<SyntaxKind> for SyntaxSet {
759 fn from_iter<T: IntoIterator<Item = SyntaxKind>>(iter: T) -> Self {
760 let mut set = SyntaxSet::EMPTY;
761
762 for kind in iter {
763 set.insert(kind);
764 }
765
766 set
767 }
768}
769
770pub struct SyntaxSetIter {
771 set: SyntaxSet,
772 index: u16,
773}
774
775impl Iterator for SyntaxSetIter {
776 type Item = SyntaxKind;
777
778 fn next(&mut self) -> Option<Self::Item> {
779 loop {
780 let slice = self.set.0.get_mut(self.index as usize)?;
781 let bit = slice.trailing_zeros() as u16;
782
783 if bit < SyntaxSet::SLICE_BITS {
784 *slice ^= 1 << bit;
785 let value = self.index * SyntaxSet::SLICE_BITS + bit;
786 return Some(unsafe { std::mem::transmute::<u16, SyntaxKind>(value) });
787 }
788
789 self.index += 1;
790 }
791 }
792
793 fn size_hint(&self) -> (usize, Option<usize>) {
794 let len = self.set.len();
795
796 (len, Some(len))
797 }
798}