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