1<?php declare(strict_types=1);
2
3namespace PhpParser\Node\Stmt;
4
5use PhpParser\Modifiers;
6use PhpParser\Node;
7
8class ClassConst extends Node\Stmt {
9    /** @var int Modifiers */
10    public int $flags;
11    /** @var Node\Const_[] Constant declarations */
12    public array $consts;
13    /** @var Node\AttributeGroup[] PHP attribute groups */
14    public array $attrGroups;
15    /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */
16    public ?Node $type;
17
18    /**
19     * Constructs a class const list node.
20     *
21     * @param Node\Const_[] $consts Constant declarations
22     * @param int $flags Modifiers
23     * @param array<string, mixed> $attributes Additional attributes
24     * @param list<Node\AttributeGroup> $attrGroups PHP attribute groups
25     * @param null|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration
26     */
27    public function __construct(
28        array $consts,
29        int $flags = 0,
30        array $attributes = [],
31        array $attrGroups = [],
32        ?Node $type = null
33    ) {
34        $this->attributes = $attributes;
35        $this->flags = $flags;
36        $this->consts = $consts;
37        $this->attrGroups = $attrGroups;
38        $this->type = $type;
39    }
40
41    public function getSubNodeNames(): array {
42        return ['attrGroups', 'flags', 'type', 'consts'];
43    }
44
45    /**
46     * Whether constant is explicitly or implicitly public.
47     */
48    public function isPublic(): bool {
49        return ($this->flags & Modifiers::PUBLIC) !== 0
50            || ($this->flags & Modifiers::VISIBILITY_MASK) === 0;
51    }
52
53    /**
54     * Whether constant is protected.
55     */
56    public function isProtected(): bool {
57        return (bool) ($this->flags & Modifiers::PROTECTED);
58    }
59
60    /**
61     * Whether constant is private.
62     */
63    public function isPrivate(): bool {
64        return (bool) ($this->flags & Modifiers::PRIVATE);
65    }
66
67    /**
68     * Whether constant is final.
69     */
70    public function isFinal(): bool {
71        return (bool) ($this->flags & Modifiers::FINAL);
72    }
73
74    public function getType(): string {
75        return 'Stmt_ClassConst';
76    }
77}
78