sqruff_lib_core/dialects/
syntax.rs

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}