1#![allow(non_upper_case_globals)]
2use bitflags::bitflags;
3
4bitflags! {
5    #[derive(PartialEq, Eq, Copy, Clone)]
7    pub struct ListFormat: u32 {
8        const None = 0;
10
11        const SingleLine = 0;
14        const MultiLine = 1 << 0;
16        const PreserveLines = 1 << 1;
18        const LinesMask = Self::MultiLine.bits() | Self::PreserveLines.bits();
19
20        const NotDelimited = 0;
23        const BarDelimited = 1 << 2;
25        const AmpersandDelimited = 1 << 3;
27        const CommaDelimited = 1 << 4;
29        const DelimitersMask = Self::BarDelimited.bits()
30            | Self::AmpersandDelimited.bits()
31            | Self::CommaDelimited.bits();
32
33        const AllowTrailingComma = 1 << 5;
35
36        const Indented = 1 << 6;
39        const SpaceBetweenBraces = 1 << 7;
42        const SpaceBetweenSiblings = 1 << 8;
44
45        const Braces = 1 << 9;
48        const Parenthesis = 1 << 10;
50        const AngleBrackets = 1 << 11;
52        const SquareBrackets = 1 << 12;
54        const BracketsMask = Self::Braces.bits()
55            | Self::Parenthesis.bits()
56            | Self::AngleBrackets.bits()
57            | Self::SquareBrackets.bits();
58
59        const OptionalIfUndefined = 1 << 13;
61        const OptionalIfEmpty = 1 << 14;
63        const Optional = Self::OptionalIfUndefined.bits() | Self::OptionalIfEmpty.bits();
64
65        const PreferNewLine = 1 << 15;
68        const NoTrailingNewLine = 1 << 16;
70        const NoInterveningComments = 1 << 17;
72        const NoSpaceIfEmpty = 1 << 18;
74        const SingleElement = 1 << 19;
75        const ForceTrailingComma = 1 << 20;
76
77        const CanSkipTrailingComma = 1 << 21;
79
80        const Modifiers = Self::SingleLine.bits()
82            | Self::SpaceBetweenSiblings.bits()
83            | Self::NoInterveningComments.bits();
84        const HeritageClauses = Self::SingleLine.bits() | Self::SpaceBetweenSiblings.bits();
85        const SingleLineTypeLiteralMembers = Self::SingleLine.bits()
86            | Self::SpaceBetweenBraces.bits()
87            | Self::SpaceBetweenSiblings.bits()
88            | Self::Indented.bits();
89        const MultiLineTypeLiteralMembers = Self::MultiLine.bits() | Self::Indented.bits();
90        const TupleTypeElements = Self::CommaDelimited.bits()
91            | Self::SpaceBetweenSiblings.bits()
92            | Self::SingleLine.bits()
93            | Self::Indented.bits();
94        const UnionTypeConstituents = Self::BarDelimited.bits()
95            | Self::SpaceBetweenSiblings.bits()
96            | Self::SingleLine.bits();
97        const IntersectionTypeConstituents = Self::AmpersandDelimited.bits()
98            | Self::SpaceBetweenSiblings.bits()
99            | Self::SingleLine.bits();
100        const ObjectBindingPatternElements = Self::SingleLine.bits()
101            | Self::SpaceBetweenBraces.bits()
102            | Self::CommaDelimited.bits()
103            | Self::SpaceBetweenSiblings.bits()
104            | Self::NoSpaceIfEmpty.bits();
105        const ArrayBindingPatternElements = Self::SingleLine.bits()
106            | Self::CommaDelimited.bits()
107            | Self::SpaceBetweenSiblings.bits()
108            | Self::NoSpaceIfEmpty.bits();
109        const ObjectLiteralExpressionProperties = Self::MultiLine.bits()
110            | Self::CommaDelimited.bits()
111            | Self::SpaceBetweenSiblings.bits()
112            | Self::SpaceBetweenBraces.bits()
113            | Self::Indented.bits()
114            | Self::Braces.bits()
115            | Self::NoSpaceIfEmpty.bits();
116        const ArrayLiteralExpressionElements = Self::PreserveLines.bits()
117            | Self::CommaDelimited.bits()
118            | Self::SpaceBetweenSiblings.bits()
119            | Self::Indented.bits()
120            | Self::SquareBrackets.bits();
121        const CommaListElements = Self::CommaDelimited.bits()
122            | Self::SpaceBetweenSiblings.bits()
123            | Self::SingleLine.bits();
124        const CallExpressionArguments = Self::CommaDelimited.bits()
125            | Self::SpaceBetweenSiblings.bits()
126            | Self::SingleLine.bits()
127            | Self::Parenthesis.bits();
128        const NewExpressionArguments = Self::CommaDelimited.bits()
129            | Self::SpaceBetweenSiblings.bits()
130            | Self::SingleLine.bits()
131            | Self::Parenthesis.bits()
132            | Self::OptionalIfUndefined.bits();
133        const TemplateExpressionSpans = Self::SingleLine.bits() | Self::NoInterveningComments.bits();
134        const SingleLineBlockStatements = Self::SpaceBetweenBraces.bits()
135            | Self::SpaceBetweenSiblings.bits()
136            | Self::SingleLine.bits();
137        const MultiLineBlockStatements = Self::Indented.bits() | Self::MultiLine.bits();
138        const VariableDeclarationList = Self::CommaDelimited.bits()
139            | Self::SpaceBetweenSiblings.bits()
140            | Self::SingleLine.bits();
141        const SingleLineFunctionBodyStatements = Self::SingleLine.bits()
142            | Self::SpaceBetweenSiblings.bits()
143            | Self::SpaceBetweenBraces.bits();
144        const MultiLineFunctionBodyStatements = Self::MultiLine.bits();
145        const ClassHeritageClauses = Self::CommaDelimited.bits() | Self::SingleLine.bits() | Self::SpaceBetweenSiblings.bits();
146        const ClassMembers = Self::Indented.bits() | Self::MultiLine.bits();
147        const InterfaceMembers = Self::Indented.bits() | Self::MultiLine.bits();
148        const EnumMembers = Self::CommaDelimited.bits() | Self::Indented.bits() | Self::MultiLine.bits();
149        const CaseBlockClauses = Self::Indented.bits() | Self::MultiLine.bits();
150        const NamedImportsOrExportsElements = Self::CommaDelimited.bits()
151            | Self::SpaceBetweenSiblings.bits()
152            | Self::AllowTrailingComma.bits()
153            | Self::SingleLine.bits()
154            | Self::SpaceBetweenBraces.bits();
155        const JsxElementOrFragmentChildren = Self::SingleLine.bits() | Self::NoInterveningComments.bits();
156        const JsxElementAttributes = Self::SingleLine.bits()
157            | Self::SpaceBetweenSiblings.bits()
158            | Self::NoInterveningComments.bits();
159        const CaseOrDefaultClauseStatements = Self::Indented.bits()
160            | Self::MultiLine.bits()
161            | Self::NoTrailingNewLine.bits()
162            | Self::OptionalIfEmpty.bits();
163        const HeritageClauseTypes = Self::CommaDelimited.bits()
164            | Self::SpaceBetweenSiblings.bits()
165            | Self::SingleLine.bits();
166        const SourceFileStatements = Self::MultiLine.bits() | Self::NoTrailingNewLine.bits();
167        const Decorators = Self::MultiLine.bits() | Self::Optional.bits();
168        const TypeArguments = Self::CommaDelimited.bits()
169            | Self::SpaceBetweenSiblings.bits()
170            | Self::SingleLine.bits()
171            | Self::AngleBrackets.bits()
172            | Self::Optional.bits();
173        const TypeParameters = Self::CommaDelimited.bits()
174            | Self::SpaceBetweenSiblings.bits()
175            | Self::SingleLine.bits()
176            | Self::AngleBrackets.bits()
177            | Self::Optional.bits();
178        const Parameters = Self::CommaDelimited.bits()
179            | Self::SpaceBetweenSiblings.bits()
180            | Self::SingleLine.bits()
181            | Self::Parenthesis.bits();
182        const IndexSignatureParameters = Self::CommaDelimited.bits()
183            | Self::SpaceBetweenSiblings.bits()
184            | Self::SingleLine.bits()
185            | Self::Indented.bits()
186            | Self::SquareBrackets.bits();
187    }
188}
189
190impl ListFormat {
191    pub fn opening_bracket(self) -> &'static str {
192        match self & ListFormat::BracketsMask {
193            ListFormat::Braces => "{",
194            ListFormat::Parenthesis => "(",
195            ListFormat::AngleBrackets => "<",
196            ListFormat::SquareBrackets => "[",
197            _ => unreachable!(),
198        }
199    }
200
201    pub fn closing_bracket(self) -> &'static str {
202        match self & ListFormat::BracketsMask {
203            ListFormat::Braces => "}",
204            ListFormat::Parenthesis => ")",
205            ListFormat::AngleBrackets => ">",
206            ListFormat::SquareBrackets => "]",
207            _ => unreachable!(),
208        }
209    }
210}