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    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}