Skip to content
← Back

src/syntax/parsers/modifiers/list.ghul

1
namespace Syntax.Parsers.Modifiers is
2
3
use Source
4
5
class LIST(modifier_parser: Parser[Trees.Modifiers.Modifier]): Base[Trees.Modifiers.LIST] is
6
super()
7
8
parse(context: CONTEXT) -> Trees.Modifiers.LIST is
9
let start = context.location
10
let end mut = context.location
11
let access_modifier: Trees.Modifiers.AccessModifier? mut = null
12
let storage_class: Trees.Modifiers.StorageClass? mut = null
13
let is_abstract mut = false
14
let is_pure mut = false
15
let is_stable mut = false
16
17
while true do
18
// A modifier attaches on the declaration's own line: a
19
// line-start `init`, `public`, `static`, ... is the next
20
// member, not a wrapped modifier.
21
if context.current.first_on_line then
22
break
23
fi
24
25
let modifier = modifier_parser.parse(context)
26
27
if !modifier? then
28
break
29
fi
30
31
end = modifier.location
32
33
if isa Trees.Modifiers.AccessModifier(modifier) then
34
if access_modifier? then
35
context.error(modifier.location, "duplicate access modifier", access_modifier.location, "first written here")
36
else
37
access_modifier = modifier
38
fi
39
elif modifier.is_abstract then
40
is_abstract = true
41
elif modifier.is_pure then
42
is_pure = true
43
elif modifier.is_stable then
44
is_stable = true
45
elif isa Trees.Modifiers.StorageClass(modifier) then
46
if storage_class? then
47
context.error(modifier.location, "duplicate storage class modifier", storage_class.location, "first written here")
48
else
49
storage_class = modifier
50
fi
51
else
52
context.error(modifier.location, "unexpected modifier {modifier}")
53
fi
54
od
55
56
let result = Trees.Modifiers.LIST(start::end, access_modifier, storage_class)
57
result.is_abstract = is_abstract
58
result.is_pure = is_pure
59
result.is_stable = is_stable
60
return result
61
si
62
si
63
si