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