/ compiler / ast / src / statement / const_.rs
const_.rs
 1  // Copyright (C) 2019-2025 ADnet Contributors
 2  // This file is part of the ADL library.
 3  
 4  // The ADL library is free software: you can redistribute it and/or modify
 5  // it under the terms of the GNU General Public License as published by
 6  // the Free Software Foundation, either version 3 of the License, or
 7  // (at your option) any later version.
 8  
 9  // The ADL library is distributed in the hope that it will be useful,
10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  // GNU General Public License for more details.
13  
14  // You should have received a copy of the GNU General Public License
15  // along with the ADL library. If not, see <https://www.gnu.org/licenses/>.
16  
17  use crate::{Expression, Identifier, Node, NodeID, Statement, Type};
18  use adl_span::Span;
19  
20  use serde::{Deserialize, Serialize};
21  use std::fmt;
22  
23  /// A constant declaration statement.
24  #[derive(Clone, Default, PartialEq, Eq, Serialize, Deserialize, Debug)]
25  pub struct ConstDeclaration {
26      /// The place to assign to. As opposed to `DefinitionStatement`, this can only be an identifier
27      pub place: Identifier,
28      /// The type of the binding, if specified, or inferred otherwise.
29      pub type_: Type,
30      /// An initializer value for the binding.
31      pub value: Expression,
32      /// The span excluding the semicolon.
33      pub span: Span,
34      /// The ID of the node.
35      pub id: NodeID,
36  }
37  
38  impl fmt::Display for ConstDeclaration {
39      fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
40          write!(f, "const {}: {} = {}", self.place, self.type_, self.value)
41      }
42  }
43  
44  impl From<ConstDeclaration> for Statement {
45      fn from(value: ConstDeclaration) -> Self {
46          Statement::Const(value)
47      }
48  }
49  
50  crate::simple_node_impl!(ConstDeclaration);