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 TsqlVariable,
490 QuestionMark,
491 RightArrow,
492 UdfBody,
493 StartAngleBracket,
494 EndAngleBracket,
495 Lambda,
496 NakedIdentifierAll,
497 ProcedureNameIdentifier,
498 Parameter,
499 DateConstructorLiteral,
500 ProcedureOption,
501 ExportOption,
502 PropertiesNakedIdentifier,
503 Symbol,
504 DataTypeIdentifier,
505 Placeholder,
506 ExecuteScriptStatement,
507 AssignmentOperator,
508 Batch,
509 PivotColumnReference,
510 IntoTableClause,
511 PasswordAuth,
512 ExecuteAsClause,
513 UnicodeSingleQuote,
514 EscapedSingleQuote,
515 UnicodeDoubleQuote,
516 JsonOperator,
517 At,
518 BitStringLiteral,
519 DollarNumericLiteral,
520 WidgetNameIdentifier,
521 FileKeyword,
522 SemiStructuredElement,
523 BytesDoubleQuote,
524 BytesSingleQuote,
525 FileFormat,
526 FileType,
527 StartHint,
528 EndHint,
529 FunctionAssigner,
530 UnquotedFilePath,
531 Dollar,
532 SystemFunctionName,
533 IntegerLiteral,
534 StageEncryptionOption,
535 BucketPath,
536 QuotedStar,
537 StagePath,
538 FileLiteral,
539 BytesQuotedLiteral,
540 SignedQuotedLiteral,
541 ParameterAssigner,
542 ColumnSelector,
543 DollarLiteral,
544 ExcludeBracketClose,
545 WalrusOperator,
546 WarehouseSize,
547 Variable,
548 ExcludeBracketOpen,
549 SymlinkFormatManifest,
550 StartExcludeBracket,
551 CompressionType,
552 CopyOnErrorOption,
553 ColumnIndexIdentifierSegment,
554 ScalingPolicy,
555 ValidationModeOption,
556 EndExcludeBracket,
557 IdentifierList,
558 TemplateLoop,
559 ColonDelimiter,
560 SqlcmdOperator,
561 Slice,
562 TableEndClauseSegment,
563 PragmaStatement,
564 PragmaReference,
565 Slash,
566 DataFormatSegment,
567 AuthorizationSegment,
568 ColumnAttributeSegment,
569 ShowModelStatement,
570 CreateExternalSchemaStatement,
571 CreateLibraryStatement,
572 UnloadStatement,
573 DeclareStatement,
574 FetchStatement,
575 CloseStatement,
576 CreateDatashareStatement,
577 DescDatashareStatement,
578 DropDatashareStatement,
579 ShowDatasharesStatement,
580 GrantDatashareStatement,
581 CreateRlsPolicyStatement,
582 ManageRlsPolicyStatement,
583 DropRlsPolicyStatement,
584 AnalyzeCompressionStatement,
585 PartitionedBySegment,
586 RowFormatDelimitedSegment,
587 ObjectUnpivoting,
588 ArrayUnnesting,
589 AlterGroup,
590 CreateGroup,
591 ListaggOverflowClauseSegment,
592 UnorderedSelectStatementSegment,
593 MapType,
594 MapTypeSchema,
595 PrepareStatement,
596 ExecuteStatement,
597}
598
599impl SyntaxKind {
600 pub fn indent_val(self) -> i8 {
601 match self {
602 SyntaxKind::Indent | SyntaxKind::Implicit => 1,
603 SyntaxKind::Dedent => -1,
604 _ => 0,
605 }
606 }
607}
608
609impl SyntaxKind {
610 pub fn as_str(&self) -> &'static str {
611 self.into()
612 }
613}
614
615#[derive(Clone, PartialEq, Eq, Default)]
616pub struct SyntaxSet([u64; 10]);
617
618impl std::fmt::Debug for SyntaxSet {
619 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
620 f.debug_list().entries(self.iter()).finish()
621 }
622}
623
624impl SyntaxSet {
625 pub const EMPTY: SyntaxSet = Self([0; 10]);
626 const SLICE_BITS: u16 = u64::BITS as u16;
627
628 pub const fn new(kinds: &[SyntaxKind]) -> Self {
629 let mut set = SyntaxSet::EMPTY;
630
631 let mut index = 0;
632 while index < kinds.len() {
633 set = set.union(&Self::single(kinds[index]));
634 index += 1;
635 }
636
637 set
638 }
639
640 pub const fn single(kind: SyntaxKind) -> Self {
641 let kind = kind as u16;
642
643 let index = (kind / Self::SLICE_BITS) as usize;
644
645 debug_assert!(
646 index < Self::EMPTY.0.len(),
647 "Index out of bounds. Increase the size of the bitset array."
648 );
649
650 let shift = kind % Self::SLICE_BITS;
651 let mask = 1 << shift;
652
653 let mut bits = Self::EMPTY.0;
654 bits[index] = mask;
655
656 Self(bits)
657 }
658
659 pub fn is_empty(&self) -> bool {
660 self == &SyntaxSet::EMPTY
661 }
662
663 pub fn insert(&mut self, value: SyntaxKind) {
664 let set = std::mem::take(self);
665 *self = set.union(&SyntaxSet::single(value));
666 }
667
668 pub const fn intersection(mut self, other: &Self) -> Self {
669 let mut index = 0;
670
671 while index < self.0.len() {
672 self.0[index] &= other.0[index];
673 index += 1;
674 }
675
676 self
677 }
678
679 pub const fn union(mut self, other: &Self) -> Self {
680 let mut i = 0;
681
682 while i < self.0.len() {
683 self.0[i] |= other.0[i];
684 i += 1;
685 }
686
687 self
688 }
689
690 pub const fn intersects(&self, other: &Self) -> bool {
691 let mut i = 0;
692
693 while i < self.0.len() {
694 if self.0[i] & other.0[i] != 0 {
695 return true;
696 }
697 i += 1;
698 }
699
700 false
701 }
702
703 pub const fn contains(&self, kind: SyntaxKind) -> bool {
704 let kind = kind as u16;
705 let index = kind as usize / Self::SLICE_BITS as usize;
706 let shift = kind % Self::SLICE_BITS;
707 let mask = 1 << shift;
708
709 self.0[index] & mask != 0
710 }
711
712 pub const fn len(&self) -> usize {
713 let mut len: u32 = 0;
714
715 let mut index = 0;
716 while index < self.0.len() {
717 len += self.0[index].count_ones();
718 index += 1;
719 }
720
721 len as usize
722 }
723
724 pub fn iter(&self) -> SyntaxSetIter {
725 SyntaxSetIter {
726 set: self.clone(),
727 index: 0,
728 }
729 }
730}
731
732impl Extend<SyntaxKind> for SyntaxSet {
733 fn extend<T: IntoIterator<Item = SyntaxKind>>(&mut self, iter: T) {
734 let set = std::mem::take(self);
735 *self = set.union(&SyntaxSet::from_iter(iter));
736 }
737}
738
739impl IntoIterator for SyntaxSet {
740 type Item = SyntaxKind;
741 type IntoIter = SyntaxSetIter;
742
743 fn into_iter(self) -> Self::IntoIter {
744 self.iter()
745 }
746}
747
748impl IntoIterator for &SyntaxSet {
749 type Item = SyntaxKind;
750 type IntoIter = SyntaxSetIter;
751
752 fn into_iter(self) -> Self::IntoIter {
753 self.iter()
754 }
755}
756
757impl FromIterator<SyntaxKind> for SyntaxSet {
758 fn from_iter<T: IntoIterator<Item = SyntaxKind>>(iter: T) -> Self {
759 let mut set = SyntaxSet::EMPTY;
760
761 for kind in iter {
762 set.insert(kind);
763 }
764
765 set
766 }
767}
768
769pub struct SyntaxSetIter {
770 set: SyntaxSet,
771 index: u16,
772}
773
774impl Iterator for SyntaxSetIter {
775 type Item = SyntaxKind;
776
777 fn next(&mut self) -> Option<Self::Item> {
778 loop {
779 let slice = self.set.0.get_mut(self.index as usize)?;
780 let bit = slice.trailing_zeros() as u16;
781
782 if bit < SyntaxSet::SLICE_BITS {
783 *slice ^= 1 << bit;
784 let value = self.index * SyntaxSet::SLICE_BITS + bit;
785 return Some(unsafe { std::mem::transmute::<u16, SyntaxKind>(value) });
786 }
787
788 self.index += 1;
789 }
790 }
791
792 fn size_hint(&self) -> (usize, Option<usize>) {
793 let len = self.set.len();
794
795 (len, Some(len))
796 }
797}