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