@@ -27,15 +27,15 @@ import Data.Bits
27
27
import Data.Char
28
28
( isSpace , toLower )
29
29
import Data.Either
30
- ( partitionEithers )
30
+ ( rights )
31
31
import Data.Functor
32
32
( ($>) )
33
33
import Data.Int
34
34
( Int64 )
35
35
import Data.Maybe
36
36
( catMaybes , fromMaybe )
37
37
import Foreign.C.Types
38
- ( CInt )
38
+ ( CChar , CInt , CShort , CLLong , CUChar , CUShort , CUInt , CULLong )
39
39
40
40
-- template-haskell
41
41
import qualified Language.Haskell.TH as TH
@@ -44,7 +44,7 @@ import qualified Language.Haskell.TH as TH
44
44
-- megaparsec
45
45
import Text.Megaparsec
46
46
( MonadParsec (.. ), ShowErrorComponent (.. )
47
- , (<?>) , anySingle , customFailure , single
47
+ , (<?>) , anySingle , choice , customFailure , single
48
48
)
49
49
50
50
-- parser-combinators
@@ -126,13 +126,24 @@ headers = do
126
126
_ <- skipManyTill anySingle ( namedSection " Dear ImGui end-user API functions" )
127
127
128
128
_ <- skipManyTill anySingle ( namedSection " Flags & Enumerations" )
129
- ( _defines, basicEnums ) <- partitionEithers <$>
129
+
130
+ basicEnums <- rights <$>
131
+ manyTill
132
+ ( ( Left <$> try ignoreDefine )
133
+ <|> ( Left <$> try cppConditional )
134
+ <|> ( Right <$> enumeration enumNamesAndTypes )
135
+ )
136
+ ( namedSection " Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs)" )
137
+
138
+ tableEnums <- rights <$>
130
139
manyTill
131
140
( ( Left <$> try ignoreDefine )
132
141
<|> ( Left <$> try cppConditional )
133
142
<|> ( Right <$> enumeration enumNamesAndTypes )
134
143
)
135
- ( namedSection " Helpers: Memory allocations macros, ImVector<>" )
144
+ ( try $ many comment >> keyword " struct" >> identifier)
145
+
146
+ _ <- skipManyTill anySingle ( namedSection " Helpers: Memory allocations macros, ImVector<>" )
136
147
137
148
_ <- skipManyTill anySingle ( namedSection " ImGuiStyle" )
138
149
@@ -158,7 +169,7 @@ headers = do
158
169
159
170
let
160
171
enums :: [ Enumeration () ]
161
- enums = basicEnums <> drawingEnums <> fontEnums
172
+ enums = basicEnums <> tableEnums <> drawingEnums <> fontEnums
162
173
pure ( Headers { enums } )
163
174
164
175
--------------------------------------------------------------------------------
@@ -169,6 +180,15 @@ forwardDeclarations
169
180
=> m ( HashMap Text Comment , HashMap Text ( TH. Name , Comment ) )
170
181
forwardDeclarations = do
171
182
_ <- many comment
183
+ _scalars <- many do
184
+ try $ keyword " typedef"
185
+ signed <- try (keyword " signed" $> True ) <|> (keyword " unsigned" $> False )
186
+ width <- try (keyword " int" ) <|> try (keyword " char" ) <|> try (keyword " short" ) <|> try (keyword " int" ) <|> (keyword " long" >> keyword " long" )
187
+ typeName <- identifier
188
+ reservedSymbol ' ;'
189
+ doc <- comment
190
+ pure (typeName, (signed, width, doc))
191
+ _ <- many comment
172
192
structs <- many do
173
193
keyword " struct"
174
194
structName <- identifier
@@ -177,6 +197,9 @@ forwardDeclarations = do
177
197
pure ( structName, doc )
178
198
_ <- many comment
179
199
enums <- many do
200
+ _ <- try do
201
+ _ <- many comment
202
+ cppConditional <|> pure ()
180
203
keyword " enum"
181
204
enumName <- identifier
182
205
symbol " :"
@@ -197,7 +220,23 @@ forwardDeclarations = do
197
220
pure ( HashMap. fromList structs, HashMap. fromList (enums <> typedefs) )
198
221
199
222
cTypeName :: MonadParsec e [Tok ] m => m TH. Name
200
- cTypeName = keyword " int" $> ''CInt
223
+ cTypeName =
224
+ choice
225
+ [ try $ (keyword " char" ) $> ''CChar
226
+ , try $ (keyword " signed" >> keyword " int" ) $> ''CInt
227
+ , try $ (keyword " unsigned" >> keyword " int" ) $> ''CUInt
228
+ , try $ (keyword " unsigned" >> keyword " char" ) $> ''CUChar
229
+ , try $ (identifier' " ImS8" ) $> ''CChar
230
+ , try $ (identifier' " ImU8" ) $> ''CUChar
231
+ , try $ (identifier' " ImS16" ) $> ''CShort
232
+ , try $ (identifier' " ImU16" ) $> ''CUShort
233
+ , try $ (identifier' " ImS32" ) $> ''CInt
234
+ , try $ (identifier' " ImU32" ) $> ''CUInt
235
+ , try $ (identifier' " ImS64" ) $> ''CLLong
236
+ , try $ (identifier' " ImU64" ) $> ''CULLong
237
+ , keyword " int" $> ''CInt
238
+ ]
239
+ <?> " cTypeName"
201
240
202
241
--------------------------------------------------------------------------------
203
242
-- Parsing enumerations.
@@ -211,6 +250,7 @@ data EnumState = EnumState
211
250
212
251
enumeration :: MonadParsec CustomParseError [Tok ] m => HashMap Text ( TH. Name , Comment ) -> m ( Enumeration () )
213
252
enumeration enumNamesAndTypes = do
253
+ void $ many (try $ comment >> cppConditional)
214
254
inlineDocs <- try do
215
255
inlineDocs <- many comment
216
256
keyword " enum"
@@ -331,13 +371,20 @@ comment = CommentText <$>
331
371
<?> " comment"
332
372
333
373
keyword :: MonadParsec e [ Tok ] m => Text -> m ()
334
- keyword kw = token ( \ case { Keyword kw' | kw == kw' -> Just () ; _ -> Nothing } ) mempty
374
+ keyword = void . keyword'
375
+
376
+ keyword' :: MonadParsec e [ Tok ] m => Text -> m Text
377
+ keyword' kw = token ( \ case { Keyword kw' | kw == kw' -> Just kw; _ -> Nothing } ) mempty
335
378
<?> ( Text. unpack kw <> " (keyword)" )
336
379
337
380
identifier :: MonadParsec e [ Tok ] m => m Text
338
381
identifier = token ( \ case { Identifier i -> Just i; _ -> Nothing } ) mempty
339
382
<?> " identifier"
340
383
384
+ identifier' :: MonadParsec e [ Tok ] m => Text -> m Text
385
+ identifier' ident = token ( \ case { Identifier i | i == ident -> Just ident; _ -> Nothing } ) mempty
386
+ <?> ( Text. unpack ident <> " (identifier)" )
387
+
341
388
{-
342
389
prefixedIdentifier :: MonadParsec e [ Tok ] m => Text -> m Text
343
390
prefixedIdentifier prefix =
@@ -452,7 +499,7 @@ cppDirective f = token ( \case { BeginCPP a -> f a; _ -> Nothing } ) mempty
452
499
453
500
cppConditional :: MonadParsec e [Tok ] m => m ()
454
501
cppConditional = do
455
- void $ cppDirective ( \ case { " ifdef" -> Just True ; " ifndef" -> Just False ; _ -> Nothing } )
502
+ void $ cppDirective ( \ case { " if " -> Just True ; " ifdef" -> Just True ; " ifndef" -> Just False ; _ -> Nothing } )
456
503
-- assumes no nesting
457
504
void $ skipManyTill anySingle ( cppDirective ( \ case { " endif" -> Just () ; _ -> Nothing } ) )
458
505
void $ skipManyTill anySingle ( single EndCPPLine )
0 commit comments