df_ls_structure 0.3.0-rc.1

A language server for Dwarf Fortress RAW files
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
use df_ls_core::{Choose, Clamp, DFChar, Reference, ReferenceTo};
use df_ls_diagnostics::lsp_types::*;
use df_ls_lexical_analysis::test_utils::LexerTestBuilder;
use df_ls_structure::*;
use df_ls_syntax_analysis::test_utils::SyntaxTestBuilder;

#[test]
fn test_building() {
    SyntaxTestBuilder::from_lexer_test_builder(
        LexerTestBuilder::test_source(
            "building_custom

            [OBJECT:BUILDING]

            [BUILDING_WORKSHOP:SOAP_MAKER]
                [NAME:Soap Maker's Workshop]
                [NAME_COLOR:7:0:1]
                [DIM:3:3]
                [WORK_LOCATION:2:2]
                [BUILD_LABOR:SOAP_MAKER]
                [BUILD_KEY:CUSTOM_SHIFT_S]
                [BLOCK:1:0:0:1]
                [BLOCK:2:0:0:1]
                [BLOCK:3:0:0:0]
                [TILE:0:1:' ':' ':150]
                [TILE:0:2:' ':' ':'/']
                [TILE:0:3:'-':' ':' ']
                [COLOR:0:1:0:0:0:0:0:0:6:0:0]
                [COLOR:0:2:0:0:0:0:0:0:6:0:0]
                [COLOR:0:3:6:0:0:0:0:0:0:0:0]
                [TILE:1:1:' ':' ':'=']
                [TILE:1:2:'-':' ':8]
                [TILE:1:3:' ':' ':150]
                [COLOR:1:1:0:0:0:0:0:0:6:0:0]
                [COLOR:1:2:6:0:0:0:0:0:6:0:0]
                [COLOR:1:3:0:0:0:0:0:0:6:0:0]
                [TILE:2:1:'-':' ':8]
                [TILE:2:2:' ':' ':8]
                [TILE:2:3:' ':150:' ']
                [COLOR:2:1:6:0:0:0:0:0:6:0:0]
                [COLOR:2:2:0:0:0:0:0:0:6:0:0]
                [COLOR:2:3:0:0:0:6:0:0:0:0:0]
                [TILE:3:1:150:' ':8]
                [TILE:3:2:' ':' ':8]
                [TILE:3:3:' ':240:' ']
                [COLOR:3:1:6:0:0:0:0:0:6:7:0]
                [COLOR:3:2:0:0:0:0:0:0:6:7:0]
                [COLOR:3:3:0:0:0:7:0:1:0:0:0]
                [BUILD_ITEM:1:BUCKET:NONE:NONE:NONE]
                    [EMPTY]
                    [CAN_USE_ARTIFACT]
                [BUILD_ITEM:1:NONE:NONE:NONE:NONE]
                    [BUILDMAT]
                    [WORTHLESS_STONE_ONLY]
                    [CAN_USE_ARTIFACT]

            [BUILDING_FURNACE:FINISHING_FORGE]
                [NAME:Finishing Forge]
                [NAME_COLOR:7:0:1]
                [BUILD_LABOR:ARCHITECT]
                [BUILD_KEY:CUSTOM_F]
                [DIM:3:3]
                [WORK_LOCATION:2:2]
                [BLOCK:1:0:0:0]
                [BLOCK:2:0:0:0]
                [BLOCK:3:0:0:0]
                [TILE:0:1:32:7:8]
                [TILE:0:2:32:32:177]
                [TILE:0:3:35:35:177]
                [COLOR:0:1:0:0:1:0:0:1:7:0:0]
                [COLOR:0:2:0:0:1:0:0:1:7:0:0]
                [COLOR:0:3:7:0:1:0:0:1:7:0:1]
                [TILE:1:1:229:61:32]
                [TILE:1:2:45:32:8]
                [TILE:1:3:32:35:177]
                [COLOR:1:1:0:0:1:0:0:1:7:0:0]
                [COLOR:1:2:7:0:1:0:0:1:7:0:0]
                [COLOR:1:3:0:0:1:0:0:1:7:0:1]
                [TILE:2:1:32:240:32]
                [TILE:2:2:229:32:32]
                [TILE:2:3:7:35:177]
                [COLOR:2:1:7:0:1:7:0:0:7:0:0]
                [COLOR:2:2:0:0:1:0:0:1:7:0:0]
                [COLOR:2:3:0:0:1:7:0:1:7:0:1]
                [TILE:3:1:42:240:178]
                [TILE:3:2:43:210:93]
                [TILE:3:3:229:178:178]
                [COLOR:3:1:7:0:1:7:0:0:7:0:0]
                [COLOR:3:2:7:0:0:7:0:0:7:7:0]
                [COLOR:3:3:7:0:0:7:0:0:7:0:0]
                [BUILD_ITEM:1:ANVIL:NONE:NONE:NONE][CAN_USE_ARTIFACT]
            ",
        )
        .add_test_lexer_diagnostics_codes(vec![])
        .add_test_lexer_diagnostics_ranges(vec![]),
    )
    .add_test_structure(DFRaw {
        header: "building_custom".to_owned(),
        token_structure: vec![ObjectToken {
            building_tokens: vec![
                BuildingToken::Workshop(BuildingGeneralToken {
                    reference: Some(ReferenceTo::new("SOAP_MAKER".to_owned())),
                    name: Some("Soap Maker\'s Workshop".to_owned()),
                    name_color: Some((7, 0, 1)),
                    dim: Some((Clamp::new(3), Clamp::new(3))),
                    work_location: Some((Clamp::new(2), Clamp::new(2))),
                    build_labor: vec![LaborEnum::SoapMaking],
                    build_key: Some(KeyBindEnum::CustomShiftS),
                    block: vec![
                        (1, false, vec![false, true]),
                        (2, false, vec![false, true]),
                        (3, false, vec![false, false]),
                    ],
                    tile: vec![
                        (
                            Clamp::new(0),
                            1,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('รป')],
                        ),
                        (
                            Clamp::new(0),
                            2,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('/')],
                        ),
                        (
                            Clamp::new(0),
                            3,
                            DFChar('-'),
                            vec![DFChar(' '), DFChar(' ')],
                        ),
                        (
                            Clamp::new(1),
                            1,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('=')],
                        ),
                        (
                            Clamp::new(1),
                            2,
                            DFChar('-'),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(1),
                            3,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('รป')],
                        ),
                        (
                            Clamp::new(2),
                            1,
                            DFChar('-'),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(2),
                            2,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(2),
                            3,
                            DFChar(' '),
                            vec![DFChar('รป'), DFChar(' ')],
                        ),
                        (
                            Clamp::new(3),
                            1,
                            DFChar('รป'),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(3),
                            2,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(3),
                            3,
                            DFChar(' '),
                            vec![DFChar('โ‰ก'), DFChar(' ')],
                        ),
                    ],
                    color: vec![
                        (
                            Clamp::new(0),
                            1,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(0),
                            2,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(0),
                            3,
                            Choose::Choice2((6, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((0, 0, 0))],
                        ),
                        (
                            Clamp::new(1),
                            1,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(1),
                            2,
                            Choose::Choice2((6, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(1),
                            3,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(2),
                            1,
                            Choose::Choice2((6, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(2),
                            2,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 0, 0))],
                        ),
                        (
                            Clamp::new(2),
                            3,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((6, 0, 0)), Choose::Choice2((0, 0, 0))],
                        ),
                        (
                            Clamp::new(3),
                            1,
                            Choose::Choice2((6, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 7, 0))],
                        ),
                        (
                            Clamp::new(3),
                            2,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((0, 0, 0)), Choose::Choice2((6, 7, 0))],
                        ),
                        (
                            Clamp::new(3),
                            3,
                            Choose::Choice2((0, 0, 0)),
                            vec![Choose::Choice2((7, 0, 1)), Choose::Choice2((0, 0, 0))],
                        ),
                    ],
                    build_item: vec![
                        BuildItemToken {
                            build_item: Some((
                                1,
                                ItemReferenceArg {
                                    item_type: Reference("BUCKET".to_owned()),
                                    item_subtype: Choose::Choice1(NoSubtypeEnum::None),
                                },
                                Choose::Choice2((NoneEnum::None, NoneEnum::None)),
                            )),
                            can_use_artifact: Some(()),
                            empty: Some(()),
                            ..Default::default()
                        },
                        BuildItemToken {
                            build_item: Some((
                                1,
                                ItemReferenceArg {
                                    item_type: Reference("NONE".to_owned()),
                                    item_subtype: Choose::Choice1(NoSubtypeEnum::None),
                                },
                                Choose::Choice2((NoneEnum::None, NoneEnum::None)),
                            )),
                            build_material: Some(()),
                            can_use_artifact: Some(()),
                            worthless_stone_only: Some(()),
                            ..Default::default()
                        },
                    ],
                    needs_magma: None,
                }),
                BuildingToken::Furnace(BuildingGeneralToken {
                    reference: Some(ReferenceTo::new("FINISHING_FORGE".to_owned())),
                    name: Some("Finishing Forge".to_owned()),
                    name_color: Some((7, 0, 1)),
                    dim: Some((Clamp::new(3), Clamp::new(3))),
                    work_location: Some((Clamp::new(2), Clamp::new(2))),
                    build_labor: vec![LaborEnum::Architect],
                    build_key: Some(KeyBindEnum::CustomF),
                    block: vec![
                        (1, false, vec![false, false]),
                        (2, false, vec![false, false]),
                        (3, false, vec![false, false]),
                    ],
                    tile: vec![
                        (
                            Clamp::new(0),
                            1,
                            DFChar(' '),
                            vec![DFChar('โ€ข'), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(0),
                            2,
                            DFChar(' '),
                            vec![DFChar(' '), DFChar('โ–’')],
                        ),
                        (
                            Clamp::new(0),
                            3,
                            DFChar('#'),
                            vec![DFChar('#'), DFChar('โ–’')],
                        ),
                        (
                            Clamp::new(1),
                            1,
                            DFChar('ฯƒ'),
                            vec![DFChar('='), DFChar(' ')],
                        ),
                        (
                            Clamp::new(1),
                            2,
                            DFChar('-'),
                            vec![DFChar(' '), DFChar('โ—˜')],
                        ),
                        (
                            Clamp::new(1),
                            3,
                            DFChar(' '),
                            vec![DFChar('#'), DFChar('โ–’')],
                        ),
                        (
                            Clamp::new(2),
                            1,
                            DFChar(' '),
                            vec![DFChar('โ‰ก'), DFChar(' ')],
                        ),
                        (
                            Clamp::new(2),
                            2,
                            DFChar('ฯƒ'),
                            vec![DFChar(' '), DFChar(' ')],
                        ),
                        (
                            Clamp::new(2),
                            3,
                            DFChar('โ€ข'),
                            vec![DFChar('#'), DFChar('โ–’')],
                        ),
                        (
                            Clamp::new(3),
                            1,
                            DFChar('*'),
                            vec![DFChar('โ‰ก'), DFChar('โ–“')],
                        ),
                        (
                            Clamp::new(3),
                            2,
                            DFChar('+'),
                            vec![DFChar('โ•ฅ'), DFChar(']')],
                        ),
                        (
                            Clamp::new(3),
                            3,
                            DFChar('ฯƒ'),
                            vec![DFChar('โ–“'), DFChar('โ–“')],
                        ),
                    ],
                    color: vec![
                        (
                            Clamp::new(0),
                            1,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(0),
                            2,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(0),
                            3,
                            Choose::Choice2((7, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 1))],
                        ),
                        (
                            Clamp::new(1),
                            1,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(1),
                            2,
                            Choose::Choice2((7, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(1),
                            3,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 1))],
                        ),
                        (
                            Clamp::new(2),
                            1,
                            Choose::Choice2((7, 0, 1)),
                            vec![Choose::Choice2((7, 0, 0)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(2),
                            2,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((0, 0, 1)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(2),
                            3,
                            Choose::Choice2((0, 0, 1)),
                            vec![Choose::Choice2((7, 0, 1)), Choose::Choice2((7, 0, 1))],
                        ),
                        (
                            Clamp::new(3),
                            1,
                            Choose::Choice2((7, 0, 1)),
                            vec![Choose::Choice2((7, 0, 0)), Choose::Choice2((7, 0, 0))],
                        ),
                        (
                            Clamp::new(3),
                            2,
                            Choose::Choice2((7, 0, 0)),
                            vec![Choose::Choice2((7, 0, 0)), Choose::Choice2((7, 7, 0))],
                        ),
                        (
                            Clamp::new(3),
                            3,
                            Choose::Choice2((7, 0, 0)),
                            vec![Choose::Choice2((7, 0, 0)), Choose::Choice2((7, 0, 0))],
                        ),
                    ],
                    build_item: vec![BuildItemToken {
                        build_item: Some((
                            1,
                            ItemReferenceArg {
                                item_type: Reference("ANVIL".to_owned()),
                                item_subtype: Choose::Choice1(NoSubtypeEnum::None),
                            },
                            Choose::Choice2((NoneEnum::None, NoneEnum::None)),
                        )),
                        can_use_artifact: Some(()),
                        ..Default::default()
                    }],
                    needs_magma: None,
                }),
            ],
            ..Default::default()
        }],
    })
    // TODO: This alias warning should not be there
    .add_test_syntax_diagnostics_codes(vec!["alias"])
    .add_test_syntax_diagnostics_ranges(vec![Range {
        start: Position {
            line: 46,
            character: 13,
        },
        end: Position {
            line: 46,
            character: 29,
        },
    }])
    .run_test();
}